AOP
: 관점 지향 프로그래밍
: 하나의 프로그램을 관점(혹은 관심사)이라는 논리적 단위로 분리해서 관리하는 개념
- 관심사(concern) = 해당 사건이 발생하는지 관심있게 지켜보다가 해당 사건이 벌어지게 되면 구현되어져 있는
다른 작업을 먼저 하고 그 다음에 동작시킨다. 또는 동작시키고 다른 작업을 동작한다.
가장 중요한 로직은 아니지만, 사전 조건이나 사후 조건 등이라고 간주할 수 있다.
: 로깅, 감사, 선언적 트렌젝션, 보안, 캐싱 등 다양한 곳에서 사용되고 있다.
: 개발자의 입장에서 AOP를 적용한다는 것은 기존의 코드를 수정하지 않고도 원하는 관심사들을 엮을 수 있다
: 상속의 한계를 극복(상속 대체)
AOP 용어
구분 | 설명 |
Target | 순수한 비즈니스 로직이다. 어떤한 관심사들과도 관계를 맺지 않는다. 순수한 코어(core)라고 볼 수 있다. 결과적으로 Pointcut에 의해서 자신에게는 없는 기능들을 가지게 된다. |
Proxy | Target을 전체적으로 감싸고 있는 존재이다. 내부적으로는 Target을 호출하지만, 중간에 필요한 관심사들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성된다. 대부분의 경우 스프링 AOP 기능을 이용해서 자동으로 생성되는(auto-proxy) 방식을 이용한다. |
JoinPoint | Target 객체가 가진 메서드이다. 외부에서의 호출은 Proxy 객체를 통해서 Target 객체의 JoinPoint를 호출하는 방식이다. 모듈이 삽입되어 동작하게 되는 특정 위치이다. (Advice를 적용해야 되는 부분) |
Pointcut | Target에는 여러 메서드가 존재하기 때문에 어떤 메서드에 관심사를 결합할 것인지를 결정하는 것이다. 관심사와 비즈니스 로직이 결합되는 시점을 결정하는 것이다. Proxy는 이 결합이 완성된 상태이므로 메서드를 호출하게 되면 자동으로 관심사가 결합된 상태로 동작하게 된다. Advice에 다양한 JoinPoint 중에 어떤 것을 사용할지 결정한다. Pointcut은 다양한 형태로 선언해서 사용할 수 있다. |
Advice | 실제 걱정거리를 분리해 놓은 코드이다. JoinPoint에 삽입되어 동작할 수 있는 코드이다. Aspect의 기능 자체 |
Weaving | Advice를 핵심 로직 코드에 적용하는 행위이다. |
Aspect | Pointcut + Advice 공통 기능 |
: Advice의 동작 위치에 따른 구분
구분 | 설명 |
Before Advice | Target의 JoinPoint를 호출하기 전에 실행되는 코드이다. 코드의 실행 자체에는 관여할 수 없다. |
After Returning Advice | 모든 실행이 정상적으로 이루어진 후에 동작하는 코드이다. |
After Throwing Advice | 예외가 발생한 뒤에 동작하는 코드이다. |
After Advice | 정상적으로 실행되거나 예외가 발생했을 때 구분 없이 실행되는 코드이다. |
Around Advice | 메서드의 실행 자체를 제어할 수 있는 가장 강력한 코드이다. 직접 대상 메서드를 호출하고 결과나 예외를 처리할 수 있다. |
: Pointcut에서 주로 사용되는 설정
구분 | 설명 |
execution(@execution) | 메서드를 기준으로 Pointcut을 설정한다. |
within(@within) | 특정한 타입(클래스)를 기준으로 Pointcut을 설정한다. |
this | 주어진 인터페이스를 구현한 객체를 대상으로 Pointcut을 설정한다. |
args(@args) | 특정한 파라미터를 가지는 대상만을 Pointcut으로 설정한다. |
@annotation | 특정한 어노테이션이 적용된 대상들만을 Pointcut으로 설정한다. |
반응형
'Java > java' 카테고리의 다른 글
유효성 검사 (Validate) (0) | 2020.10.27 |
---|---|
IoC 컨테이너 (0) | 2020.10.26 |
빈 xml 객체 생성 정리 (0) | 2020.10.21 |
스프링(Spring)의 특징과 의존성 주입(DI) (0) | 2020.10.20 |
EL문, JSTL (0) | 2020.10.20 |