해결된 질문
작성
·
109
·
수정됨
0
스프링 빈으로 등록하여 사용하지 않는 예를 들어 유틸성 클래스 혹은 직접 인스턴스를 생성하여 사용하는 클래스 등의 경우 LogTrace를 적용시키는 요구사항을 어떻게 만족시킬 수 있을까요?
지금까지 배운 방법은 사용하는 클래스를 빈으로 등록하여서 Proxy로 바꿔치기 하는 방법인데 그렇다면 LogTrace를 적용하고 싶은 모든 클래스를 빈으로 등록해주어야 하나요?
답변 3
1
안녕하세요. nove1080님
질문의 핵심이 스프링 컨테이너나 빈을 사용하지 않고, static 메서드 같은 곳까지 모두 LogTrace를 적용하고 싶다는 내용으로 이해했습니다.
이 문제를 스프링 컨테이너나 빈 없이 해결하려면 다른 차원의 방법이 필요합니다.
예를 들어서 컴파일 시점에 코드를 끼워넣거나, 아니면 자바 바이트 코드를 로드하는 시점에 특정 코드를 끼워넣어야 합니다.
다음 키워드를 검색해보시면 도움이 되실거에요.
java bytecode instrumentation
aspectJ Compile time
감사합니다.
1
만약 저라면 클라이언트에서 해당 객체의 메서드 호출이 발생했을 때, 직접 프록시 객체를 생성할 것 같습니다.
해당 객체의 팩토리 객체를 만들고 그 안에서는 직접 동적 프록시 기술(리플렉션, JDK 동적 프록시, CGLIB)을 사용하거나, 스프링이 제공하는 ProxyFactory
를 통해서 프록시 객체를 생성하고 Advisor
도 직접 만들어 등록하는 식으로 구현할 것 같습니다.
static 클래스의 경우 영한님께서 말씀해 주신 방법을 사용할 것 같습니다!
1
안녕하세요, 인프런 AI 인턴입니다.
nove1080님의 질문에 대한 대답으로는, 유틸성 클래스나 직접 인스턴스를 생성하여 사용하는 클래스에 대해서 LogTrace를 적용하는 방법 중 하나로 CustomizableTraceInterceptor
를 활용하는 방법을 제안드릴 수 있습니다. CustomizableTraceInterceptor
는 Spring에서 제공하는 기능으로, 메소드 호출에 대한 상세한 로깅 정보를 제공하도록 설정할 수 있습니다. 예를 들어 JpaRepository
같은 Spring Data JPA의 리포지토리 인터페이스에 대한 메소드 호출 시, 호출되는 메소드 이름과 인수, 반환값 등을 로깅할 수 있습니다.
이 기능을 사용하기 위해서는 다음과 같이 CustomizableTraceInterceptor
빈을 명시하고, AOP 설정을 통해 관련 메소드 실행 시 이 인터셉터를 적용하는 방식으로 구현할 수 있습니다.
<bean id="customizableTraceInterceptor" class="
org.springframework.aop.interceptor.CustomizableTraceInterceptor">
<property name="enterMessage" value="Entering $[methodName]($[arguments])"/>
<property name="exitMessage" value="Leaving $[methodName](): $[returnValue]"/>
</bean>
<aop:config>
<aop:advisor advice-ref="customizableTraceInterceptor"
pointcut="execution(public * org.springframework.data.jpa.repository.JpaRepository+.*(..))"/>
</aop:config>
위와 같은 설정을 통해, 유틸성 클래스나 직접 생성한 인스턴스가 아닌, Spring에서 관리하는 Bean에 대한 메소드 호출시 상세 로깅을 적용할 수 있습니다. 유틸성 클래스 또는 직접 인스턴스를 생성하여 사용하는 클래스에 LogTrace를 적용하기 위해서는, 이들 클래스를 Spring Bean으로 등록하거나, 다른 방식으로 AOP를 적용할 방법을 고려해야 합니다.
도움이 되었길 바랍니다.