AOP (관점 지향 프로그래밍)
✔️ 애플리케이션 전체에서 사용되는 기능을 재사용 ✔️ 횡단 관심사의 분리 (Seperation of Concern)
기존의 OOP와는 다른 관점으로 부가기능적인 측면에서의 공통된 요소를 강조하는 것이다.
OOP | AOP |
---|---|
비즈니스 로직 | 각각의 모듈에 필요한 부가기능 |
-
핵심관리 모듈(class or service)마다 필요한 모듈(code)을 직접 호출하지않고
Weaving
하여 횡단관심 코드가삽입재사용 되도록 하는 방법. -
각 모듈들의 횡단 관심사가 무엇인지 파악하는 능력이 필요하다.
대표적인 예로 스톱워치, 로깅, 트랜잭션, 보안, 인증, 리소스풀링 에러체크, 세션관리등이 있다.
1990년대 후반 Java를 확장해 AOP를 지원하고 컴파일시 횡단 관심 모듈이 삽입되는 최초의 프레임워크 AspectJ의 출시.
AspectJ 5.0의 발표 이후 자바 5.0에서 추가된 Generic, Annotation을 활용하게 되면서 자바에서도 개발이 가능해졌다.
Spring 2.0의 경우 AspectJ의 라이브러리를 활용해 Annotation 해석기능을 수행한다.
AOP의 구성요소
*Target
공통 관심 모듈을 적용할 대상들
*Aspect
부가기능 모듈 그 자체를 Aspect
라 한다.
Aspect
는 기능을 정의한 어드바이스
와 어드바이스를 어디에 적용할지 결정하는 포인트컷
을 내포하고있다.
*Advice - Interceptor
(What?)
횡단 관심사의 분리로 실질적인 부가기능을 담당하는 구현체
*Join Point - When?
어드바이스가 적용될 수 있는 위치(시점)
Spring에서는 메소드 조인포인트만 제공한다.
예제에서는 Around시점에 Advice를 적용시켜 각 메서드의 시간측정을 구현해봤다.
*Point Cut - Where?
횡단 관심사가 적용될 대상 을 선정하는 방법 (Which method?)
*Proxy
타겟의 요청을 먼저 가로채서 어드바이스에 등록된 기능을 먼저 사용한 후 요청 된 메소드의 기능을 수행하는 오브젝트
*Weaving
- 어드바이스를 삽입하는 과정
- 지정된 객체에 Aspect를 적용해 새로운 프록시 객체를 생성하는 과정 그 자체를 얘기한다.
- 프록시 객체의 생성 과정을 위빙이라고 생각하자
- Spring에서는 Runtime에 프록시가 생성되어 위빙이 이루어진다고 할 수 있다.
실습한 예제에서는 Service 계층에 관여하여 @Before(“execution(package info)") / @After 등을 통해 JoinPoint(when) 에 대한 학습을 진행했었다.