패스트캠퍼스 - "한 번에 끝내는 Spring 완전판 강의"를 정리한 글입니다.
Filter, Interceptor
: 프로젝트에 전반적으로 적용되는 공통 기능을 녹이기 좋음. 예)인증
AOP
: 그 외 특정 컨트롤러/타이밍에 원하는 작업을 넣어주고 싶을 때 사용.
OOP로 처리하기에는 다소 까다로운 부분을 AOP라는 처리 방식을 도입하여 손쉽게 공통 기능을 추가/수정/삭제 할 수 있도록 함
예를 들어 다음의 기능들을 추가/수정/삭제하곤 한다.
실무에서 AOP를 쓰게 되면 코드 분석이 어려워지는 부분이 있다. 그래서 강사분은 실무에서 AOP를 적극적으로 쓰려고 하지는 않고 보수적으로 쓰는 편이다.
여러 클래스나 기능에 걸친 관심사, 그리고 그것들을 모듈화함
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
@Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect {
}
Aspect를 넣어줄 수 있는 point
Join point 중에서 해당 Aspect를 적용할 대상을 뽑을 조건식
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
@Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect {
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {} //public 메서드 대상 포인트 컷
@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {} // 특정 패키지 대상 포인트 컷
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} // 위의 두 조건을 and(&&) 조건으로 결합한 포인트 컷
}
조언, AOP에서 실제로 적용하는 기능(로깅, 트랜잭션, 인증 등)을 뜻함
포인트컷들을 활용하여 포인트컷의 전/후/주변에서 실행될 액션을 정의함
Before Advice
dataAccessOperation()이라는 미리 정의된 포인트 컷의 바로 전에 doAccessCheck가 실행
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class BeforeExample {
@Before("com.xyz.myapp.CommonPointcuts.dataAccessOperation()")
public void doAccessCheck() {
// ...
}
}
After Returning Advice
dataAccessOperation()라는 미리 정의된 포인트컷에서 return이 발생된 후 실행
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;
@Aspect
public class AfterReturningExample {
@AfterReturning("com.xyz.myapp.CommonPointcuts.dataAccessOperation()")
public void doAccessCheck() {
// ...
}
}
Around Advice
businessService()라는 포인트컷의 전/후에 필요한 동작을 추가함
@Transactional 어노테이션이 Around Advice를 사용하고 있다.
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;
@Aspect
public class AroundExample {
@Around("com.xyz.myapp.CommonPointcuts.businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}
}
Advice가 적용될 대상 오브젝트
대상 오브젝트에 Aspect를 적용하는 경우 Advice를 덧붙이기 위해 하는 작업을 AOP Proxy라고 함
주로 CGLIB(Code Generation Library, 실행 중에 실시간으로 코드를 생성하는 라이브러리) 프록시를 사용하여 프록싱 처리를 한다.
Advice를 비즈니스 로직 코드에 삽입하는 것을 말함
AspectJ는 AOP를 제대로 사용하기 위해 꼭 필요한 라이브러리
기본적으로 제공되는 Spring AOP로는 다양한 기법(Pointcut 등)의 AOP를 사용할 수 없음
aspectj는 Spring Boot안에 포함되어 있기 때문에 별도의 라이브러리 추가가 필요하지 않다.