본문 바로가기
코드프레소 체험단

[라이브강의] 2022-03-30 (spring boot filter and interceptor)

by 의정부핵꿀밤 2022. 4. 6.
728x90

Spring Boot Filter and Interceptor

 

Spring의 Request/Response 구조

위와 같이 요청 하나에도 스프링 내부에선 수많은 레이어를 지나서 요청이 수행된다!

  • 클라이언트로부터 요청이 들어오면 해당 요청은 먼저 Filter를 거치게 된다
  • 그리고 DispachServlet을 거쳐서 Contoller 레이어로 넘어가게 된다
  • Controller layer
    • 먼저 HandlerInterceptor에 요청이 넘어간다
    • 그리고 Handler로 넘어가는데, 이는 우리가 알고 있는 실제 controller의 역할을 하게 된다 (@RequestMapping을 통해 매핑하는 역할을 Handler가 한다)
  • View 레이어의 ViewResolver에서 view를 Mapping한다

 

 

 

종단 관심사와 횡단 관심사(Cross Cutting Concerns)

  • 관심사 (Concerns)
    • 관심사란, 컴퓨터 프로그램 코드에 영향을 미치는 정보의 집합이다
    • 컴퓨터 과학에서 관심사 분리(separation of concerns, SoC)는 컴퓨터 프로그램을 구별된 부분으로 분리시키는 디자인 원칙(설계 원칙)으로, 각 부문은 개개의 관심사를 해결한다
    • 즉, SoC는 컨트롤러/비즈니스(애플리케이션)/데이터 액세스 레이어로 분리하는 것을 의미한다
    • 모듈을 만들어 로직을 분리하는 것이다
    • 관심사 분리를 이용하면 프로그램의 설계, 디플로이, 이용의 일부 관점에 더 높은 정도의 자유가 생긴다

 

 

종단 관심사와 횡단 관심사

  • 종단 관심사
    • 특정 기능과 관련된 관심사
    • Presentation Layer, Business Layer, Data Access Layer
  • 횡단 관심사
    • 모든 Layer에 걸쳐 공통적으로 필요한 관심사
    • 모든 종단 관심사에 걸쳐 필요한 처리
    • 로깅, 캐싱 등..

 

 

 

 

Spring에서 횡단 관심사를 구현하는 방법

  • HTTP Request, REST API 레벨의 횡단 관심사 - 실제 controller가 수행되기 전에 수행됨
    • Filter
    • HandlerInterceptor
  • Method 레벨의 횡단 관심사 - 특정 메소드에 대해 공통적으로 로직을 추가하는 방법
    • Aspect Oriented Programming(AOP) 

 

 

 

Filter vs HandlerInterceptor

  • 모든 요청이 들어오면 controller가 실행되기 전에 필터나 인터셉터를 통해 특정 동작을 수행한다
  • 필터
    • 여러개가 존재할 수 있다
    • 로깅, 인증(Authentication), 인가(Authorization) 등..
  • DispatcherServlet
    • request를 어떤 controller method로 넘길지 선택해주는 역할을 한다

 

 

 

Filter

  • Servlet 컨테이너와 Dispatcher Servlet 사이에서 실행됨
  • Filter 인터페이스를 구현
  • doFilter 메소드에서 Filter에서 수행될 코드를 구현
  • 목적별로 다수의 Filter가 수행 가능
    • Loggin Filter, Authenticating Filter, ...
    • Filter의 순서 지정 가능

 

 

서버

  • 물리적 서버 - 리눅스 서버
  • 웹서버 - nginx (정적인 파일 처리)
  • WAS - tomcat (프로그램을 돌릴 수 있는 서버)

 

 

 

Filter 실습

  • LoggingFilter의 생성 및 구현
  • AuthenticateFilter의 생성 및 구현
  • @Order 설정
  • HttpServletRequest 클래스의 멤버 변수 호출
  • AuthenticateFilter에서 Service 레이어 메소드 호출

(실습 파일은 0330 라이브강의에 있음! 나중에 혼자 하면서 복습해보기!)

 

 

 

HandlerInterceptor

  • DispatchServle과 Handler(Controller) 사이에서 실행
  • HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdopter를 상속
  • 총 3개의 메소드를 오버라이딩한다
    • preHandler() : Controller가 호출되기 전에 실행
    • postHandle() : Controller가 종료된 후 실행
    • afterCompletion() : View에 Model이 렌더링 되고 난 후 실행

 

 

HandleInterceptor 실습

  • LoggingInteceptor 생성 및 구현
  • Config 클래스에서 Interceptor 등록
  • log 출력 정보로 호출 순서 확인

(이것도 실습 코드 참고!)

 

 

 

 

728x90

댓글