AOP는 흔히 '관점 지향 프로그래밍' 이라는 용어로 번역되는데, 이때 '관점(Aspect)' 이라는 용어가 현실적으로 와닿지 않기 때문에 어렵게 느껴질수 밖에 없다.
그럼 '관점'? 이 개발자에게 어떤 의미일까?
개발자들에게 관점은 '관심사' 라고 생각하면된다. '관심사'는 개발 시 필요한 고민이나 염두에 두어야 하는 일이라고 생각할 수 있는데, 코드를 작성하면서 염두에 두는 일들은 주로 다음과 같다.
- 파라미터가 올바르게 들어왔을까?
- 이 작업을 하는 사용자가 적절한 권한을 가진 사용자일까?
- 이 작업에서 발생할 수 있는 모든 예외는 어떻게 처리해야 하는가?
AOP는 이러한 고민에 대한 문제를 조금 다른 방식으로 접근한다. AOP가 추구하는 것은 '관심사의 분리(separateconcerns)입니다. AOP는 개발자가 염두에 두어야 하는 일들은 별도의 '관심사'로 분리하고, 핵심 비즈니스 로직만을 작성할 것를 권장한다
그렇다면 '대체 관심사가뭐야?' 라고 생각하는 개발자도 있을거다 ! 왜냐 내가 그렇다.. ㅋㅋ
'관심사' 라고 한다면 쉽게 생각해보면 약간의 주변 로직 이라고 생각하면 될거 같다 . 예를 드러 나눗셈을 구현한다고 치면 '핵심로직'은 두 개의 숫자를 나누는 것이지만, ' 주변 로직'은 0을 나누는 것이 아닌지 등을 체크하는 것, ' 관심사'는 바로 이런 가장 중요한 로직은 아니지만, 사전 조건이나 사후 조건 등이라고 간주할 할수있다.
Aop를 이용하게되면 작성된 모든 메서드의 샐행 시간이 얼마인지를 기록하는 기능을 기존 코드의 수정 없이도 작성할 수 있고, 잘못된 파라미터가 들어와서 예외가 발생하는 상황을 기존 코드의 수정 없이도 제어할 수 있습니다. 프르링이 AOP를 지원한다는 것이 스프링의 가장 중요한 특징 중에 하나로 말하게 된 이유 역시 별도의 복잡한 설정이나 제약 없이 스프링 내에서 간편하게 AOP의 기능들을 구현할 수 있기 때문이다.
AOP 용어들을 알아보자
Aop를 사용한다는 것은 기존의 코드를 수정하지 않고 원하는 관심사(cross-concern)들을 엮을수 있다는 점이다.
위의 그림에서 Target(핵심 비지니스로직)은 순수한 어떠한 관심사들과도 관계를 맺지 않습니다. 순수한 코어 라고 볼수 있다
Target을 전체적으로 감싸고 있는 존재를 Proxy라고 한다. Proxy는 내부적으로 Target을 호출하지만, 중간에 관심사 들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성됩니다. Proxy는 대부분의 경우 스프링 AOP 기능을 이용해서 자동으로 생성되는(auto-proxy)방식을 이용한다.
JoinPoint는 Target 객체가 가진 메서드다. 외부에서의 호출은 Proxy 객체를 통해서 Target객체의 JoinPoint를 호출하는 방식이라고 이해할 수 있다.
JoinPoint는 Target이 가진 여러 메서드라고 보면된다. 책에서는 엄필이하게 스프링 AOP에서는 메서드만이 JoinPoint가 된다고 한다.
Target에는 여러 메서드가 존재하기 때문에 어떤 메서드에 관심사를 결합할 것인지를 결정해야하 하는데 이 결정을 pointcut 이라고 한다.
'Pointcut'은 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 것입니다. 앞의, Proxy는 이 결합이 완성된 상태이므로 메서드를 호출하게 되면 자동으로 되면 자동으로 관심사가 결합된 상태로 동작하게 됩니다. 관심사는 위의 그림에서 Aspect와 Advice라는 용어로 표현되어 있습니다. Aspect는 추상적인 개념이기 때문에 이를 구현한 클래스가 Advice이다.
Advice는 실제 프로그래머의 걱정거리를 분리해 놓은 코드를 의미합니다. Advice는 그 동작 위치에 따라 다음과 같이 구분된다.
구분 |
설명 |
||
Before Advice |
Target의 Joinpoint를 호출하기전에 실행되는 코드입니다. |
||
After Returning Advice |
모든 실행이 정상적으로 이루어진 후에 동작하는 코드입니다. |
||
After Throwing Advice |
예외가 발생한 뒤에 동작하는 코드 |
||
After Advice |
정상적으로 실행되거나 예외가 발생했을 때 구분 엇이 실행되는 코드입니다. |
||
Around Advice |
메서드의 실행 자체를 제어할 수 있는 가장 강력한 코드입니다. 직접 대상 메서드를 호출하고 결과나 예외를 처리할수 있습니다. |
Pointcut은 Advice를 어떤 Joinpoint에 결합할 것인지를 결정하는 설정이다. AOP 에서 Target은 결과적으로 Pointcut에 의해서 자신에게는 없는 기능들을 가지게 됩니다. Pointcut은 다양한 형태로 선언해서 사용할 수 있는데 주로 사용되는 설정은 다음과 같다
구분 | 설명 |
execution(@execution) | 메서드를 기준으로 Pointcut을 설정합니다. |
within(@within) | 특정한 타입을 기준으로 Pointcut을 설정합니다. |
this | 주어진 인터페이스를 구현한 객체를 대상으로 PointCut으로 설정합니다. |
args(@args) | 특정한 파라미터를 가지는 대상들만을 Pointcut으로 설정합니다. |
@annotaion | 특정한 어노테이션이 적용된 대상들만을 PointCut으로 설정합니다. |
'Spring' 카테고리의 다른 글
@PathVariable(스프링 지향) (0) | 2020.12.01 |
---|---|
SprtingSecurity(메뉴 권한 및 WebIgnore 설정) (0) | 2020.11.14 |
Oracle 연동 (0) | 2020.11.09 |
Rest (0) | 2020.11.01 |
MVC구조 (0) | 2020.10.31 |