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 등의 다양한 어드바이스 유형을 제공한다.