2025. 2. 26. 23:55ㆍBackend/Spring
개요
이번 과제에서 Spring Interceptor 를 사용을 하게 되면서 Spring 의 흐름은 어떻게 되는지 알게되어서 글을 남긴다.
기본 배경
가장 먼저 흐름에 대해서 알아야한다고 생각을 한다.
스프링의 영역은 Dispatcher Servlet 부터 시작을 한다.
그 Spring MVC 에서 나오는 그 Dispatcher Servlet이 맞다.
그리고 Filter 부터 Controller 까지 같은 Servlet Request, Servlet Response 를 사용을 한다.
다음에 나오는 내용들 까지 전부 설명을 하면 좋겠지만, 오늘은 Filter 와 Interceptor의 차이까지만 알아보고자 한다.
Filter vs Interceptor
Filter | Interceptor | |
작동 위치 | Tomcat | Spring 내부 |
역할 | 요청과 응답을 거른뒤 정제하는 역할 | 요청에 대한 작업 전/후로 가로 챈다. |
차이점 | 스프링 자원을 사용할 수 없다. | 스프링의 자원을 사용할 수 있다. |
기타 | 모든 요청을 필터를 거친다. | 각 컨트롤러에 대한 공통점을 처리한다. |
간단하게 이정도의 차이점이 있다.
모든 요청은 일단 Filter를 거치고 나서 스프링의 내부로 들어오게된다.
그후 컨트롤러가 호출이 되기 전에 Interceptor 가 요청에 대한 작업 전/후로 가로채서 처리를 한다음에 컨트롤러에게 혹은 다음 순서에게 넘겨주게 된다.
FIlter , Interceptor 만들기
Filter
@Slf4j
@RequiredArgsConstructor
public class JwtFilter implements Filter {
private final JwtUtil jwtUtil;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String url = httpRequest.getRequestURI();
if (url.startsWith("/auth")) {
chain.doFilter(request, response);
return;
}
String bearerJwt = httpRequest.getHeader("Authorization");
if (bearerJwt == null) {
// 토큰이 없는 경우 400을 반환합니다.
httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "JWT 토큰이 필요합니다.");
return;
}
// 로직 생략
}
}
간단하게 설명을 해보면 implements Filter를 해서 새로운 필터를 생성을 한 다음에
doFilter 메소드를 오버라이드를 해서 사용을 할 수 있다.
Interceptor
@Slf4j
public class AdminInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
UserRole role = UserRole.of(request.getAttribute("userRole").toString());
if( !UserRole.ADMIN.equals(role) ) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "관리자 권한이 없습니다.");
return false;
}
return true;
}
}
현재 블로그 주인장이 사용하는 Spring 버젼에서는 HandlerInterceptorAdaptor 는 더 이상 사용이 안되기 때문에
implements HandlerInterceptor 를 사용해야한다.
그후 preHandle 메소드를 오버라이드를 해서 사용을 해주면된다.
위 코드는 단순하게 생략된 로직에서 ServletRequest에 이미 attribute로 값이 들어가 있기 때문에
값을 받아와서 사용을 하였다.
false로 리턴을 하면 Interceptor를 통과를 하지 못한것이고 true면 통과가 된것이다.
Filter , Interceptor 적용법
Filter
@Configuration
@RequiredArgsConstructor
public class FilterConfig {
private final JwtUtil jwtUtil;
@Bean
public FilterRegistrationBean<JwtFilter> jwtFilter() {
FilterRegistrationBean<JwtFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new JwtFilter(jwtUtil));
registrationBean.addUrlPatterns("/*"); // 필터를 적용할 URL 패턴을 지정합니다.
return registrationBean;
}
}
Filter 같은 경우는 @Configuration + @Bean 으로 등록을 진행을 해주면 된다.
주석으로 설명이 되어있는 것처럼 필요한 URL에 패턴을 적용을 할 수 있다.
Interceptor
@Configuration
public class WebConfig implements WebMvcConfigurer {
// Intercepter 등록
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AdminInterceptor())
.addPathPatterns("/admin/**");
}
}
Interceptor 의 경우는 implements WebMvcConfigurer 를 받아서 사용을 할 수 있다.
addInterceptors 메소드를 오버라이드를 해서 registry에 interceptor를 추가를 해주면 끝난다.
느낀점
오늘 간단한 내용인 Interceptor에 대한 내용을 공부를 했는데,
간단한 내용이지만 오히려 간단하여 Spring 흐름과 Spring MVC에 대한 내용을 자세하게 알게된 것 같아서
적게 되었다.
사소한 것에도 이렇게 얻어가는 것이 있어서 세상은 보기 나름이라고 생각한다.
앞으로도 화이팅
참고자료
[Spring MVC] 스프링 MVC란 무엇인가? - 스프링 MVC 구조 이해
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다. '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의 웹
ittrue.tistory.com
[Spring] Filter, Interceptor, AOP 차이 및 정리
[Spring] Filter, Interceptor, AOP 차이 및 정리 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [Spring] 필터, 인터셉터, AOP 정리 ] 입니다. : ) 공통 프로세스에 대한 고민자바 웹 개발을 하다보면, 공통적으
goddaehee.tistory.com
'Backend > Spring' 카테고리의 다른 글
[Spring] OutSourcing 프로젝트를 마치며.. (1) | 2025.03.07 |
---|---|
[Spring] 테스트 코드를 작성을 해보자. (0) | 2025.02.27 |
[Spring] Spring 심화 내용 배운 것 단순 요약. (0) | 2025.02.21 |
[Spring] 프로젝트 하면서 느낀 아쉬운점 & 배운점 등 (0) | 2025.02.20 |
[JPA] 연관관계가 있는 객체를 한번에 없애보자. (0) | 2025.02.13 |