👩🏻‍💻 Programming/SpringBoot

SpringBoo와 Filter, 그리고 Interceptor (1)

한국의 메타몽 2021. 8. 16. 03:32

 

쉽게 이해해보자 - Filter - Interceptor - AOP

 

웹을 개발하다보면 공통적으로 처리해야 할 업무들이 많다.

예를 들어 로그인 관련(세션) 처리, 권한 체크, PC와 모바일 웹의 분기 처리, 페이지 인코딩 등등이 있다.

이러한 공통 업무들은 하나의 페이지가 아니라 여러 페이지에 공통적으로 적용된다.

공통 업무들의 코드를 모든 페이지에 적용한다면 중복 코드가 많아지게 되고

프로젝트 단위가 커질수록 서버에 부하를 줄 수 있으며, 소스 관리조차 어려워지게 된다.

 

때문에 공통 코드 부분은 따로 빼서 관리하는 것이 좋다.

이러한 공통 업무를 프로그램 흐름의 앞, 중간, 뒤에 추가해서 자동으로 처리할 수 있는 방법이 크게 3가지가 있다.

 

  1. Filter
  2. Interceptor
  3. AOP

  

위 3가지는 각각 다른 특징들을 가지고 있다.

 

 

  1. 적용 시점이 다르다
    :  Filter -> Interceptor -> AOP -> Interceptor -> Filter

  2. 적용 방식이 다르다
    : Filter - web.xml, Interceptor - servlet-context.xml

  3. 실행 형식이 다르다
    : Interceptor와 Filter는 Servlet 단위에서 실행되는 반면, AOP는 메소드 앞에 Proxy 형태로 실행된다.

 

 

 

정확히 이해해보자 - Filter

 

Filter란 Web Application에서 관리되는 영역으로써, Spring Boot Framework에서는 Client로부터 오는 요청 / 응답에 대해서 최초 / 최종 단계의 위치에 존재하며, 이를 통해서 요청 / 응답의 정보를 변경하거나 spring에 의해서 데이터가 변환되기 전의 순수한 Client의 요청 / 응답 값을 확인 할 수 있다. 때문에 유일하게 ServletRequest, ServletResponse의 객체를 변환할 수 있다.

 

주로 Spring Framework에서는 Request / Response의 Logging 용도로 활용하거나, 인증과 관련된 Logic들을 해당 Filter에서 처리한다. 이룰 선 / 후 처리함으로써 Service Business Logic과 분리시킨다.

 

왼쪽 붉은 상자가 Filter, 오른쪽 붉은 상자가 Interceptor다.

 

[실행 메소드]

 

  • Init() - 필터 인스턴스 초기화
  • doFilter() - 전 / 후 처리
  • destroy() - 필터 인스턴스 종료

 

 

예시코드의 디렉토리 구조

 

 

[예시코드]

(1) ApiController.java

@Slf4j // logging을 위한 롬복. 이제 하나하나 System.out.println안해도 된다.
@RestController
@RequestMapping("/api/user")
public class ApiController {
    @PostMapping("")
    public User user(@RequestBody User user){
        log.info("User : {}" ,user); // System.out.println 대체
        return user;
    }

}

(2) GlobalFilter.java

@Slf4j
@Component
public class GlobalFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
        // 전처리 (Request)
        ContentCachingRequestWrapper httpServletRequest  = new ContentCachingRequestWrapper((HttpServletRequest)request);
        ContentCachingResponseWrapper httpServletResponse = new ContentCachingResponseWrapper((HttpServletResponse)response);

        // doFlter를 기점으로 전 / 후 처리
        chain.doFilter(httpServletRequest,httpServletResponse);
        String url = httpServletRequest.getRequestURI();

        // 후처리 (Response)
        String reqContent = new String(httpServletRequest.getContentAsByteArray());
        log.info("request url : {}, request body : {}", url, reqContent);

        String resContent = new String(httpServletResponse.getContentAsByteArray());
        int httpStatus = httpServletResponse.getStatus();

        httpServletResponse.copyBodyToResponse(); // Body내용을 읽고 모두 다 빼버려서 다시 한번 copy해서 넣어준다. 그래야 client도 return된 body를 확인할 수 있다.

        log.info("response status : {}, responseBody : {}", httpStatus, resContent);
    }
}

* ContentCachingRequestWrapper / ResponseWrapper을 통해 Request body와 Reponse body의 데이터를 캐치하여 로그를 남길 수 있다.

 

 

(3) ApiController

@Slf4j
@RestController
@RequestMapping("/api/user")
public class ApiController {
  @PostMapping("")
  public User user(@RequestBody User user){
    log.info("User : {}", user);
    return user;
  }
}

 

[결과]

먼저 ApiController에 있는 User객체의 로그를 출력한 뒤, Request에 대한 전처리와 Response에 대한 후처리가모두 이루어졌음을 확인할 수 있다.

 

 

참고 출처

 

김백개발자 - [카카오 면접] Spring Filter, Interceptor, AOP

 

[Spring] Filter, Interceptor, AOP 차이 및 정리

[Spring] Filter, Interceptor, AOP 차이 및 정리 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [Spring] 필터, 인터셉터, AOP 정리 ] 입니다. : ) 공통 프로세스에 대한 고민 자바 웹 개발을 하다보면, 공통..

goddaehee.tistory.com

 

망나니 개발자 - [Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도

 

[Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도

Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보고자

mangkyu.tistory.com

 

'👩🏻‍💻 Programming > SpringBoot' 카테고리의 다른 글

Spring과 비동기 처리  (0) 2021.08.16
Spring과 Filter - Interceptor (2)  (0) 2021.08.16
Spring Boot와 Validation (1)  (0) 2021.08.11
Bean vs Component  (0) 2021.08.10
AOP (Aspect Oriented Programming)  (0) 2021.08.10