본문 바로가기

Spring/Advanced13

동적 프록시 기술 리플렉션 → 클래스나 메서드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다. ReflectionTest @Slf4j public class ReflectionTest { @Test void reflection0() { Hello target = new Hello(); //공통 로직1 시작 log.info("start"); String result1 = target.callA(); //호출하는 메서드가 다름 log.info("result={}", result1); //공통 로직1 종료 //공통 로직2 시작 log.info("start"); String result2 = target.callB(); //호출하는 메서드가 다름 log.info("result={}", result2); //공통.. 2023. 8. 16.
프록시 패턴과 데코레이터 패턴 요구사항 원본 코드를 전혀 수정하지 않고, 로그 추적기를 적용해라. 특정 메서드는 로그를 출력하지 않는 기능 다음과 같은 다양한 케이스에 적용할 수 있어야 한다. v1 - 인터페이스가 있는 구현 클래스에 적용 v2 - 인터페이스가 없는 구체 클래스에 적용 v3 - 컴포넌트 스캔 대상에 기능 적용 해결 방안 : 프록시(Proxy) 프록시, 프록시 패턴, 데코레이터 패턴 - 소개 ★ 대리자 프록시 도입 접근 제어, 캐싱 부가 기능 추가 프록시 체인 → 클라이언트는 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것인지 조차 몰라야 한다. ★ 런타임(애플리케이션 실행 시점)에 클라이언트 객체에 DI를 사용해서 Client -> Server 에서 Client -> Proxy 로 객체 의존관계를 변경해도 클라이.. 2023. 8. 14.
템플릿 메서드 패턴과 콜백 패턴 로그 추적기 도입 후 //OrderControllerV3 코드 @GetMapping("/v3/request") public String request(String itemId) { TraceStatus status = null; try { status = trace.begin("OrderController.request()"); orderService.orderItem(itemId); //핵심 기능 trace.end(status); } catch (Exception e) { trace.exception(status, e); throw e; } return "ok"; } //OrderServiceV3 코드 public void orderItem(String itemId) { TraceStatus statu.. 2023. 8. 13.
쓰레드 로컬 - ThreadLocal ※문제 : TraceId 를 파라미터로 넘기지 않는 방법? FieldLogTrace @Slf4j public class FieldLogTrace implements LogTrace { private static final String START_PREFIX = "-->"; private static final String COMPLETE_PREFIX = ""; private static final String COMPLETE_PREFIX = " 2023. 8. 12.