일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- JPQL
- 스프링 핵심 원리
- 자바
- jpa
- JDBC
- 스프링 핵심 기능
- Spring Boot
- Android
- spring
- java
- http
- Servlet
- 알고리즘
- db
- Proxy
- SpringBoot
- pointcut
- transaction
- Thymeleaf
- 김영한
- 인프런
- AOP
- 스프링
- springdatajpa
- kotlin
- QueryDSL
- 그리디
- Greedy
- Exception
- 백준
- Today
- Total
목록인프런/[인프런] 스프링 핵심 원리 - 고급 (105)
개발자되기 프로젝트
1. Template Method - 예제1 @Slf4j public class TemplateMethodTest { @Test void templateMethodV0(){ logic1(); logic2(); } /** * 시간을 찍는 로직과, 비즈니스 로직이 섞여있음. */ private void logic1(){ long startTime = System.currentTimeMillis(); //비즈니스 로직 시행 log.info("비즈니스 로직1 실행"); //비즈니스 로직 종료 long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.info("resultTime = {}", resultTime); }..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bkqN9w/btrlKfpFrxR/FRxjoQKCZKyfhcurmThWl0/img.png)
하위 클래스 위임 - Template Method 1. Template Method Pattern?? 상위 클래스에서는 전체적인 흐름을 구현하고 구체적인 처리는 하위 클래스에 위임. 2. 의도와 동기 Operation에 알고리즘의 기본 골격 구조를 정의하고, 구체적인 단계는 서 bsh-developer.tistory.com 1. 로그 추적기 전후 비교. 로그 추적기 도입 전 //OrderControllerV0 코드 @GetMapping("/v0/request") public String request(String itemId) { orderService.orderItem(itemId); return "ok"; } //OrderServiceV0 코드 public void orderItem(String it..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bc5zQG/btrlTlB3ZyR/ckaJhTZTZrhsWpqKVUoCv1/img.png)
1. Thread Lcoal 주의사항 Thread Local의 값을 사용 후 제거하지 않으면, WAS처럼 Thread Pool을 사용하는 경우에 문제가 발생할 수 있다. 2. 예시 사용자A가 저장 HTTP를 요청했다. WAS는 쓰레드 풀에서 쓰레드를 하나 조회한다. 쓰레드 thread-A 가 할당되었다. thread-A 는 사용자A 의 데이터를 쓰레드 로컬에 저장한다. 쓰레드 로컬의 thread-A 전용 보관소에 사용자A 데이터를 보관한다. 사용자A의 HTTP 응답이 끝난다. WAS는 사용이 끝난 thread-A 를 쓰레드 풀에 반환한다. 쓰레드를 생성하는 비용은 비싸기 때문에 쓰레드를 제거하지 않고, 보통 쓰레드 풀을 통해서 쓰레드를 재사용한다. thread-A 는 쓰레드풀에 아직 살아있다. 따라서 쓰..
1. Configuration 변경 동시성 문제가 있는 FieldLogTrace 대신에 ThreadLocalLogTrace 를 스프링 빈으로 등록하자. Configuration을 제외하고 코드 변경 없이 구현을 변경할 수 있다. - 다형성, ocp 준수! @Configuration public class LogTraceConfig { @Bean public LogTrace logTrace(){ return new ThreadLocalLogTrace(); } } 2. 실행 결과 동시성 문제가 발생하도록 요청을 여러 번 보낸다. 이 전과는 다르게 level이 누적되지 않고, traceId가 중복으로 사용되지 않는다. [io-8080-exec-10] : [d278b1ae] OrderController.requ..
FieldLogTrace 에서 발생했던 동시성 문제를 ThreadLocal 로 해결해보자. TraceId traceIdHolder 필드를 쓰레드 로컬을 사용하도록 ThreadLocal traceIdHolder로 변경 필드 대신에 쓰레드 로컬을 사용해서 데이터를 동기화하는 ThreadLocalLogTrace 를 새로 만들자. 1. ThreadLocalLogTrace 기존 TraceId traceIdHolder를 ThreadLocal traceHolder로 변경하였다. @Slf4j public class ThreadLocalLogTrace implements LogTrace{ private static final String START_PREFIX = "-->"; private static final Str..
1. ThreadLocal 사용법 값 저장: ThreadLocal.set(xxx) 값 조회: ThreadLocal.get() 값 제거: ThreadLocal.remove() 해당 쓰레드가 쓰레드 로컬을 모두 사용하고 나면 ThreadLocal.remove() 를 호출해서 쓰레드 로컬에 저장된 값을 제거해주어야 한다. 2. ThreadLocalService @Slf4j public class ThreadLocalService { private ThreadLocal nameStore = new ThreadLocal(); public String logic(String name){ log.info("저장 name={} --> nameStore={}", name, nameStore.get()); nameStor..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bpk6PB/btrlS2h9XdM/HAKwTebYLS9naajpgO9Lr1/img.png)
1. Thread Local??? 쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다. 쉽게 이야기해서 물건 보관 창구를 떠올리면 된다. 여러 사람이 같은 물건 보관 창구를 사용하더라도 창구 직원은 사용자를 인식해서 사용자별로 확실하게 물건을 구분해준다. 사용자A, 사용자B 모두 창구 직원을 통해서 물건을 보관하고, 꺼내지만 창구 지원이 사용자에 따라 보관한 물건을 구분해주는 것이다. 2. 일반적인 변수 필드 여러 Thread가 같은 인스턴스의 필드에 접근하면 처음 쓰레드가 보관한 데이터는 사라질 수 있다. ThreadB가 저정하면 ThreadA가 저장한 데이터는 사라짐 ㄷㄷ 3. Thread Local Thread Local을 사용하면 각 Thread마다 별도의 내부 저장소를 제공한다...
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cc1HwL/btrlSwX1PjZ/FPC7k2bqwoIbL68kDKYyG0/img.png)
1. Test에서 lombok 사용 dependancies에 추가. //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' 2. FieldService FieldService는 logic() 메서드를 제공한다. name을 받으면 name sotre에 저장 후 값을 반환한다. name sotre에 저장하는데 1초가 걸린다고 가정. @Slf4j public class FieldService { private String nameStore; public String logic(String name){ log.info("저장 name={} --> nameStore={}..