TIL

관점 지향 프로그래밍 (AOP)는 프로그램 구조에 대한 다른 관점을 제시하며 OOP를 보완한다. OOP에서 핵심 단위가 클래스라면, AOP에서 핵심 단위는 관점(aspect)이다. acpect는 여러 타입과 객체들을 가로지르는 (트랜잭션 관리 같은) 문제의 모듈화를 가능하게 한다. (AOP 문헌에는 이런 문제를 cross-cutting concern, 횡단 관심사라고 부름)

AOP 프레임워크는 스프링의 핵심 구성 중 하나다. 스프링 IoC 컨테이너가 AOP에 의존하지 않는 반면 (원치 않으면 사용할 필요 없다는 의미) AOP는 IoC를 보완하여 매우 유능한 솔루션을 제공한다.

Spring AOP with AspectJ pointcuts 스프링은 schema-based approach나 @AspectJ annotation style을 사용하는 커스텀 aspect를 작성하는 쉽고 강력한 방법을 제공한다.

AOP 사용 예

5.1 AOP Concepts

Advice 타입

around advice는 가장 일반적인 종류의 advice이다. AspectJ와 마찬가지로 Spring AOP는 모든 범위의 advice 유형을 제공하기 때문에 필요한 동작을 구현할 수 있는 가장 강력한 advice 타입을 사용하는 것이 좋다. 예를 들어 캐시를 메서드의 반환 값으로 업데이트하기만 하면 되는 경우 around advice 보다는 after returning advice를 사용하는 것이 낫다. (동일한 작업을 수행하지만) 가장 구체적인 advice 유형을 사용하면 오류 가능성이 적은 간단한 프로그래밍 모델을 제공할 수 있다.

모든 advice 매개변수는 정적으로 입력되므로 Object 배열이 아닌 적절한 유형의 advice 매개변수로 작업할 수 있다.

point cut과 일치하는 join point 개념은 AOP의 핵심이며 이는 인터셉션만 제공하는 이전 기술과 구별된다. point cut은 advice를 갳체 지향 계층과 독립적으로 존재할 수 있게 한다. 예를 들어 선언적 트랜잭션 관리를 around advice를 사용해 서비스 계층의 모든 비즈니스 작업 등 여러 객체에 걸쳐 있는 일련의 메서드에 적용할 수도 있다.

5.3 AOP Proxies

스프링 AOP는 기본적으로 AOP 프록시 표준 JDK 동적 프록시를 사용한다. CGLIB 프록시를 사용할 수도 있는데 이는 인터페이스가 아닌 구체 클래스에도 적용된다. 기본적으로 비즈니스 객체가 인터페이스를 구현하지 않는 경우 CGLIB가 사용된다.

5.8 Proxying Mechanisms

스프링에선 인터페이스 유무에 따라 JDK 프록시를 적용할지, CGLIB 프록시를 적용할지 결정한다. 만약 CGLIB 프록시를 사용하도록 강제하고 싶다면 그렇게 할 수도 있지만 다음의 이슈가 있다.

CGLIB를 사용하도록 강제하기 위해선 proxy-target-class를 true로 바꾸면 된다.