1. AOP
AOP는 흔히 '관점 지향 프로그래밍'이라는 용어로 번역되는데, 이때 '관점(Aspect)'이라는 용어가 너무 어렵습니다.
개발자들에게 '관점'이란 용어는 관심사(Concern)이라고 번역이 되는데 개발 시 필요한 고민이나 염두에 두어야 하는 일이라고 생각할 수 있습니다.
1. 파라미터가 올바르게 들어왔을까?
2. 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인가?
3. 이 작업에서 발생할 수 있는 모든 예외는 어떻게 처리해야 하는가?
등이 있을 수 있습니다.
핵심 로직은 아니더라도 전통적으로 개발자가 개발하면서 반복적으로 이러한 문제를 코드에 담아내게 됩니다.
하지만 AOP는 좀 다른 방식으로 접근합니다.
'관심사의 분리(seperate concerns)'입니다. AOP 는 개발자가 염두에 두어야 하는 일들은 별도의 관심사로 분리하고, 핵심 비즈니스 로직만을 작성할 것을 권장합니다. 관심사는 '주변 로직'이라고 표현할 수 있습니다.
예를 들어 나눗셈을 구현하다고 하면 '핵심 로직'은 두 개의 숫자를 나누는 것이지만, '주변 로직'은 0을 나누는 것이 아닌지 등을 체크하는 것이라고 할 수 있습니다. 즉, 사전 조건이나 사후 조건등이라고 간주할 수 있습니다.
따라서 AOP 는 '비즈니스 로직' + '관심사'로 분리해서 별도의 코드로 작성하고, 실행할 때 이를 결합하는 방식으로 진행합니다.
또 다시 예를 들어 AOP 를 이용한다면 작성된 모든 메서드의 실행 시간이 얼마인지를 기록하는 기능을 기존 코드의 수정없이도 작성할 수 있고, 잘못된 파라미터가 들어와서 예외가 발생하는 상황을 기존 코드의 수정없이 제어할 수 있습니다.
스프링이 AOP를 지원한다는 것은 별도의 복잡한 설정이나 제약이 없이 스프링 내에서 간편하게 AOP의 기능을 구현할 수 있기 때문입니다.
2. AOP 용어
위 그림에서 Target은 '비즈니스 로직'입니다. 어떠한 관심사들과도 관계를 맺지 않습니다. 순수한 코어(core)라고 볼 수 있습니다. Target을 전체적으로 감싸고 있는 Proxy는 내부적으로 Target을 호출하지만, 중간에 관심사들을 거쳐서 Target을 호출하도록 자동/수동으로 작성됩니다.
Advice 는 실제 걱정거리를 분리해 놓은 코드를 의미합니다.
JoinPoints 는 Target이 가진 여러 메서드라고 볼 수 있습니다.(스프링 AOP 에서는 메서드만이 JoinPoint가 됩니다.) 여러 메서드가 존재하기 때문에 어떤 메서드에 관심사를 결합할 것이지를 결정하는데 결정하는 것을 'Pointcut'이라고 합니다.
Pointcut 은 관심사와 비즈니스 로직이 결합되는 것입니다.
3. Advice 와 Pointcut 의 형태
Advice 의 구분
Before Advice |
Target의 JoinPoint를 호출하기 전에 실행되는 코드입니다. 코드의 실행 지체에는 관여할 수 없습니다. |
Alter Returning Advice |
모든 실행이 정상적으로 이루어진 이후에 동작하는 코드입니다. |
Alter Throwing Advice |
예외가 발생한 뒤에 동작하는 코드입니다. |
Alter Advice |
정상적으로 실행되거나 예외가 발생했을 때 구분 없이 실행되는 코드입니다. |
Around Advice |
메서드의 실행 자체를 제어할 수 있는 가장 강력한 코드입니다. 직접 대상 메서드를 호출하고 결과나 예외를 처리할 수 있습니다. |
Pointcut 의 구분
execution(@execution) |
메서드를 기준으로 Pointcut을 설정합니다. |
within(@within) |
특정한 타입(클래스)을 기준으로 Pointcut을 설정합니다. |
this |
주어진 인터페이스를 구현한 객체를 대상으로 Pointcut을 설정합니다. |
args(@args) |
특정한 파라미터를 가지는 대상들만을 Pointcut으로 설정합니다. |
@annotation |
특정한 어노테이션이 적용된 대상들만을 Pointcut으로 설정합니다. |
'Computer Science > Spring' 카테고리의 다른 글
[Spring] Get 호출시 response 에 한글 깨짐 현상 (0) | 2022.09.05 |
---|---|
[Spring] LZ4 압축 및 압축 해제 (FILE) (0) | 2022.08.22 |
[Spring] Mysql / MyBatis insert 쿼리 수행하면서 PK 가져오기 (0) | 2018.12.27 |
[Spring] Spring project log4j 충돌 현상 (0) | 2018.12.20 |
[Spring] 스프링 MVC 프로젝트 로딩 구조 (0) | 2018.12.18 |