AOP(Aspect Oriented Programming) 개요
- 핵심 관심 사항과 공통(부가) 관심 사항.
- 핵심 관심 사항(core concern)과 공통 관심 사항(cross-cutting concern)
- 기존 OOP에서는 공통 관심 사항을 여러 모듈에 적용하는데 있어 중복된 코드를 양상하는 한계가 존재함
- 이를 해결하기 위해 AOP등장
- Aspect Oriented Programming은 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍함으로써 공통 모듈을 손쉽게 적용할 수 있게 함.
- AOP는 application에서의 관심사의 분리 즉, 핵심적인 기능에서 부가적인 기능을 분리한다.
- 분리한 부가기능을 Aspect라는 독특한 모듈 형태로 만들어서 설계하고 개발하는 방법.
- OOP를 적용하여도 핵심기능에서 부가기능을 쉽게 분리된 모듈로 작성하기 어려운 문제점을 AOP가 해결.
- AOP는 부가기능을 어스펙트(Aspect)로 정의하여, 핵심기능에서 부가기능을 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 개념.
AOP 구조
- 핵심 관심 사항 : BankingService, AccountService, CustomerService
- 공통 관심 사항 : Security, Transaction, Other ...
AOP 용어
-
target
- 핵심 기능을 담고 있는 모듈로 target은 부가기능을 부여할 대상이 됨
-
advice
- 어느 시점에 어떤 공통 관심 기능을 적용할지 정의 한 것.
target에 제공할 부가기능을 담고 있는 모듈
-
JoinPoint
- Aspect가 적용될 수 있는 지점
- 즉 target 객체가 구현한 인터페이스의 모든 method는 JoinPoint가 됨.
-
Pointcut
- 공통 관심 사항이 적용될 JoinPoint
- Advice를 적용할 target의 method를 선별하는 정규 표현식
- Pointcut 표현식은 execution으로 시작하고 method의 Signature를 비교하는 방법을 주로 이용
-
Aspect
- 여러 객체에서 공통으로 적용되는 공통 관심 사항
- AOP의 기본 모듈
- Aspect = Advice + Pointcut
- Aspect는 Singleton 형태의 객체로 존재
-
Advisor
- Advisor = Advice + pointcut
- Advisor는 Spring SOP에서만 사용되는 특별한 용어
-
Weaving
- 어떤 Advice를 어떤 Pointcut에 적용시킬 것인지에 대한 설정
- 즉 Pointcut에 의해서 결정된 타켓의 JoinPoint에 부가기능(Advice)을 삽입하는 과정을 뜻함
- Weaving은 AOP의 핵심기능(Target)의 코드에 영향을 주지 않으면서 필요한 부가기능을 추가할 수 있도록 해주는 핵심적인 처리과정.
Pointcut 표현식
AOP비교
Spring AOP 특징
- Spring AOP는 method JoinPoint만 지원
- Spring은 동적 Proxy를 기반으로 AOP를 구현하므로 method joinPoint만 지원한다.
- 즉, 핵심기능 (Target)의 method가 호출되는 런타임 시점에만 부가기능(Advice)를 적용할 수 있다.
- 반면 AspectJ 같은 고급 AOP framework를 사용하면 객체의 생성, 필드값의 조회와 조작, static method 호출 및 포기화 등의 다양한 작업에 부가기능을 적용할 수 있다.