org.springframework.web.servlet.HandlerInterceptor
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ด๋ค.- HandlerInterceptor ์ธํฐํ์ด์ค๋ preHandler, postHandler, afterCompletion ๋ฑ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- WebMvcConfigurer๋ฅผ ๊ตฌํํ ํด๋์ค์์ Interceptor๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ค.(์ฌ๊ธฐ์ ์ถ๊ฐํ ์ธํฐ์ ํฐ, ์ ์ฉ ๊ฒฝ๋ก, ์ ์ธ ๊ฒฝ๋ก ๋ฑ์ ์ง์ ํ ์ ์๋ค.)
- ์ฃผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ HTTP ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ก์ฑ์ด ์ฒ๋ฆฌ ์ , ํ, ๋ฐ ์๋ฃ ํ์ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- preHandler()
- ์คํ ์์ : ์ปจํธ๋กค๋ฌ ์คํ ์ (โก์ โข ์ฌ์ด)
- ๋ฐํ๊ฐ
- true: ์ปจํธ๋กค๋ฌ ์คํ
- false: ์ปจํธ๋กค๋ฌ ์คํํ์ง ์๊ณ ์์ฒญ ์ค๋จ
- postHandler()
- ์คํ ์์ : ์ปจํธ๋กค๋ฌ ์คํ ํ, ๋ทฐ ๋ ๋๋ง ์ (โฅ์ โฆ ์ฌ์ด)
- ๋ฐํ๊ฐ: ์์
- afterCompletion()
- ์คํ ์์ : ํด๋ผ์ด์ธํธ ์๋ต ์ ์ก ํ(โง ์ดํ)
- ๋ฐํ๊ฐ: ์์
โ DispatcherServlet
์ ์์ฒญ์ ์์ ํ๋ค.
โก DispatcherServlet
์ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ํํ๋ ์์
์ HandlerMapping
์๊ฒ ์์ํ๋ค. HandlerMapping
์ ์์ฒญ๋ URL์ ๋งคํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ํํ๊ณ ์ ํ๋ ํธ๋ค๋ฌ ๋ฐ ์ปจํธ๋กค๋ฌ๋ฅผ DispatcherServlet
์ ๋ฐํํ๋ค.
โข DispatcherServlet
์ ์ปจํธ๋กค๋ฌ์ ๋น์ฆ๋์ค ๋ก์ง ์คํ ์์
์ HandlerAdapter
์๊ฒ ์์ํ๋ค.
โฃ HandlerAdapter
๋ ์ปจํธ๋กค๋ฌ์ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ๋ค.
โค ์ปจํธ๋กค๋ฌ๋ 1๏ธโฃ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๊ณ , 2๏ธโฃ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์ ์ค์ ํ๊ณ , 3๏ธโฃ๋ทฐ์ ๋
ผ๋ฆฌ์ ์ด๋ฆ(์ปจํธ๋กค๋ฌ์์ ๋ฐํ๋๋ ๋ฌธ์์ด)์ HandlerAdapter
์ ๋ฐํํ๋ค.
โฅ DispatcherServlet
์ ๋ทฐ์ ์ด๋ฆ์ ํด๋นํ๋ ๋ทฐ๋ฅผ ์ฐพ์์ฃผ๋ ์์
์ ViewResolver
์๊ฒ ์์ํ๋ค. ViewResolver
๋ ๋ทฐ ์ด๋ฆ์ ๋งคํ๋ ๋ทฐ๋ฅผ ๋ฐํํ๋ค.
โฆ DispatcherServlet
์ ๋ฐํ๋ ๋ทฐ์ ๋ ๋๋ง ์์
์ ์์ํ๋ค.
โง ๋ทฐ๋ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ๊ณ ์๋ต์ ๋ฐํํ๋ค.
๐ Filter์ Interceptor์ ์ฐจ์ด์
- Filter
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ ๋ฒจ์์ ๋์(Spring MVC์๋ ๋ฌด๊ดํ๊ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์์ค์์ ๋์)
javax.servlet.Filter
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ- ๋ฉ์๋: doFilter(DispatcherServlet์ด ์์ฒญ์ ์์ ํ๊ธฐ ์ (โ ์ด์ )์ ์คํ)
- Interceptor
- Spring MVC์ ์ผ๋ถ๋ก์ ์ปจํธ๋กค๋ฌ ๋ ๋ฒจ์์ ๋์(Spring Bean์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํด @Component ์ด๋ ธํ ์ด์ ํ์)
org.springframework.web.servlet.HandlerInterceptor
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ- ๋ฉ์๋: preHandelr, postHandler, afterCompletion
๐ Filter์ Interceptor ์คํ ์์ ์์ฝ
- doFilter() -> preHandle() -> ์ปจํธ๋กค๋ฌ ์คํ -> postHandle() -> ๋ทฐ ๋ ๋๋ง -> ํด๋ผ์ด์ธํธ์ ์๋ต ์ ์ก -> afterCompletion()
1) HandlerInterceptor ๊ตฌํ ํด๋์ค(์ธํฐ์ ํฐ ํด๋์ค)
- @Component ์ด๋ ธํ ์ด์ ํ์
- HandlerInterceptor ๊ตฌํ
- preHandle, postHandler, afterCompletion ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋
// ๐ข /src/main/java/com/memo/interceptor/PermissionInterceptor.java
package com.memo.interceptor;
import java.io.IOException;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class PermissionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws IOException {
String uri = request.getRequestURI();
HttpSession session = request.getSession();
Integer userId = (Integer)session.getAttribute("userId");
log.info("[@@@@@@@@@@@ preHandle] uri:{}", uri);
// ๋น๋ก๊ทธ์ธ && /post => ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋, ์ปจํธ๋กค๋ฌ ์ํ ๋ฐฉ์ง
if(userId == null && uri.startsWith("/post")) {
response.sendRedirect("/user/sign-in-view");
return false; // ์๋ ์์ฒญ์ ๋ํด์ ์ปจํธ๋กค๋ฌ ์ํ ์ํจ
}
// ๋ก๊ทธ์ธ && /user => ๊ธ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋, ์ปจํธ๋กค๋ฌ ์ํ ๋ฐฉ์ง
if(userId != null && uri.startsWith("/user")) {
response.sendRedirect("/post/post-list-view");
return false; // ์๋ ์์ฒญ์ ๋ํด์ ์ปจํธ๋กค๋ฌ ์ํ ์ํจ
}
return true; // ์ปจํธ๋กค๋ฌ ์ํ
}
@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView mav) {
log.info("[########### postHandle]");
}
@Override
public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
log.info("[$$$$$$$$$$$ afterCompletion]");
}
}
2) WebMvcConfigurer ๊ตฌํ ํด๋์ค(๊ฒฝ๋ก ์ค์ ํด๋์ค)
- @Configuration ์ด๋ ธํ ์ด์ ํ์
- WebMvcConfigurer ๊ตฌํ
- ๊ตฌํํ ์ธํฐ์ ํฐ autowired
- addInterceptors ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋
// ๐ข /src/main/java/com/memo/config/WebMvcConfig.java
package com.memo.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.memo.interceptor.PermissionInterceptor;
@Configuration // ์ค์ ์ ์ํ spring bean
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private PermissionInterceptor interceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(interceptor)
.addPathPatterns("/**")
.excludePathPatterns("/static/**", "/error", "/user/sign-out");
}
}