프록시 객체 생성 방식 설정
앞서 이 글에서 프록시 객체를 생성할 때 대상 객체가 인터페이스를 구현하고 있다면 프록시 객체는 동일한 인터페이스를 구현한 객체가 생성된다고 언급하였다. 이는 클라이언트에서 인터페이스를 통해 메서드를 호출하는 경우에는 문제가 되지 않는다. 하지만 인터페이스가 아닌 대상 객체를 직접 이용하는 경우에는 문제가 발생한다. 다음 코드를 보자.
public class MemberServiceLocator {
// MemberServiceImpl은 MemberService 인터페이스를 상속
private MemberServiceImpl memberService;
public MemberServiceImpl getMemberService() {
return memberService;
}
public void setMemberService(MemberServiceImpl memberService) {
this.memberService = memberService;
}
}
이때 MemberServiceImpl 객체에 AOP가 적용된다면 MemberServiceImpl 객체는 MemberService 인터페이스를 상속받고 있으므로 MemberService 인터페이스를 이용해서 AOP 프록시 객체를 만들게 된다. 문제는 MemberServiceLocator의 memberService 프로퍼티 타입이 MemberServiceImpl이라는 것이다. AOP 프록시 객체와 MemberServiceImpl 객체는 MemberService 인터페이스를 각각 상속받아 구현한 다른 타입이기 때문에 AOP 프록시 객체를 MemberServiceImpl 타입인 프로퍼티에 할당하면 타입 변환을 할 수 없다는 익셉션이 발생하게 된다.
MemberServiceLocator가 클래스 타입이 아닌 인터페이스 타입을 사용하도록 변경하면 문제를 해결할 수 있지만, MemberServiceImpl 클래스를 무조건 사용해야 한다면, 인터페이스가 아닌 클래스를 기준으로 프록시를 생성하도록 설정해주어야 한다. 설정 방법은 다음과 같다.
<aop:config proxy-target-class="true">
<aop:aspectj-autoproxy proxy-target-class="true">
@EnableAspectJAutoProxy(proxyTargetClass=true)
각 설정 방식에서 프록시 대상을 클래스로 사용할지 여부를 true로 지정해주면 실제 생성되는 프록시는 인터페이스가 아닌 클래스를 상속받아 생성된다.
Reference
- 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)
'Spring' 카테고리의 다른 글
| [Spring] 스프링 MVC(1) - 기본 흐름과 구성 요소 (0) | 2022.03.12 |
|---|---|
| [Spring] 스프링 AOP(7) - AspectJ 표현식 (0) | 2022.02.20 |
| [Spring] 스프링 AOP(5) - JoinPoint (0) | 2022.02.19 |
| [Spring] 스프링 AOP(4) - @Pointcut 어노테이션 (0) | 2022.02.19 |
| [Spring] 스프링 AOP(3) - @Aspect 기반 (0) | 2022.02.19 |