본문 바로가기
Java Web/Spring Boot

[Spring Boot] 인터셉터 (Interceptor) ★

by 스응 2023. 4. 13.
728x90
728x90

인터셉터 (Interceptor)

  - 요청을 처리하기 전과 후에 실행되는 코드

  - 컨트롤러에 도달하기 전과 후에 사용자 지정 작업을 수행할 수 있음

 

  - Filter와 매우 유사한 형태

      → 차이점 : Spring Context에 등록되고, Spring Container에서 동작함

                          (Filter는 WAS에서 동작)

      · 필터는 인증 과정에서 로깅 정도로만 사용함

         (어떤 데이터가 들어 있는지 등)

  - AOP와 유사한 기능 제공

      : 선/후 처리함으로써, 비즈니스 로직과 분리시킴

  - 용도

      · 인증 단계 처리

      · 로깅, 인가, 데이터 변환 등의 공통 작업 수행

  - 필요에 따라 인터셉터를 여러 개 등록하거나, 특정 경로/패턴에만 적용할 수도 있음

#  DispatcherServlet (디스패쳐 서블릿)

  - 클라이언트가 어떤 요청을 했을 때, 스프링 컨테이너의 제일 앞에서 요청을 먼저 받아서

    적합한 컨트롤러에게 요청을 위임해준느 프론트 컨트롤러

 

 

반응형
728x90

인터셉터 구현 방법

  - 예시 코드 : https://young0105.tistory.com/201

1. HandlerInterceptor 인터페이스의 구현 클래스 정의

  · Spring Boot MVC에서 제공하는 인터셉터

  · AOP 개념과 다르게, 서블릿 필터처럼 동작함

  · 클라이언트의 요청이 컨트롤러에 도달하기 전에 인터셉터 요청/응답을 가로채어 필요한 로직을 수행할 수 있음

 

  1) preHandle() 메서드

      - 컨트롤러가 실행되기 전에 호출되는 메서드

      - 요청을 가로채서 필요한 작업을 수행한 후, 요청 처리가 계속되어야 하는지 여부 결정

          · return true; : 요청 처리 계속 (Controller 메서드로 넘어감)

          · return false; : 요청 처리 중단 (Controller 메서드로 넘어가지 않음)

    - 활용 예시 : 인증 검사

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
public class AuthInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    
        // 인증 검사
        HttpSession session = request.getSession();
        User principal = (User) session.getAttribute(Define.PRINCIPAL);
        if (principal == null) {
            
            // 사용자 정의 예외 클래스 활용
            throw new UnAuthorizedException("로그인 후 이용해주세요.", HttpStatus.UNAUTHORIZED);
                
        }
            
        return true;
    }
}
cs

 

  2) postHandle() 메서드

      - 컨트롤러 실행 후 호출되지만, 뷰가 렌더링되기 전에 호출되는 메서드

      - 컨트롤러가 요청을 처리한 후에, 필요한 후처리 작업을 수행함

 

  3) afterCompletion() 메서드

      - 요청 처리가 완료되고, 뷰가 렌더링된 후에 호출되는 메서드

      - 자원 정리, 추가 로깅 등의 작업을 수행함

  

  #  순서 : preHandle() → Controller 메서드 → postHandle() → afterCompletion()

 

2. WebMvcConfigurer 인터페이스의 구현 클래스 정의 & 1번에서 정의한 클래스 등록

  - addInterceptors() 메서드 오버라이드 

      → 인터셉터 인스턴스 등록

  - 활용 예시

      : 인증이 필요한 페이지에 대해서만 인터셉터를 적용함

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
    @Autowired
    private AuthInterceptor authInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/account/**")
                .addPathPatterns("/auth/**"); // 다중 path 추가 가능
        
        // 추가 인터셉터 등록 가능
        // registry.addInterceptor(new AdminInterceptor());
    }
}
cs
320x100
반응형

댓글