spring interceptor란, spring boot custom interceptor 라이브러리 만들기, spring boot custom interceptor 적용
spring interceptor란?
spring interceptor를 한마디로 정의하면 request를 가로채서 추가적인 로직을 수행할 수 있도록 하는 요소입니다.
spring에서의 Interceptor가 있을때의 처리방식은 아래 그림과 같습니다.
(Handler Interceptor 부분입니다)
- client에서 웹서버로 호출
- dispatcher servlet을 통해 request를 Handler Interceptor로 넘김.
- Handler Interceptor의 Prehandle 메소드 로직수행후, Handler -> controller로 request를 넘김.
- controller에서 처리가 완료되면, Handler Interceptor의 posthandle 메소드에서 로직처리.
- dispatcher Servlet에서 response를 client에게 보내줌
- AfterCompletion메소드 로직처리
intercept의 사전뜻을 찾아보면 아래와 같습니다.
1)(남의 물건 등을) snatch, steal; (중간에서) intercept
2) (금전·권리 등을) (횡령하다) embezzle, (formal) misappropriate; (권리·지위 등을) (formal) usurp
3) (남의 말을) interrupt, cut in, (informal) butt in
공통적으로, 무엇인가를 가로챈다는 의미를 갖고 있습니다.
마찬가지로, spring interceptor도 무엇인가를 가로챈다는 뜻으로 이해하면 됩니다 .
spring custom interceptor 만들기
- 전제조건 : Java, 이클립스, maven 이 설치된 환경에서 수행합니다.
- 이클립스를 켠 상태에서 project explorer에서 우측버튼을 누른 후,
new > other을 선택합니다. - select a wizard중 Maven 폴더의 Maven Project를 선택후, next를 누릅니다.
- 아래와 같이 create a simple project 를 체크하고,
workspace를 지정해줍니다. (프로젝트가 위치할 경로입니다.)
next를 누릅니다. - 프로젝트에 대한 정보를 기입합니다.
group id와 artifact id 는 필수적입니다.
group id 는 모든 프로젝트 사이에서 고유하게 식별해주는것으로,
제작자가 컨트롤할 수 있는 도메인 네임이어야 합니다.
패키지 명명 규칙을 따르며, 보통 com.{회사이름}.xx 식으로 많이 사용합니다.
artifactid는 버전 정보를 생략한 jar 파일의 이름입니다.
저의 경우는 아래와 같이 입력하였습니다. - 새로 만들어진 프로젝트에서, 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 적용하기
- custom interceptor를 적용하려는 프로젝트 > 우측클릭 BuildPath > Configure BuildPath를 선택해줍니다.
- Java Build Path에서 Project 탭을 선택후, Custom interceptor를 생성한 프로젝트를 선택해줍니다.
이제 이 프로젝트를 빌드하면 custom interceptor도 빌드가 됩니다. - 그 다음, pom.xml 의 dependencies에 아래 내용을 추가해줍니다.
4. InterceptorConfig 클래스를 만들어, 아래와 같이 작성해줍니다.
실행결과
- 테스트를 위해 임의의 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,#스프링,#커스텀,#필터
'자바,스프링 - Java,Spring Framework' 카테고리의 다른 글
Java 주요 버전별 spring / spring boot 호환성 (0) | 2024.08.04 |
---|---|
Java generic method, 자바 제네릭 메소드 예제, 제네릭 메소드 static (0) | 2024.07.29 |
스프링부트 라이브러리 만들기, spring boot auto configuration, 공통 exception 처리 라이브러리 만들기 (2) | 2023.10.19 |
Java UUID란, Java UUID 중복, Java UUID 자리수, Java UUID 길이 줄이기 (1) | 2023.10.15 |
java 시간측정코드, 자바 시간측정코드, 시간, 측정, 예제코드 (1) | 2023.06.26 |
댓글