티스토리 뷰
이번 글에서는 자동으로 구성되어있는 Spring MVC Configuration을 커스터마이징하는 방법에 대해 알아보려고 합니다.
기본적으로 구성되어 있는 WebMvcConfig는 다음과 같은 Interface로 구성되어 있습니다.
WebMvcConfigurer.java
package org.springframework.web.servlet.config.annotation;
public interface WebMvcConfigurer {
// ...
}
내부에는 많은 메소드들이 존재하는데 모두 default로 선언되어 있습니다. 즉, implements를 하여도 전체를 @Override할 필요 없이 필요한 부분만 설정할 수 있도록 되어 있는 구조입니다.
참고로 default method는 Spring boot 2.0 / Spring Framework 5.0부터 적용된 기능입니다.
WebMvcConfigurer에는 RequestMappingHandlerMapping을 할 수 있는 preHandle 또는 addResourceHandlers이 포함되어 있고, Intercepter 들을 컨트롤할 수 있는 addInterceptors등이 있습니다.
이를 사용하기 위해서는 먼저 @Configuration과 @EnableWebMvc를 같이 선언하여야 합니다.
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
}
그렇다면, resourceHandle, preHandle은 무엇이고 interceptor들이 하는 역할은 무엇일까요?
바로 접근 권한을 부여하고 사용자의 권한에 맞게 움직임을 제한하는 역할을 합니다.
아래에는 MVC Lifecycle을 첨부해두었습니다.
Resource Handler
1. Servlet Container가 제공하는 DefaultServlet으로 resource 영역에 존재하는 파일들( /images /css /js /html )을 처리
2. 모든 톰캣에 등록되어 있음
3. $CATALINA_BASE/conf/web.xml에 전역적으로 등록되어 있음
4. DefaultServlet에 요청을 '위임'하여 Resource 요청 처리
Interceptor
1. Controller에 들어오는 HttpRequest와 응답하는 HttpResponse를 가로채는 역할
2. 관리자만 접근할 수 있는 관리자 인증의 용도로 활용
3. Filter는 DispatcherServlet이 실행되기 전에 호출되지만, Interceptor는 DispatcherServlet이 실행된 후 호출
4. Filter는 web.xml에서 관리, Interceptor는 spring-servlet.xml에서 관리
사용법
그럼 이제 이 녀석들을 어떻게 사용하는지 알아보겠습니다.
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(new MvcConfig.RequestHandler()) //핸들러를 지정
.addPathPatterns("/**") //인터셉트할 기본 패턴을 지정
.excludePathPatterns("", "/", "/login", "/validation", "/error", "/images/**", "/js/**");
}
}
인터셉터에서는 제외할 URI 패턴(메인,로그인,에러 페이지등)을 지정하여 기본적으로 제외할 것을 권장합니다.
즉, 루트 레벨에 존재하는 IndexController(예시)에서의 리소스 접근 권한을 차단하기 위해 설정합니다.
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(new MvcConfig.RequestHandler()) //핸들러를 지정
.addPathPatterns("/**") //인터셉트할 기본 패턴을 지정
.excludePathPatterns("", "/", "/login", "/validation", "/error", "/images/**", "/js/**");
}
public static final String SESSION_KEY = "SESSION";
public class RequestHandler extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object session = request.getSession().getAttribute(SESSION_KEY);
if(session == null) {
response.sendRedirect("/"); // session이 null인 경우 root로 리다이렉팅합니다.
return false;
}
else {
return true;
}
}
}
}
IndexController.java
@Controller
public class IndexController {
@GetMapping("/")
public String index() {
return "index.html";
}
}
여기에 작성된 소스는 서버에서 관리하는 세션에 대한 처리입니다. 세션에 존재하지 않는 사용자 혹은 관리자의 경우 IndexController.java에 선언되어 있는 index.html로 자동으로 리다이렉팅 해줍니다.
마치며, MVC 패턴을 자주 사용했던 개발자분들에게는 익숙한 소스일수도 있습니다. 기본적으로 Servlet은 어떻게 응답처리를 하는지와 관리 포인트가 필요한 웹페이지에서 Spring은 어떤 방식으로 사용자들을 제어하는지 Interceptor와 Handler의 소스를 통해 기본적으로 알아본 시간이었습니다.
'Server' 카테고리의 다른 글
[Spring] ControllerAdvice AOP 어노테이션과 사용법 (0) | 2020.12.14 |
---|---|
Linux 포트 확인 및 백그라운드 프로세스 실행 (0) | 2020.12.07 |
[Java] 앱 버전 분기하기 (0) | 2020.08.07 |
[Spring] Jedis 보다는 Lettuce를 쓰자 (2) | 2020.07.20 |
Kotlin은 Lombok을 사용할 수 없다 (0) | 2020.07.20 |
[Java] 직렬화는 중요한 것일까 (0) | 2020.07.17 |