본문 바로가기
자바,스프링 - Java,Spring Framework

spring interceptor란, spring custom interceptor 라이브러리 만들기, spring custom interceptor 적용

by devscb 2023. 10. 22.
반응형

spring interceptor란, spring boot custom interceptor 라이브러리 만들기, spring boot custom interceptor 적용

spring interceptor란?

spring interceptor를 한마디로 정의하면 request를 가로채서 추가적인 로직을 수행할 수 있도록 하는 요소입니다.

spring에서의 Interceptor가 있을때의 처리방식은 아래 그림과 같습니다.
(Handler Interceptor 부분입니다)

  1. client에서 웹서버로 호출
  2. dispatcher servlet을 통해 request를 Handler Interceptor로 넘김.
  3. Handler Interceptor의 Prehandle 메소드 로직수행후, Handler -> controller로 request를 넘김.
  4. controller에서 처리가 완료되면, Handler Interceptor의 posthandle 메소드에서 로직처리.
  5. dispatcher Servlet에서 response를 client에게 보내줌
  6. AfterCompletion메소드 로직처리

intercept의 사전뜻을 찾아보면 아래와 같습니다.
1)(남의 물건 등을) snatch, steal; (중간에서) intercept
2) (금전·권리 등을) (횡령하다) embezzle, (formal) misappropriate; (권리·지위 등을) (formal) usurp
3) (남의 말을) interrupt, cut in, (informal) butt in
공통적으로, 무엇인가를 가로챈다는 의미를 갖고 있습니다.
마찬가지로, spring interceptor도 무엇인가를 가로챈다는 뜻으로 이해하면 됩니다 .

spring custom interceptor 만들기

  1. 전제조건 : Java, 이클립스, maven 이 설치된 환경에서 수행합니다.
  2. 이클립스를 켠 상태에서 project explorer에서 우측버튼을 누른 후,
    new > other을 선택합니다.
  3. select a wizard중 Maven 폴더의 Maven Project를 선택후, next를 누릅니다.
  4. 아래와 같이 create a simple project 를 체크하고,
    workspace를 지정해줍니다. (프로젝트가 위치할 경로입니다.)
    next를 누릅니다.
  5. 프로젝트에 대한 정보를 기입합니다.
    group id와 artifact id 는 필수적입니다.
    group id 는 모든 프로젝트 사이에서 고유하게 식별해주는것으로,
    제작자가 컨트롤할 수 있는 도메인 네임이어야 합니다.
    패키지 명명 규칙을 따르며, 보통 com.{회사이름}.xx 식으로 많이 사용합니다.
    artifactid는 버전 정보를 생략한 jar 파일의 이름입니다.
    저의 경우는 아래와 같이 입력하였습니다.
  6. 새로 만들어진 프로젝트에서, pom.xml를 아래와 같이 작성해줍니다.
    filter를 만드는데 필요한 라이브러리들을 포함합니다.
 
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.devscb.filter</groupId>
  <artifactId>common-lib</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
 
 <properties>
  <targetJdk>1.8</targetJdk>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
 </properties>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.7.10</version>
 </parent>
 <dependencies>
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 </dependencies>
</project>

7.  CustomInterceptor.java파일을 만들어줍니다.

적절한 패키지명을 지어서 만들어 줍니다.
이번 예제에서는 com.test.filter.interceptor 패키지 아래에
CustomInterceptor.java를 위치시키도록 하겠습니다.

 

8. CustomInterceptor.java의 내용은 아래와 같습니다.
preHandle과 postHandle은 controlller를 거치기 전/후에 각각 실행됩니다.

chain.doFilter 를 호출하여 서블릿이 실행되도록 합니다.

 
package com.test.filter;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.HandlerInterceptor;
public class CustomInterceptor implements HandlerInterceptor   {
   private org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());
   
   Map<String, Object> startLogMap = new HashMap<String, Object>();
   Map<String, Object> endLogMap = new HashMap<String, Object>();
 
   
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
     throws Exception {
      System.out.println("pre handle");
      return true;
   }
   

   public void postHandle(
     HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
     throws Exception {
    System.out.println("post handle");
   }
}

custom interceptor 적용하기

  1. custom interceptor를 적용하려는 프로젝트 > 우측클릭 BuildPath > Configure BuildPath를 선택해줍니다.
  2. Java Build Path에서 Project 탭을 선택후, Custom interceptor를 생성한 프로젝트를 선택해줍니다.
    이제 이 프로젝트를 빌드하면 custom interceptor도 빌드가 됩니다.
  3. 그 다음, pom.xml 의 dependencies에 아래 내용을 추가해줍니다.

 

 

4. InterceptorConfig 클래스를 만들어, 아래와 같이 작성해줍니다.

 

실행결과

  1. 테스트를 위해 임의의 controller를 만들어보겠습니다.
    아래와 같이 TestController를 만들어보았습니다.
     

 

추가적으로, Application.java 파일을 만들어 프로젝트를 실행하겠습니다.

 
 

2. 프로젝트를 실행후,
/test 를 브라우저에서 접근을 하면 콘솔창에 아래와 같은 결과가 나오게 됩니다.

예제 소스파일

해당 글의 내용이 중 이해가 안 되는 부분이 있을수 있어,
아래에 전체 소스파일을 첨부로 남깁니다.
https://github.com/scsoft-adm/attachment/blob/main/customfilter_example.zip

총평

spring fraemwork 에는 다양한 컴포넌트들이 존재합니다.
다양한 컴포넌트들은 재사용될 수 있으나,
인터넷에 나와있는 대부분의 정보들은 재사용에 대한 이야기는 잘 없었습니다.
대부분은 spring framework 프로젝트 하나를 만드는 내용만 소개를 하더군요.
다수의 사람들이 여러개의 모듈을 개발하는 구조로 설계를 하려면
재사용이 가능한 컴포넌트를 쉽게 만들고, 쉽게 사용할 수 있게 하여야 하는데
이 부분에 대한 설명을 찾기가 쉽지 않은거 같습니다.
이 글을 쓰게 된 이유도, interceptor라는 spring의 컴포넌트를 재사용하려고 하는데요,
이것에 대한 가이드가 공식문서로도 찾아보기 힘들어서 쓰게 되었습니다.
저처럼 여러 모듈에서 공통적으로 사용해야하는 모듈을 개발해야하는 분들께 도움이 되었기를 바랍니다.

#spring,#filter,#custom,#스프링,#커스텀,#필터

 

https://devscb.com/post/184

 

Spring Interceptor, Create a Spring Custom Interceptor Library, Apply a Spring Custom Interceptor

“Spring Interceptor, Create a Spring Custom Interceptor Library, Apply a Spring Custom Interceptor” What is a Spring Interceptor?Defining a spring interceptor in one word is an element that allows yo

devscb.com

 

728x90
반응형

댓글