프록시를 이용한 AOP 구현
스프링은 세 가지 방식으로 AOP를 구현할 수 있도록 하고 있다. 어떤 방식을 사용하더라도 내부적으로는 프록시를 이용하여 AOP가 구현되므로 메서드 호출에 대해서만 AOP를 적용할 수 있다.
- XML 스키마 기반의 POJO 클래스를 이용한 AOP 구현
- AspectJ에서 정의한 @Aspect 어노테이션 기반의 AOP 구현
- 스프링 API를 이용한 AOP 구현
스프링은 Aspect의 적용 대상(target)이 되는 객체에 대한 프록시를 만들어 제공하며, 대상 객체에 직접 접근하지 않고 프록시를 통해 간접적으로 접근하게 된다. 스프링 컨테이너를 초기화하는 과정에서 설정 정보에 지정한 빈 객체에 대한 프록시 객체를 생성하고, 원본 빈 객체 대신에 프록시 객체를 사용하도록 한다.
대상 객체가 인터페이스를 구현하고 있다면, 스프링은 자바 리플렉션 API가 제공하는 java.lang.reflect.Proxy를 이용하여 프록시 객체를 생성한다. 이때 생성된 프록시 객체는 아래 그림과 같이 대상 객체와 동일한 인터페이스를 구현하며, 클라이언트는 인터페이스를 통해서 필요한 메서드를 호출하게 된다. 따라서 인터페이스에 정의되어 있지 않은 메서드에 대해서는 AOP가 적용되지 않는다.

대상 객체가 인터페이스를 구현하고 있지 않다면, 스프링은 CGLIB를 이용하여 클래스에 대한 프록시 객체를 생성한다. CGLIB는 대상 클래스를 상속받아 프록시를 구현한다. 따라서, 대상 클래스가 final인 경우 프록시를 생성할 수 없으며, final인 메서드에 대해서는 AOP를 적용할 수 없다.
구현 가능한 Advice 종류
- Before Advice : 대상 객체의 메서드 호출 전에 공통 기능 실행
- After Returning Advice : 대상 객체의 메서드가 익셉션 없이 실행된 이후에 공통 기능 실행
- After Throwing Advice : 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능 실행
- After Advice : 대상 객체의 메서드를 실행하는 도중 익셉션이 발생했는지 여부에 상관없이 공통 기능 실행
- Around Advice : 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능 실행
Reference
- 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)
'Spring' 카테고리의 다른 글
| [Spring] 스프링 AOP(3) - @Aspect 기반 (0) | 2022.02.19 |
|---|---|
| [Spring] 스프링 AOP(2) - XML 기반 (0) | 2022.02.19 |
| [Spring] AOP의 Weaving 방식 (0) | 2022.02.16 |
| [Spring] AOP의 개념 (0) | 2022.02.16 |
| [Spring] ApplicationContextAware, BeanNameAware 인터페이스 (0) | 2022.02.14 |