Spring 강의 day 16

주세환·2023년 5월 19일
0

Spring

목록 보기
16/18

Interceptor

InterceptorConfig

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에 위 코드를 추가한다.


aop

LosAspect

<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가 사용된 후 처리되는 경로를 알 수 있다.

0개의 댓글