import lombok.extern.slf4j.Slf4j;
// 인터셉터 => 컨트롤러 실행 전후를 필터 가능
@Component
@Slf4j
public class HttpInterceptor implements HandlerInterceptor {
// view까지 처리 후
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception{
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
// controller가 끝난 후
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception{
log.info("=================postHandler=================");
}
// controller로 보내기 전에 처리되는 인터셉터, 반환값이 false면 controller로 요청안함.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception{
log.info("=================preHandler=================");
return true;
}
}
interceptor 폴더를 생성하여 그 아래에 HttpInterceptor.java를 생성하였다.
InterceptorConfig
config 폴더에 InterceptorConfig.java를 생성한다.
@ComponentScan(basePackages = { "com.example.interceptor" })
Boot20230427Application.java에 위 코드를 추가한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
pom.xml에 위 코드를 추가한다.
@Component
@Aspect
@Slf4j
public class LogAspect {
// com.example.controller의 모든 Controller의 모든메소드 반응
// com.example.repository의 모든 Repository의 모든메소드 반응
@Around("execution(* com.example.controller.jpa.*Controller.*(..)) or execution (* com.example.repository.*Repository.*(..))")
public Object pringLog(ProceedingJoinPoint joinPoint) throws Throwable {
String clsname = joinPoint.getSignature().getDeclaringTypeName();
String metname = joinPoint.getSignature().getName();
String result = "";
if(clsname.contains("Controller")) {
result = " type : Controller => ";
}
else if(clsname.contains("Service")){
result = " type : Serivce => ";
}
else if(clsname.contains("Repository")){
result = " type : Repository => ";
}
else if(clsname.contains("Mapper")){
result = " type : Mapper => ";
}
result += clsname +"=>" + metname +"()";
log.info(result);
return joinPoint.proceed();
}
}
example 아래에 aop를 생성하여 LosAspect.java를 생성한다.
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"com.example.aop" })
Boot20230427Application.java에 위 코드를 추가한다.
이렇게 사용된 Controller와 Repository와 Controller가 사용된 후 처리되는 경로를 알 수 있다.