Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

필드 동기화 - 적용 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

필드 동기화 - 적용

Seung__ 2021. 11. 20. 14:09

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


 

GitHub - bsh6463/Spring_Advanced: initial

initial. Contribute to bsh6463/Spring_Advanced development by creating an account on GitHub.

github.com

 

Comments