반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 메이븐 라이프사이클
  • 추상 팩터리 패턴
  • 슬로우 쿼리
  • 작업기억공간
  • 플라이웨이트패턴
  • 서버리스 컴퓨팅
  • 참조 해제
  • 도커공식문서
  • item7
  • Java
  • 싱글톤 패턴
  • 이펙티브 자바 item9
  • 빈 검증
  • Next.js
  • 자료구조
  • 알고리즘
  • 디자인패턴
  • 자바
  • 자바 디자인패턴
  • next js app
  • 싱글톤
  • bean Validation
  • rust
  • 러스트
  • 자바스크립트 인터뷰
  • serverless computing
  • 자바스크립트
  • item9
  • 이펙티브 자바
  • 느린 쿼리
  • 자바 검증
  • pnpm
  • Pre-rendering
  • 외래키 제약조건
  • 싱글턴
  • Javadoc 자바독 자바주석 주석 Comment
  • 객체복사
  • 스프링 검증
  • 토비의 스프링
  • 이펙티브자바
  • MSSQL
  • NEXT JS
  • 메이븐 골
  • prerendering
  • 팩터리 메서드 패턴
  • 자바스크립트 면접
  • item8
  • 메이븐 페이즈
  • try-with-resources
  • 프로그래머의 뇌

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

Java/자바 잡지식

스프링의 Interceptor 란 무엇일까? [공식문서 번역]

2022. 5. 4. 17:07

인터셉터(HandlerInterceptor) 란?

커스터마이즈된 핸들러 실행 체인을 허가하는 워크플로우 인터페이스이다. 애플리케이션은 이미 존재하는 인터셉터 혹은 커스텀 인터셉터를 특정한 그룹에 추가할 수 있다. 공통적인 전처리 행위를 추가하기 위해 각 핸들러 구현을 수정할 필요는 없다. (다만 새롭게 추가하면 된다.)

HandlerInterceptor는 적절한 HandlerAdapter가 핸들러를 수행하기 전에 호출된다. 전처리 관점에서 꽤 많은 범위에 사용될 수 있는 매커니즘이다. 이를테면 권한 체크, 언어 설정, 테마 설정 등 공통 핸들러 행위가 있다. 반복되는 핸들러 코드를 뽑아내는 것(factoring out repetitive handler code)이 주 목적이다.

비동기 처리 시나리오에서는 메인 스레드가 렌더링 postHandle, afterCompletion 콜백의 호출 없이 종료되는 동안 핸들러는 각 스레드에서 실행될 것이다. 동시에 작동하는 핸들러 실행이 끝날 때, 요청은 모델을 렌더링하기 위해 다시 되돌아간다. 그리고 모든 메서드가 다시 호출된다. org.springframework.web.servlet.AsyncHandlerInterceptor 를 참조하자.

일반적으로 인터셉터 체인은 HandlerMapping 빈 당 하나가 정의되어 그 세분성을 공유한다. 핸들러 그룹에 특정한 인터셉터 체인을 적용하기 위해서는 HandlerMapping 빈을 통해 원하는 핸들러에 매핑이 필요하다. 인터셉터 자체도 애플리케이션에 빈으로 정의된다. 그리고 매핑 빈 정의에 의해 참조된다. XML 에서는 <ref> 의 <list> 에 interceptors 라는 프로퍼티를 통해 이루어진다.

HandlerInterceptor 는 기본적으로는 ServletFilter 와 비슷한데, ServletFilter와 달리 핸들러 자체의 실행을 금지하는 옵션과 함께 커스텀 전처리를 허용하고 커스텀 후처리를 허용한다. 필터는 인터셉터보다 강력하다. 이를테면 체인에 전달되는 request 와 response 를 교환할 수 있다. filter 는 web.xml 에서 설정된다. HandlerInterceptor 는 application context 에서 설정된다.

인터셉터에 대한 기본 지침은 핸들러와 관련된 전처리 작업은 HandlerInterceptor 구현 후보이다. 특히 공통 핸들러 코드나 권한 체크같은 것들을 생각해볼 수 있다. 필터는 멀티파트 폼이나 GZIP 압축 같은 요청 컨텐츠 혹은 뷰 컨텐츠 핸들링에 잘 맞는다. 이 때는 필터를 특정한 컨텐츠 타입(ex. 이미지) 혹은 모든 요청에 매핑이 필요하다.

인터셉터의 메서드

스프링에서 인터셉터를 구현하려면, HandlerInterceptor 인터페이스에서 상속받은 메서드 시그니처들을 구현하면 된다.

preHandle

default boolean preHandle(HttpServletRequest request,
                          HttpServletResponse response,
                          Object handler)
                   throws Exception;

핸들러 수행 전의 인터셉션 포인트이다. HandlerMapping 이 적절한 핸들러 오브젝트를 결정한 이후에 HandlerAdapter 가 핸들러를 호출하기 전에 호출된다. DispatcherServlet 는 수많은 인터셉터를 포함하는 실행 체인에서 핸들러를 처리하며, 핸들러 자체는 마지막에 처리한다. 이 메서드를 이용해 커스텀 응답이나 HTTP 에러를 보낸 뒤에 실행 체인을 중지시키도록 결정할 수도 있다. (이를 이용해 권한처리도 할 수 있다.)

비동기 요청 프로세싱을 적용할 수도 있다. 이는 비동기 핸들러 인터셉터에서 자세한 정보를 알아볼 수 있다.

기본 구현은 true 를 반환한다. true 인 경우 다음 실행 체인을 이어서 진행한다.

파라미터

  • request, response, handler

반환 값

  • true 면, 다음 인터셉터 혹은 핸들러를 진행한다. true 가 아니라면, DispatcherServlet 은 응답에 대한 처리가 끝났다고 가정한다.

postHandle

default void postHandle(HttpServletRequest request,
                        HttpServletResponse response,
                        Object handler,
                        @Nullable
                        ModelAndView modelAndView)
                 throws Exception

핸들러의 성공적인 수행이 끝난 후의 인터셉션 포인트이다. HandlerAdapter 가 핸들러를 수행한 이후이며, DispatcherServlet이 뷰를 렌더하기 전이다. ModelAndView 객체를 통해 추가적인 모델 오브젝트를 뷰에 더 노출할 수 있다.

DispatcherServlet 은 많은 인터셉터를 포함하는 실행 체인에서 핸들러 처리를 하고, 핸들러 자체는 마지막에 처리한다. 이 메서드로 각 인터셉터는 실행 후처리를 할 수 있다. 실행 체인의 역순으로 적용된다.

비동기 요청 프로세싱을 적용할 수도 있다. 이는 비동기 핸들러 인터셉터에서 자세한 정보를 알아볼 수 있다.

기본 구현은 empty이다.

파라미터

  • request, response, handler, modelAndView

afterCompletion

default void afterCompletion(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler,
                             @Nullable
                             Exception ex)
                      throws Exception

요청 프로세싱의 완료 이후, 뷰 렌더링 이후 콜백이다. 핸들러 실행의 어떤 결과에 따라 호출된다. 적절한 리소스 정리를 허용한다.

preHandle 메서드가 성공적으로 완료되고, true 를 반환했다면, 호출될 것이다.

postHandle 메서드처럼, 메서드가 체인에서 역순으로 각 인터셉터에 대해 호출될 것이다. 첫번째 인터셉터가 가장 나중에 호출될 것이다.

비동기 요청 프로세싱을 적용할 수도 있다. 이는 비동기 핸들러 인터셉터에서 자세한 정보를 알아볼 수 있다.

기본 구현은 empty 이다.

파라미터

  • request, response, handler, ex(exception)

레퍼런스

스프링 공식문서 - HandleInterceptor

반응형
저작자표시 (새창열림)

'Java > 자바 잡지식' 카테고리의 다른 글

javadoc 한글 깨짐 문제 해결  (0) 2022.05.15
Filter, Interceptor, AOP 알아보기  (0) 2022.05.10
자바 EE 필터 (Filter) 란?  (0) 2022.05.04
스프링의 @Value 애노테이션이란?  (2) 2022.05.01
DTO (Data Transfer Object) 란?  (0) 2022.04.27
    'Java/자바 잡지식' 카테고리의 다른 글
    • javadoc 한글 깨짐 문제 해결
    • Filter, Interceptor, AOP 알아보기
    • 자바 EE 필터 (Filter) 란?
    • 스프링의 @Value 애노테이션이란?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바