본문 바로가기

Computer Science/Spring

[Spring] AOP 패러다임

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으로 설정합니다. 











반응형