Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- 스프링 핵심 원리
- 자바
- Android
- Thymeleaf
- 알고리즘
- QueryDSL
- SpringBoot
- kotlin
- transaction
- http
- Exception
- 백준
- Greedy
- AOP
- Spring Boot
- JPQL
- java
- 스프링 핵심 기능
- 김영한
- pointcut
- springdatajpa
- 스프링
- Proxy
- jpa
- 인프런
- spring
- Servlet
- JDBC
- 그리디
- db
Archives
- Today
- Total
개발자되기 프로젝트
필드 동기화 - 적용 본문
1. LogTrace 스프링 빈 등록
- FieldLogTrace가 싱글톤으로 스프링 빈으로 등록됨.
@Configuration
public class LogTraceConfig {
@Bean
public LogTrace logTrace(){
return new FieldLogTrace();
}
}
2. Controller
@RestController //@Controller +@ResponseBody
@RequiredArgsConstructor
public class OrderControllerV3 {
private final OrderServiceV3 orderService;
private final LogTrace trace;
@GetMapping("/v3/request")
public String request(String itemId){
TraceStatus status = null;
try{
status = trace.begin("OrderController.request()");
orderService.orderItem(itemId);
trace.end(status);
return "ok";
}catch (Exception e){
trace.exception(status, e);
throw e; //예외를 반드시 다시 던져줘야 함.
}
}
}
3. Service
@Service
@RequiredArgsConstructor
public class OrderServiceV3 {
private final OrderRepositoryV3 orderRepository;
private final LogTrace trace;
public void orderItem(String itemId){
TraceStatus status = null;
try{
status = trace.begin("OrderService.orderItem()");
orderRepository.save(itemId);
trace.end(status);
}catch (Exception e){
trace.exception(status, e);
throw e; //예외를 반드시 다시 던져줘야 함.
}
}
}
4. Repository
@Repository
@RequiredArgsConstructor
public class OrderRepositoryV3 {
private final LogTrace trace;
public void save(String itemId){
TraceStatus status = null;
try{
status = trace.begin("OrderRepository.save()");
//
if (itemId.equals("ex")){
throw new IllegalStateException("예외 발생");
}
sleep(1000);
//
trace.end(status);
}catch (Exception e){
trace.exception(status, e);
throw e; //예외를 반드시 다시 던져줘야 함.
}
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
5. 실행
- 정상
[eb6909f2] |-->OrderService.orderItem()
[eb6909f2] | |-->OrderRepository.save()
[eb6909f2] | |<--OrderRepository.save() time=1007ms
[eb6909f2] |<--OrderService.orderItem() time=1008ms
[eb6909f2] OrderController.request() time=1010ms
- 예외
[9a3bac90] OrderController.request()
[9a3bac90] |-->OrderService.orderItem()
[9a3bac90] | |-->OrderRepository.save()
[9a3bac90] | |<X-OrderRepository.save() time=0ms ex=java.lang.IllegalStateException: 예외 발생
[9a3bac90] |<X-OrderService.orderItem() time=1ms ex=java.lang.IllegalStateException: 예외 발생
[9a3bac90] OrderController.request() time=2ms ex=java.lang.IllegalStateException: 예외 발생
- 새로고침 계속 누른 경우.
- 동시성 문제 발생.
- 새로 요청을 보냈는데, TraceId가 그대로 유지됨.
- level이 누적됨.
- trace가 종료되지 않은 상태에서 다른 요청에서 trace에 접근하여 생긴 문제 같음.
- Trace가 스프링 빈으로 등록되어 있는데, Trace에 접근하는 경우 다른 곳에서 Trace에 접근하지 못하도록 막아야 할듯..???
[9a3bac90] | | | | | | | | |-->OrderController.request()
[9a3bac90] | | | | | | | | | |-->OrderService.orderItem()
[9a3bac90] | | | | | | | | | | |-->OrderRepository.save()
[9a3bac90] | | | | | | | | | | |<X-OrderRepository.save() time=0ms ex=java.lang.IllegalStateException: 예외 발생
[9a3bac90] | | | | | | | | | |<X-OrderService.orderItem() time=0ms ex=java.lang.IllegalStateException: 예외 발생
[9a3bac90] | | | | | | | | |<X-OrderController.request() time=1ms ex=java.lang.IllegalStateException: 예외 발생
6. GitHub :211120 Filed Synchronization
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
동시성 문제 - 예제 코드 (0) | 2021.11.22 |
---|---|
필드 동기화 - 동시성 문제 (0) | 2021.11.20 |
필드 동기화 - 개발 (0) | 2021.11.20 |
로그 추적기 V2 - 적용 (0) | 2021.11.20 |
로그 추적기 V2 - 파라미터로 동기화 개발 (0) | 2021.11.20 |
Comments