AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍이다. 어떠한 기준을 정하고, 관점을 나누어서 각 관점 별로 모듈화를 하여 사용하는 방식이다.
AOP를 사용하는 이유는 비즈니스 로직과 공통 기능으로 구분을 하고, 공통 기능은 필요한 시점에 불러와서 적용하는 프로그래밍 방법이다.
관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다.
소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 확인할 수 있는 데 이것을 흩어진 관심사 (Crosscutting Concerns)❓라 부른다.
스프링 MVC 웹 어플리케이션에서는 Web Layer, Business Layer, Data Layer로 정의
dependencies {
implementation 'org.springframework:spring-aop'
}
@SpringBootApplication
@EnableAspectAutoProxy
public class SampleApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
@Before("execution(* com.example.*.*(..))")
public void somethingBefore(JoinPoint joinPoint) {
}
@AfterReturning(pointcut = "execution(* com.example.*.*(..))", returning = "result")
public void doSomethingAfterReturning(JoinPoint joinPoint, Object result) {
// 리턴 시 실행
}
// 특정 어노테이션이 명시된 모든 메써드의 실행 전후로 끼어들 수 있다.
@Around("@annotation(sampleAnnotation)")
public Object somethingAround(final ProceedingJoinPoint joinPoint, final SomeAnnotation someAnnotation) {
// 실행 전
Object result = joinPoint.proceed();
// 실행 후
return result;
}
// 특정 어노테이션이 설정된 모든 method 실행 앞/뒤
@Around("@annotation(scheduled)")
public Object process(final ProceedingJoinPoint joinPoint, final Scheduled scheduled) throws Throwable {
}
// 클래스 레벨에 특정 어노테이션이 명시된 모든 method
@Around("@within(org.springframework.web.bind.annotation.RestController) || @within(org.springframework.stereotype.Service) || @within(org.springframework.stereotype.Repository)")
public Object process(final ProceedingJoinPoint joinPoint) throws Throwable {
}
JoinPoint객체는 각 컨트롤러에 정의된 method들의 args(매개변수)정보를 담고 있는 객체이다.