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:31

1. 동시성 문제


  • 사실 이 문제는 동시성 문제이다.
  • FieldLogTrace 는 싱글톤으로 등록된 스프링 빈이다.
  • 이 객체의 인스턴스가 애플리케이션에 딱 1 존재한다.
  • 이렇게 하나만 있는 인스턴스의 FieldLogTrace.traceIdHolder 필드를
  • 여러 쓰레드가 동시에 접근하기 때문에 문제가 발생한다.
  • 실무에서 한번 나타나면 개발자를 가장 괴롭히는 문제도 바로 이러한 동시성 문제이다.
  • 아래 예시와 같이 동시성 문제를 발생시켜보았다.
    • traceId는 같은데 여러 Thread에서 접근했다.
    • 하나의 객체(싱글톤)에 여러 thread가 접근했다.. 
[nio-8080-exec-5] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |-->OrderController.request()
[nio-8080-exec-5] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderService.orderItem()
[nio-8080-exec-5] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderRepository.save()
[nio-8080-exec-5] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |<--OrderRepository.save() time=1013ms
[nio-8080-exec-5] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |<--OrderService.orderItem() time=1013ms
[nio-8080-exec-5] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |<--OrderController.request() time=1013ms
[nio-8080-exec-6] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderController.request()
[nio-8080-exec-6] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderService.orderItem()
[nio-8080-exec-6] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderRepository.save()
[nio-8080-exec-7] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderController.request()
[nio-8080-exec-7] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderService.orderItem()
[nio-8080-exec-7] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |-->OrderRepository.save()
[nio-8080-exec-6] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |<--OrderRepository.save() time=1006ms
[nio-8080-exec-6] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |<--OrderService.orderItem() time=1006ms
[nio-8080-exec-6] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |<--OrderController.request() time=1006ms
[nio-8080-exec-7] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |<--OrderRepository.save() time=1022ms
[nio-8080-exec-7] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |<--OrderService.orderItem() time=1023ms
[nio-8080-exec-7] h.advanced.trace.logtrace.FieldLogTrace  : [9a3bac90] |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |

'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글

Thread Local - 소개  (0) 2021.11.22
동시성 문제 - 예제 코드  (0) 2021.11.22
필드 동기화 - 적용  (0) 2021.11.20
필드 동기화 - 개발  (0) 2021.11.20
로그 추적기 V2 - 적용  (0) 2021.11.20
Comments