-
[AA] intercepter 세팅하기Spring Boot 2024. 5. 24. 08:55
회사내에 신규 프로젝트에 intercepter 세팅을 맡게 되었다
공부하면서 프로젝트에 반영하면서 블로그에 기록을 해보려한다
intercepter 안해본 영역이라 두려움이 있었지만
생각보다 별건 없었다
일단 디렉토리 구성은 아래 사진과 같다
디렉토리
Intercepter.java
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.log4j.Log4j2; import org.springframework.web.servlet.ModelAndView; @Log4j2 public class Intercepter extends HandlerInterceptorAdapter { @Override // 컨트롤러/핸들러 객체를 실행하기 전에 필요한 기능을 구현할 때 사용한다 /가장 많이 사용 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { boolean result = true; log.info("[preHandle] preHandle 실행중 "); log.info("[preHandle] request " + request); log.info("[preHandle] request path info" + request.getPathInfo()); log.info("[preHandle] url :: " + request.getRequestURI()); return result; } @Override // 컨트롤러/핸들러가 정상적으로 실행된 이후에 추가기능을 구현할 때 사용한다/ 잘 안씀 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // log.info(">>>>>>>>>>> 인터 셉터 2단계 <<<<<<<<<<<< url :: " + request.getRequestURI()); super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // log.info(">>>>>>>>>>> 인터 셉터 3단계 <<<<<<<<<<<< url :: " + request.getRequestURI()); super.afterCompletion(request, response, handler, ex); } }
인터셉터는 실행 단계가 크가 3가지로 분류가 된다
pre : 메서드 실행전
post : 메서드 실행 도중
after : 메서드 실행 이후
HandlerInterceptorAdapter를 extends해주면 만들어놓은 HandlerInterceptorAdapter 를 import를 하고
HandlerInterceptorAdapter의 메서드를 오버라이딩을 해준다
오버라이딩을 하면서 파라미터 값을 HttpservletRequest, HttpServletResponse, Object, Exception 을 넣어줘서 필요한 정보를 리턴한다
HttpservletRequest의 역할
요청 정보 검색:
- 요청 방법
- URL
- 쿼리 매개변수
- 헤더 및 클라이언트의 IP 주소
와 같은 요청에 대한 중요한 세부 정보를 추출하는 방법을 제공
HttpServletResponse의 역할
- HTTP 응답 메시지 생성
- 응답 코드 지정 (200, 300, 400, 500 등)
- 바디 생성 가능
- 여러 편의 기능 제공 (Content-type, Cookie, Redirect)HandlerIntercepterAdapter.java
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.servlet.AsyncHandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor { public HandlerInterceptorAdapter() { } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { } }
HandlerInterceptorAdapter 라는 라이브러리를 import하면 사용할 수 있는거 같은데 스프링 버전 문제 때문인지 라이브러리가 import가 되지 않길래
class하나를 생성하였다. intercepter 클래스에서 사용하게 될 매서드들을 정의 해두고
AsyncHandlerInterceptor를 extends를 해서 여기서 라이브러리를 import해서 사용하였다.
class 파일은 이정도로 작성하고 프로젝트 진행하면서
필요시에 intercepter를 커스텀 하거나 추가할 예정이다
그러면 이제 config
WebMvcConfig.java
import org.daeng2go.daeng2go_server.common.intercepter.Intercepter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.mvc.WebContentInterceptor; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 기본 인터셉터 registry.addInterceptor(new Intercepter()) .addPathPatterns("/**") .excludePathPatterns("/"); // 다국어 지원 인터셉터 LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("lang"); registry.addInterceptor(localeChangeInterceptor); // 캐시 컨트롤 인터셉터 WebContentInterceptor webContentInterceptor = new WebContentInterceptor(); webContentInterceptor.setCacheSeconds(0); webContentInterceptor.setUseExpiresHeader(true); webContentInterceptor.setUseCacheControlHeader(true); webContentInterceptor.setUseCacheControlNoStore(true); registry.addInterceptor(webContentInterceptor).addPathPatterns("/main/**"); } // 커스텀 인터셉터 클래스 정의 @Bean public Intercepter Intercepter() { return new Intercepter(); } }
WebMvcConfig 파일에 인터셉터에 관한 설정을 해준다
WebMvcConfig 클래스에 @Configuration 어노테이션을 붙혀서 정의해주고,
WebMvcConfig에 WebMvcConfigurer를 implements해주고 해당 라이브러리를 활용해주었다.
WebMvcConfigurer 라이브러리에 있는 addInterceptors 메서드를 오버라이딩하며면서 필요한 부분을 커스텀 설정해주었다.
위와 같이 설정을 해두면 매서드가 실행되기 전, 구동중일때, 메서드 실행 후 에 intercepter 처리를 할수 있다
현재 위 코드로는 메서드 실행 전에 intercepter가 실행되며 log로 uri 정보가 기록되게 해서 확인이 가능하다
'Spring Boot' 카테고리의 다른 글
[MyBatis] User CRUD 구현하기 - C (Create) (0) 2024.05.26 [Mybatis] Cause: java.sql.SQLException: 부적합한 열 유형: 1111 (0) 2024.05.26 [AA] CustomExeption (0) 2024.05.23 [JavaScript] 스크롤 막기 함수 (0) 2024.05.07 addFlashAttribute 활용 - 팝업알림 띄우기 (0) 2024.05.07