“예제는 크게 3가지 상황으로 만든다”

v1 - 인터페이스와 구현 클래스 (스프링 빈으로 수동 등록)

v2 - 인터페이스 없이 구체 클래스 (스프링 빈으로 수동 등록)

v3 - 컴포넌트 스캔으로 스프링 빈 자동 등록

추가 요구사항

로그 출력 예시

정상 요청
[796bccd9] OrderController.request()
[796bccd9] |-->OrderService.orderItem()
[796bccd9] |  |-->OrderRepository.save()
[796bccd9] |  |<--OrderRepository.save() time=1004ms
[796bccd9] |<--OrderService.orderItem() time=1014ms
[796bccd9] OrderController.request() time=1016ms

예외 발생
[b7119f27] OrderController.request()
[b7119f27] |-->OrderService.orderItem()
[b7119f27] |  |-->OrderRepository.save()
[b7119f27] |  |<X-OrderRepository.save() time=0ms ex=java.lang.IllegalStateException: 예외 발생!
[b7119f27] |<X-OrderService.orderItem() time=10ms ex=java.lang.IllegalStateException: 예외 발생!
[b7119f27] OrderController.request() time=11ms

프록시, 프록시 패턴, 데코레이터 패턴 소개

클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자를 통해서 대신 간접적으로 서버에 요청할 수 있다.