AOP(Aspect-Oriented Programming)
- 관점 지향 프로그래밍으로, 객체 지향 프로그래밍(OOP)을 보완하는 프로그래밍 패러다임
- AOP는 애플리케이션 전반에 걸쳐 사용되는 공통 기능을 모듈화하여 코드의 중복을 줄이고 유지보수성 향상
핵심 관심사와 공통 관심사
AOP에서는 기능을 두 가지 관점으로 나눈다.
- 핵심 관심사(Core Concern) : 비즈니스 로직같은 주요 기능 부분
- 공통 관심사(Cross-cutting Concern(횡단 관심사)) : 로깅, 트랜잭션 관리, 보안, 예외 처리 여러 모듈에 공통적으로 적용되는 기능
AOP는 공통 관심사를 별도의 모듈로 분리하여 필요한 위치에 적용함으로써 코드의 중복을 줄이고 핵심 비즈니스 로직에 집중할 수 있도록 한다
자주 사용하던 @Transactional
도 내부적으로 Spring AOP 프록시를 활용하여 트랜잭션을 자동으로 시작, 커밋, 롤백 처리
Spring AOP의 주요 구성 요소
1. Aspect(관점)
- 여러 객체에 공통적으로 적용되는 관심사의 모듈화, 공통 기능을 정의한 코드 블록
- 주로 부가기능을 모듈화한 것
2. Target(대상)
- Aspect가 적용되는 객체를 의미
- 비즈니스 로직이 구현된 클래스 또는 메서드
3. JoinPoint(조인포인트)
- Aspect가 적용될 수 있는 지점
- 메서드 실행, 호출, 필드 값 변경 등이 조인포인트가 될 수 있음
- Spring AOP에서는 메서드 실행 지점만 사용
4. Pointcut(포인트컷)
- 실제로 Advice가 적용될 JoinPoint를 선별하는 표현식
- ex) '특정 패키지의 모든 메서드' 와 같이 Advice를 적용할 메서드 지정
5. Advice(어드바이스)
- Aspect의 실제 구현체, JoinPoint에서 실행되는 코드
- 메서드 실행 전, 후, 예외 발생 시 등 다양한 시점에 실행
6. Weaving(위빙)
- Aspect를 대상 객체에 연결하여 Advice가 적용된 객체를 생성하는 과정
Spring AOP의 Advice 종류
1. @Before
- 대상 메서드가 실행되기 전에 Advice를 실행
2. @AfterReturning
- 결과를 반환한 후 Advice를 실행, 반환값을 변경할 수는 없지만 접근은 가능
3. @AfterThrowing
- 대상 메서드에서 예외 발생 시 Advice 실행
4. @After
- 대상 메서드의 정상 종료 또는 예외 발생 여부와 관계없이 메서드 실행 후 Advice 실행
5. @Around
- 가장 강력한 Advice로 메서드 호출 전,후로 Advice를 실행할 수 있음.
- 메서드 실행 여부 제어 가능
- 반환값 변경, 예외를 다른 예외로 변경 가능
Advice의 실행 순서는 @Around, @Before, @After, @AfterReturning, @AfterThrowing 순
Spring AOP 구현 방식
프록시 기반 AOP
Spring AOP는 프록시 패턴을 기반으로 구현. 스프링은 대상 객체를 감싸는 프록시 객체를 생성하고, 이 프록시를 통해 메서드 호출 시 Advice를 실행.
JDK 다이나믹 프록시
- 인터페이스 기반의 프록시 생성, 대상 객체가 인터페이스를 구현한 경우 사용
CGLIB 프록시
- 클래스 상속을 통한 프록시 생성, 대상 객체가 인터페이스를 구현하지 않은 경우 사용
SPring Boot 3.x 에서는 기본적으로 CGBLI 방식 사용(인터페이스 없이도 AOP 적용 가능)