[ 2022.10.30 TIL-Spring AOP ]

AOP
✏️ AOP(Aspect Oriented Programming)란?
- 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 그 관점을 기준으로 각각 모듈화하는 것
- 소스 코드에서 계속 반복해서 쓰는 코드들을 흩어진 관심사(Crosscutting Concerns)라 부름
- Aspect로 모둘화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지
- 중복 코드, 프록시 클래스 작성의 번거로움 등에 대한 해결책을 제시하는 것이 목적
✏️ AOP 특징
- Spring Bean 에서만 AOP가 적용 가능
- JoinPoint로만 지원
- 프록시가 호출을 가로채 핵심기능 로직 전/후로 부가기능 로직을 수행
✏️ AOP 장점
- 중복된 코드를 최대한 제외하고 기능이 필요할 때만 호출하여 사용하여 재사용성이 높음
- 비슷한 코드를 별도로 분리하여 관리하기 때문에 코드가 깔끔해짐
✏️ AOP 주요 용어
- Aspect
- 부가기능을 정의한 코드인 Advice와 Advice를 어디에 적용할지를 결정하는 PointCut을 합친 개념
- Advice + PointCut = Ascpct
- 부가기능들을 독립적인 Aspect로 구분 가능
- 런타임 시 필요한 위치에 동적으로 사용 가능
- 싱글톤 형태로 존재
- Target
- 핵심 기능을 담고 있는 모듈로 부가기능을 부여할 대상이 됨.
- Advice
- 타켓에 재공할 부가기능을 담고 있는 모듈
- Advice 종류
- Before Advice : 대상 객체의 메소드 호출 전에 공통 기능을 실행
- After Advice : 익셉션 발생 여부에 상관없이 대상 객체의 메소드 실행 후 공통 기능을 실행
- After Returning Advice : 객체의 메소드가 익셉션 없이 정상적으로 실행된 이후 공통 기능을 실행
- After Throwing Advice : 객체의 메소드를 실행하는 도중 예외가 발생한 경우 공통 기능을 실행
- Around Advice : 객체의 메소드 실행 전/후 또는 예외 발생 시점에 공통 기능을 실행
- Joint Point
- Advice가 적용될 수 있는 위치
- Target 객체가 구현한 인터페이스의 모든 메소드는 Join Point가 됨
- Pointcut
- Joint Point의 상세한 스펙을 정의
- Advice를 적용할 타겟의 메소드를 선별하는 정규표현식
- Pointcut 표현식
- Advisor
- Advice + Pointcut = Advisor
- Spring AOP에서만 사용되는 특별한 용어
- Weaving
- Pointcut에 의해 결정된 타겟의 Joint Point에 부가기능을 삽입하는 과정을 의미
- Compile-time Weaving
- Load-time에 대한 절차가 없어 성능 하락 없이 구성 가능
- Lombok과 같이 컴파일시 간섭하는 플러그인들과 충돌
- Class Load-time Weaving
- applicationContext에 로드된 객체들을 불러온 뒤, AspectJ weaver에 의해 객체들을 weaving함
- 객체를 전부 불러온 뒤 weaving 하기 때문에 약간의 성능 하락이 존재
- Run-time Weaving
- Spring AOP에서 사용하는 방식
- 소스코드나 클래스 정보를 변경하지 않고 프록시 객체를 사용해 AOP 적용
✏️ AOP 동작과정

✏️ AOP 예제 코드
참고
AOP