티스토리 뷰

Spring에서는 @Component(@Controller, @Service, @Repository)을 이용하여 Bean을 생성할 수 있는데 이때 해당 클래스 내부의 메서드에 Proxy 기반으로 동작하는 어노테이션이 존재할 경우 target class 타입의 Bean이 아닌 Proxy로 래핑된 Bean이 생성된다.

 

@Transactional, @Async, @Cacheable 등 이런 어노테이션들은 런타임 시 target class를 Proxy가 래핑하여 로직을 처리하는데 사용 시 주의할 점이 있다. 한번 살펴보자

Proxy Bean 생성

@Service 어노테이션으로 Bean을 생성 후 @Async 어노테이션으로 Future타입의 결과값을 반환하는 메서드를 선언하였다. 그리고 외부에서 접근이 가능한 String 타입의 필드도 선언하였다.

테스트

테스트가 실패되었다.

테스트코드 두번째라인의 demoService.world의 리턴값이 "world" 라는 String 객체가 아니라 null이 반환된 걸 확인할 수 있다. 대체 왜 Null이 반환되는 걸까? 그 이유는 Spring 공식문서를 통해 확인할 수 있었다.

 

해당내용을 번역해보면 다음과 같습니다.

Spring AOP는 현재 메소드 실행 조인 포인트만 지원합니다(Spring Bean에서 메소드 실행 권장). 
핵심 Spring AOP API를 손상시키지 않고 필드 가로채기에 대한 지원을 추가할 수 있지만 필드 가로채기는 구현되지 않습니다. 
필드 액세스를 조언하고 조인 포인트를 업데이트해야 하는 경우 AspectJ와 같은 언어를 고려하십시오.

 

target class를 Proxy로 래핑해서 Bean을 생성할 경우 그 Proxy는 메서드에 대해서만 적용하고 필드에 대해서는 적용을 하지 않는 것 같다. 필드에 대해서도 작업을 해야할 경우 AspectJ를 적용해야할 것 같다.

 

개인적인 추측이지만 필드가 호출이 되는 이유는 Proxy가 target class를 상속받았기 때문이지만 내부적으로 해당 필드들을 null로 할당하는걸 알 수 있다.

참고

Spring에서 Bean을 생성하기위해 DAO 레이어에 사용되는 @Repository 어노테이션이다. 이 어노테이션은 상황에 따라 Proxy로 래핑된 Bean이 생성될 수 있고 그냥 target class 타입의 Bean이 생성될 수 있다.

 

애플리케이션의 클래스패스에 PersistenceExceptionTranslationPostProcessor.class가 존재할 경우 Proxy로 래핑이 되며 없으면 target class 타입의 Bean이 생성된다.

 

조금 더 자세히 설명드리면

PersistenceExceptionTranslationAutoConfiguration.class

PersistenceExceptionTranslationAutoConfiguration를 확인해보면 다음과 같은 메서드가 정의되어있다. 해당 클래스는 클래스패스에 PersistenceExceptionTranslationPostProcessor.class가 존재해야 활성화 되는 Bean이다.

PersistenceExceptionTranslationPostProcessor.class

해당 클래스는 spring-tx 모듈에 존재하는 패키지이며 spring-boot-starter-jdbc 의존성에도 포함되어있다. Repository 어노테이션과 spring-tx 모듈이 존재하면 @Repository 어노테이션이 선언된 target class를 Proxy로 래핑하여 Bean으로 생성하기 때문에 위에서 @Repository 어노테이션으로 Bean을 생성하고 테스트했을때 실패가 된 것이다.

결론

Spring에서 Bean을 생성 시 해당 Bean이 target class로 생성되지않고 Proxy로 감싸서 생성된 Bean일 경우 외부에서 주입받아서 사용할 때 필드는 주입받아서 사용할 수 없으며 주입을 받고싶을땐 AspectJ를 적용해야한다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함