[SpringBoot] Interceptor 사용하는 방법
- Web/SpringBoot
- 2022. 3. 26.
SpringBoot, Interceptor 사용하기
Interceptor
Interceptor은 BackEnd, Server부분에서 알아두면 좋은 기술이다.
각 회사마다 지켜주는 사람이 있듯이, Server에 접근할 때 권한 여부를 판독하는 기능 중 하나가 Interceptor이다.
대표적으로 사용예시는 로그인 여부, 권한 체크 등이 있다.
Controller의 Error를 미리 잡아주며, 유효성 검사에도 도움이 된다.
이 기능의 활용이 login check여부이다.
반드시 사용할 필요는 없지만, 객체지향 프로그램(OOP)의 장점을 아주 잘 활용한 예시라고 생각되며 중복된 코드를 최소화시킬 수 있어서 애용하는 기능 중 하나이다.
사용하기 위해서는
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring에서는 spring-web을 SpringBoot에서는 spring-boot-starter-web이 있다.
Spring 설정 시, 기본적으로 설치되는 lib이므로 없는 경우가 거의 없다싶이 한 lib이다.
이 설명은 최소 Spring이상부터 가능하다.
Class 구조
Interceptor을 사용하기 위해서는 xml 설정과 class 설정이 있는데, 필자는 class 설정을 활용하였다.
2개의 class로 구분하였으며, WebConfig가 Interceptor의 위치를 안내해주는 역할을 제공한다.
Class의 작명은 임의로 작성하여도 상관없다.
WebConfig.class
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
//.addPathPatterns("/**"); // Interceptor 적용 대상
.excludePathPatterns("/js/**", "/css/**", "/images/**","/error","/favicon.ico"); // Interceptor 적용대상 아님. (List를 통해서 경로 설정 가능)
}
}
InterCeprot을 사용하기 위해서는 먼저 @Configuration의 annotation설정을 해야 한다.
그 후 WebMvcConfigurer를 상속받으면 된다.
이 기능은 원래 제공하고 있으나, Java에서 배웠던 기술 중 하나 Override를 통해서 우리가 원하는 형태로 바꿀 수 있게 도와준다.
이 부분이 바로 Interceptor의 이동 여부를 체크하는 구간이다.
addInterceptor은 method명 그대로 Interceptor의 생성을 의미한다.
우리가 만든 Interceptor을 등록하면 된다.
아래의 method는 각각 addPathPatterns와 excludePathPatterns가 있다.
Method 명 | 매개변수 Type | 기능 |
addPathPatterns | String, String [] | Interceptor 적용 대상 |
excludePathPatterns | String, String [] | Interceptor 제외 대상 |
적용 대상 및 제외대상으로 구분이 가능하다. 매개변수는 쉼표를 통해 여러 개로 구분 가능하며 또는 배열로 별도로 만들어서 넣을 수도 있다.
※ /**는 전체를 의미한다.
LoginInterceptor.class
package com.union.construction_web.interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor extends HandlerInterceptorAdapter {
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle) throws Exception {
log.info("============= construction_web =============");
log.info("Request URI ==> :"+request.getRequestURI());
log.info("============================================");
return true;
}
}
Interceptor은 HandlerInterceptorAdapter을 상속으로 받고 끝난다.
method 명 | method type | return type | 기능 |
preHandle | request, response, handle | boolean | Controller 진입 전 실행 |
postHandle | request, response, handle | boolean | Controller 진입 후 실행 |
각 method로 Interface의 사용은 매우 자유롭다.
이를 통해서 Interceptor에서 기능을 구사하면 된다.
마무리
Interceptor의 활용은 로그인 체크 여부, IP 체크, 권한 체크 등 다양하다.
필자도 Interceptor을 활용하여 code를 작성하지만 너무 큰 기능을 남발했다가는 메모리 문제가 걸릴까 봐 무식하게 적지는 못하는 영역이기도 하다.
1. 코드 구분이 쉬워진다.
2. 개발 및 유지보수가 편해진다.
3. log관리가 수월하다.
4. 유효성 검사에 매우 효과적이다.
5. error를 사전에 차단한다.
1. 설정 설계가 까다롭다.
2. 기능을 남발할 경우, 전체적으로 문제가 생긴다.
'Web > SpringBoot' 카테고리의 다른 글
[SpringBoot] Logback 설정하기 (0) | 2022.06.27 |
---|---|
[SpringBoot] JPA 연동하기 (0) | 2022.06.16 |
[SpringBoot] API방식, File Upload 하기 (0) | 2022.03.11 |
[SpringBoot] API 활용하기 (0) | 2022.03.11 |
[SpringBoot] Test, JUnit 생성하기 (0) | 2022.03.09 |