AOP는 관점 지향 프로그래밍이라고 불립니다.
즉 관심사라는 용어인데 코드를 작성하면서 고려해야 하는 사항 들이라고 할 수 있습니다.
파라미터가 올바른지??
적절한 권한인지?
예외는 어떻게 처리하는지 ??
핵심 로직이 아니지만 온전하게 만들기 위해 고려해야 하는데 과거에 반복적인 코드를 반영하게 됩니다.
불편함이 있습니다.
따라서 AOP는 이러한 관심사를 분리해줍니다.
한마디로 핵심 로직과 주변 로직(관심사)으로 이루어진다고 할 수 있죠.
이 주변 로직은 실행 시점에 결합이 됩니다.
즉 메서드 실행 시간이 어떻게 되는지 예외 발생 처리 등등을 처리하기 위해서 기존 코드를 수정하지 않아도 됩니다.
분리되어 있기 때문이죠.
Target이 개발자가 작성하는 핵심 비즈니스 로직을 가지는 객체입니다
즉 Target은 순수 비지니스 로직이며 어떠한 관계도 맺지 않는 순수한 코어라고 할 수 있습니다.
Proxy는 관심사를 거쳐 Target을 호출하도록 해줍니다. 이 Proxy는 대부분 오토 프락시입니다.
JoinPoint는 Target이 가지는 메서드입니다.
Target은 여러 메서드를 즉 여러 비즈니스 로직들을 가지게 되는데
관심사가 어디 메서드(JoinPoint)에 결합되어야 할지 결정하는 것은 PointCut이라고 합니다.
Aspect은 추상적 개념으로 Advice가 Aspect를 구현한 코드입니다.
Adivce는 관심거리 코드들로 이루어져 동작 위치에 따라 아래와 같이 분류됩니다.
구분 | 설명 |
Before Advice | Target의 JoinPoint를 호출 전에 실행 관여X |
After Returning Advice | 모든 실행이 정상적으로 이루어진 후 실행 |
After Throwing Advice | 예외가 발생한 뒤에 동작하는 코드입니다. |
After Advice | 정상적으로 실행되거나 예외가 발생했을 때 구분없이 실행 |
Around Advice |
메서드 실행 자체를 제어하는 가장 강력크한 코드로 직접 대상 메서드를 호출, 결과 예외처리 가능 |
Target에 어떤 Advice를 적용할지는 XML과 어노테이션으로 이용 가능합니다.
PointCut은 앞서 말했지만 Advice를 어떤 타깃 메서드(JoinPoint)에 결합할 것인지 결정합니다.
결론적으로 Target은 자신에게 없는 기능을 가지게 됩니다.
PointCut의 설정은 아래와 같습니다.
구분 | 설명 |
execution(@execution) | 메서드를 기준으로 Pointcut을 설정 |
within(@within) | 특정한 타입을 기준으로 Pointcut 설정 |
this | 주어진 인터페이스를 구현한 객체 대상 |
args(@args) | 특정 파라미터를 가지는 대상 |
@annotation | 특정 어노테이션 적용 대상 |
'웹 > Spring' 카테고리의 다른 글
Spring 트랜잭션 & 데이터베이스 설계 (0) | 2019.05.06 |
---|---|
AOP 적용 (0) | 2019.05.04 |
REST AJAX 댓글 등록 처리 (2) | 2019.04.28 |
REST 방식 (0) | 2019.03.31 |
Spring - UriComponentsBuilder의 사용 (0) | 2019.03.27 |