실무에서 배운 내용 정리
-
SpringBootServletInitializer 란 무엇이고 왜 상속받고 있는가?실무에서 배운 내용 정리 2020. 8. 14. 01:22
주제 선정 이유 아래 소스는, 현재 담당하고 있는 서비스의 코드를 그대로 가져온 것이다. @SpringBootApplication public class SuperApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SuperApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SuperApplication.class); } } 기존에 봤었던 코..
-
Redis실무에서 배운 내용 정리 2019. 8. 9. 23:54
Redis - in memory 데이터 저장소 (key-value형태의 데이터) - 싱글 스레드 (1번에 1개의 명령어만 처리) => 여러 문제의 원인이 됨 https://www.zdnet.co.kr/view/?no=20131119174125 - 초당 10만~15만 get/set 가능 Redis의 자료구조 (Data Structure) - key-value 형태 - Bucket을 이용한 Chanined Linked List 구조로 되어 있음 - 같은 Bucket에 들어가는 key들은 링크드 리스트로 연결됨 why 사용? - 여러 데이터 타입 지원 (value 값으로 String, List, Set, Sorted Set, Hash 타입 지원) – List 형태의 데이터 입력과 삭제가 MySQL에 비하여 1..
-
Guava Cache 란 [1편]실무에서 배운 내용 정리 2018. 12. 24. 08:52
캐시를 사용하는 이유응답 속도 향상 어떤 데이터를 캐시 할까? 1. 자주 사용하면서도 변경이 자주 일어나지 않는 데이터 (즉 읽기는 많지만 쓰기는 적은 데이터) => 변경이 자주 일어나게 되면 DB와 동기화 시키기 위해 캐시와 DB간의 트랜잭션이 자주 발생하여 오히려 성능 저하가 발생 2. 크기가 너무 크지 않은 데이터=> 크기가 너무 크다면 메모리를 많이 소모하게 되서 애플리케이션의 메모리 성능에 악영향을 미칠 수 있음 Guava Cache 란Google의 Guava Cache는 캐시를 쉽게 사용할 수 있도록 다양한 기능을 제공하는 오픈 소스 라이브러리간단한 코드를 통해 캐시 크기, 캐시 시간, 데이터 로딩 방법, 데이터 Refresh 방법 등을 제어할 수 있음* Goolge Guava 는 Apache..
-
상속보다 구성을 이용한 재사용 [1편]실무에서 배운 내용 정리 2018. 12. 21. 05:24
상속보다 구성을 이용하자 => 장점 : 클래스 수를 줄일 수 있음 => 주니어, 시니어 별로 연봉을 계산해주는 연봉 계산기가 있다. 그런데 여기에는 문제가 하나 존재한다. 만약 중간 급을 위한 연봉 계산기가 추가된다면 클래스 수가 증가하기 때문이다.이것은 자바에서 상속을 사용하면 어쩔 수 없이 발생하는 부분이다. 클래스 다이어그램은 다음과 같다. 그럼 직급이 추가될 때마다 클래스 수가 증가하는 부분은 어쩔 수 없는 부분일까?=> 결론부터 말하면, 해결할 수 있다. [2편을 기대해주세요.] 그 전에 왜 이러한 구조가 나왔냐하면, => API를 사용하는 쪽에서는 AbstractSalaryCalculator#public int paySalary(int career)만 사용하면 연봉을 계산해주도록 만들고 싶었기..
-
실행 계획실무에서 배운 내용 정리 2018. 12. 19. 00:20
실행 계획 DB의 두뇌라고 할 수 있는 옵티마이저가 해당 쿼리를 수행할 때, 수행되는 일련의 동작 순서를 트리 형식으로 보여줌 => 이를 통해 쿼리문의 성능을 짐작할 수 있음 특징1. 실제로 실행되는 것이 아니라, 어떻게 실행 되는지를 보여줌2. 실행 계획은 완벽하지 않음 => 따라서 실행 계획을 볼 줄 알아야하고 변경할 줄 알아야함3. 실행계획은 다음과 같은 정보를 포함하고 있음1) 쿼리문이 참조한 테이블들의 순서2) 쿼리문이 참조한 테이블들의 접근방법(ACESS PATH)3) 조인에 의해 영향받는 테이블들의 조인방법(JOIN MEHTOD)4) 데이터 조작방법(filter, sort, or aggregation,etc)4. 실행계획은 개발자가 다음과 같은 피해야하는 항목(=나쁜 냄새)들을 미리 파악할 ..
-
Clustered Index & Non-Clustered Index 차이실무에서 배운 내용 정리 2018. 12. 17. 23:31
인덱스 종류에는 2가지가 있다. 1. Clustered 인덱스2. Non-Clustered 인덱스 Clustered 인덱스란1. 테이블의 데이터를 지정된 컬럼에 대해 물리적으로 재배열=> 데이터 삽입, 수정, 삭제시 테이블의 데이터를 정렬 시킴2. 테이블 당 한개만 존재3. 테이블에서 인덱스를 걸면 가장 효율적일거 같은 컬럼을 Clustered 인덱스로 지정4. 테이블에 데이터가 많이 저장된 상태에서 ALTER를 통해 Clustered 인덱스를 추가한다면, 많은 데이터를 정렬해야 해서 많은 리소스를 차지하게 됨따라서 사용자가 많은 시간에는 함부로 Clustered 인덱스를 추가하면 안된다. 책으로 비유하자면 페이지를 알고 있어서 바로 해당 페이지를 펼치는 것과 같음 Non-Clustered 인덱스란1. ..
-
프록시 객체를 만드는 2가지 방법실무에서 배운 내용 정리 2018. 12. 12. 23:59
스프링에서는 클래스가 인터페이스를 구현했다면 다이내믹 프록시 기술로 프록시 객체를 만들고, 인터페이스를 구현하지 않았다면 CGLIB 기술을 이용해서 프록시 객체를 생성한다. 프록시 객체를 만드는 2가지 방법1. 클래스에 인터페이스를 구현한 경우 => '다이내믹 프록시' 기술을 사용 (자바의 리플렉션 이용)2. 클래스에 인터페이스를 구현 안한 경우 => 'CGLIB' 기술을 사용 (바이트 코드 조작) 하지만 프록시 객체를 만들 때 CGLIB을 사용하게 되면 아래 2가지 제약사항이 생기게 된다. 1. @Bean 메서드에 final을 붙이면 안된다.2. 클래스에 final을 붙이면 안된다. 위의 제약 사항을 지키지 않는다면, 에러가 발생한다. 하지만 다이내믹 프록시를 사용할 경우에는 final을 붙여도 상관없..