2016/07/18

Spring AOP proxy-target-class 설정

Spring 설정 시에 aop 설정과 그 외에 별도로 aop에 적용시켜야 할 설정에
proxy-target-class 옵션이 있는데,
저 설정은 프록시 대상이 되는 항목이 클래스냐 인터페이스냐 하는 옵션이다.

기본적으로 스프링은 DI를 위해 Strategy pattern을 사용하는 만큼 가능한한 인터페이스를 작성하는 것이 기본 철학이다.
그럼에도 불구하고 인터페이스 파일 작성이 귀찮아서 혹은 레거시 코드 자체에 손을 댈 수 없는 없어서
클래스에 직접 AOP를 적용시켜야 할 때가 있는데
그 때를 위한 옵션이 바로 proxy-target-class 옵션이다.
한마디로 프록시 객체를 만들어야 하는데 만들기 위해서 상속받아야 하는 대상이 클래스 맞음? 하는 질문.

프록시 자체가 상속을 통해서 생성되므로 상속을 할 수 있는 객체여야하고(not final),
상속을 하는 만큼 생성자가 중복해서 호출이 발생하므로 생성자에서 자원을 할당하는 경우는 피해야하며,
프록시 대상이 된 클래스의 public 메소드는 모두 포인트컷 대상이 되므로,
트랜잭션의 경우 포인트컷을 꼼꼼하게 작성하지 않으면 DB 접근할 필요가 없는 메소드도 트랜잭션에 포함이 될 수 있다.
애초 클래스 설계 자체를 잘 해야하긴 하지만 행여나 리소스나 시간을 많이 잡아먹는 메소드가 섞여있을 경우엔
트랜잭션이 늘어지는 상황이 발생할 수 있으니 조심해야한다.

  • [Spring 3 - Transaction] 프록시 모드 - 인터페이스와 클래스