'코드로 배우는 스프링 웹 프로젝트' 참고
AOP란?
스프링 공부를 하면서 나오는 생소한 개념 중 하나는 AOP이다.
AOP는 Aspect Of Programming이라는 개념으로 번역하면 관점 지향 프로그래밍이다.
사실 잘 와닿지 않은데, 개발자들 사이에서는 관심사(concern)'라는 말로 통용된다고 한다.
관심사라는 것은 핵심로직은 아니지만 코드를 작성하면서 고려해야하는 상황이다.
예를 들면, 올바른 파라미터가 들어왔는지, 사용자는 적절한 권한을 가졌는지, 예외처리는 어떻게 할 것인지 등의 관심사에 대한 것이다.
AOP는 이러한 관심사를 분리하고, 핵심 로직에 집중할 수 있도록 돕는다.
AOP관련 용어들
타겟 : 순수한 비즈니스 로직
Advice : 관심사(concern) 구현 코드
JoinPoint : 핵심 로직 메서드 (타겟 객체가 가진 메서드) Advice를 JoinPoint에 붙인다!
PointCut : 타겟의 어떤 로직(메서드)에 붙일지에 대한 경로.
Proxy : 타겟을 전체적으로 감싸며, 이를 호출하는 과정에 관심사를 거치도록 한다. -> 보통 자동으로 생성됨.
AOP는 따로 코딩된 특정 관심사(Advice)를 PointCut이 가리키는 JoinPoint메서드에 붙이는 것이다.
Advice의 구분
- Before : 핵심 로직 수행 전에 실행되는 관심사
- After Returning : 모든 실행이 정상적으로 이루어진 뒤 실행되는 관심사
- After Throwing : 예외 발생 뒤 동작하는 관심사
- After Advice : 예외, 정상처리 상관없이 실행되는 관심사
- Around Advice : 핵심 로직 전체를 제어할 수 있는 관심사
PointCut의 구분
- execution : 메서드 기준으로 PointCut설정
- within : 클래스를 기준으로 PointCut설정
- this : 주어진 인터페이스를 구현한 객체를 대상으로 PointCut설정
- args : 특정한 파라미터를 가지는 대상들만을 PointCut설정
- annotation : 특정 어노테이션이 적용된 대상들만을 PointCut설정
간단한 예시
1. 핵심로직인 Service의 특정 메서드(JoinPoint)를 생성한다.
2. AOP객체에 Advice를 생성한다.
(3. 각종 설정 필요!)
1. 핵심로직인 Service의 특정 메서드를 생성한다.
@Service
public class SampleService implement ISampleService{
@Override
public int doAdd(int a, int b) throws Exception {
return a+b;
}
}
2. AOP객체에 Advice를 생성한다.
@Aspect
@Component
public class SampleAop{
@Before("execution(* com.mypjt.service.SampleService*.*(..))")
public void logBefore(){
log.info("~~~~~~");
}
}
SampleService의 doAdd가 JoinPoint이다.
SampleAop의 logBefore메서드가 Advice이다.
Before어노테이션으로 doAdd 메서드 실행 이전에 수행된다는 것을 명시했다.
PointCut은 "execution(* com.mypjt.service.SampleService*.*(..))"이다. 이는 AspectJ의 표현식을 찾아보자.
@Around와 ProceedingJoinPoint
(----찾아보자----)
'Spring' 카테고리의 다른 글
| Spring - 의존성주입 방법의 비교(생성자 주입, Setter주입, field주입) (0) | 2020.06.11 |
|---|---|
| SpringSecurity - jdbc를 이용한 인증/권한 처리 (0) | 2020.05.12 |
| SpringSecurity - 서블릿 기반 구조 (0) | 2020.05.12 |
| Spring - ServletContext와 RootContext (0) | 2020.05.08 |
| Spring - 의존성 주입(DI)/IoC컨테이너/ApplicationContext (0) | 2020.05.05 |