preHandle(HttpServletRequest, HttpServletResponse, Object)
: 컨트롤러에 요청이 도달하기 전에 실행되는 메서드, 반환 값이 false
면 요청 처리가 중단된다.postHandle(HttpServletRequest, HttpServletResponse, Object, ModelAndView)
: 컨트롤러가 실행된 후, 뷰를 렌더링하기 전에 실행되는 메서드afterCompletion(HttpServletRequest, HttpServletResponse, Object, Exception)
: 요청 처리가 완전히 끝난 후 실행되는 메서드public LoggingInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Before handling the request);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("After handling the request, but before rendering the view");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("After rendering the view");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor());
}
}
Interceptor
중 preHandle
메서드를 가진 Interceptor
부터 시작합니다.true
를 반환하면, 다음 Interceptor나 실제 요청 핸들러(Controller)
로 진행됩니다. 만약 false
를 반환하면 요청 처리가 중단됩니다.afterCompletion
메서드가 호출됩니다.조인 포인트
(대상 메서드)에서 어드바이스
(코드조각)를 실행한다. 이를 구현하기 위해 Spring AOP는 주로 프록시 기반의 방식을 사용한다.public class SimpleService {
public void someMethod() {
System.out.println("Executing someMethod...");
}
}
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* SimpleService.someMethod(..))")
public void logBefore() {
System.out.println("Before calling someMethod");
}
@After("execution(* SimpleService.someMethod(..))")
public void logAfter() {
System.out.println("After calling someMethod");
}
}
SimpleService
의 Bean을 생성할때 AOP가 설정되어 있다면, 실제로 SimpleService
의 프록시 객체가 생성된다.someMethod
를 호출하면, 프록시는 먼저 logBefore
를 실행한 다음, 원본 someMethod
를 실행하고 마지막으로 logAfter
를 실행한다.Before calling someMethod
Executing someMethod...
After calling someMethod
Spring에서는 주로 JDK Dynamic Proxy(인터페이스 기반) 또는 CGLB Proxy(클래스 기반, 인터페이스가 없는 경우)를 사용하여 프록시 객체를 생성한다.
Before
, After
, AfterReturning
, AfterThrowing
, Around
등의 다양한 어드바이스 유형을 제공한다.