관점 지향 프로그래밍(AOP) 은 여러 유형과 객체에 걸쳐 있는 관심사를 분리하여 모듈성을 높이는 것을 목표로 하는 프로그래밍 패러다임으로써 객체 지향 프로그래밍(OOP)를 보완합니다.
AOP를 활용해서 핵심 로직과 부가 기능을 분리함으로써 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있습니다.
OOP에서 모듈화의 핵심 단위는 클래스이지만 AOP에서의 모듈화의 단위는 Aspect입니다.
스프링에서 제공하는
@Transactional
은 AOP를 활용해서 제공된다!
관련 포스팅: Spring에서 트랜잭션은 어떻게 동작할까?
애플리케이션의 여러 곳에 흩어져 있으며 일반적으로 실제 비즈니스 로직과 다른 표준 코드 / 기능(교차 관심사(crosscutting))을 이야기하며 이를 모듈화 한것입니다. → AOP에서 핵심적으로 활용하고자 하는 모델!
메서드 실행, 예외 처리, 생성자 호출, 필드 할당 등...과 같은 프로그램 실행 중 한 특정 지점을 말한다. → Spring AOP에서 Join Point 는 항상 메서드 실행을 말합니다.
특정 Join Point에서 Aspect가 수행하는 작업을 이야기합니다. → 많은 AOP 프레임워크는 Advice를 인터셉터로 모델링하고 Join Point 주위에 chain of interceptors를 유지합니다.
Spring AOP에서 Advice 유형
Join point와 일치하는 정규식 표현으로 Pointcut과 일치하는 모든 Join point에서 Advice가 실행됩니다. → Spring에서는 AspectJ 표현을 사용합니다.
Aspect를 대상 객체와 연결함으로써 Adviced Object(핵심 로직 코드에 Advice가 포함된 객체)를 생성하는 작업을 이야기합니다. → Spring AOP는 런타임 과정에서 수행합니다.
클래스나 인터페이스를 대표해서 추가적으로 메서드나 필드를 선언할 수 있는 것을 이야기하며 여기서 추가 메서드나 필드 선언은 기존 클래스의 소스 코드를 수정하지 않고 해당 클래스나 인터페이스에 세로운 메서드나 필드를 추가하는 방식을 이야기합니다. → Spring AOP 에서는 새로운 인터페이스와 인터페이스 구현을 도입할 수 있도록 해줍니다.
하나 이상의 Aspects로부터 Advise를 받는 객체를 이야기합니다. → Spring AOP에서는 런타임 Proxy를 사용하여 구현되므로 위 객체는 항상 프록시화 된 객체입니다.
AOP 프레임워크에서 Aspect 문맥을 구현하기 위해 생성한 객체입니다. → Spring Framework에서는 JDK 동적 프록시 또는 CGLIB 프록시를 사용합니다.
Spring Framework의 경우 JDK 동적 프록시를 기본으로 사용하고 CGLib 프록시 사용을 위한 가이드를 제공합니다. 하지만 Spring Boot에서는 CGLib 프록시를 기본으로 사용합니다.