ํฐ์คํ ๋ฆฌ ๋ทฐ
728x90
๋ฐ์ํ
Filter (javax.servlet.Filter)
๐น ์ญํ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ๋ ์ญํ ์ ํฉ๋๋ค.
- ์ฃผ๋ก ๋ณด์, ์ธ์ฝ๋ฉ, ๋ก๊น , ์ธ์ฆ, ๊ถํ ๊ฒ์ฌ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ ๋ฒจ์์ ๋์ํ๋ฉฐ, DispatcherServlet ์์์ ์คํ๋ฉ๋๋ค.
๐น ๋์ ๋ฐฉ์
- ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด Filter๊ฐ ๊ฐ์ฅ ๋จผ์ ์คํ๋ฉ๋๋ค.
- ํํฐ์์ ์์ฒญ์ ๋ณํํ๊ฑฐ๋, ๋ก๊น ๋ฑ์ ์ํํ ์ ์์ต๋๋ค.
- chain.doFilter(request, response)๋ฅผ ํธ์ถํ๋ฉด ๋ค์ ํํฐ ๋๋ ์๋ธ๋ฆฟ์ผ๋ก ์์ฒญ์ด ์ ๋ฌ๋ฉ๋๋ค.
- ์๋ต์ด ์์ฑ๋๋ฉด ๋ค์ Filter์์ ์๋ต์ ์กฐ์ํ ์ ์์ต๋๋ค.
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*") // ๋ชจ๋ ์์ฒญ์ ๋ํด ์ ์ฉ
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("์์ฒญ์ด ํํฐ๋ฅผ ํต๊ณผํฉ๋๋ค.");
// ๋ค์ ํํฐ ๋๋ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ ์ ๋ฌ
chain.doFilter(request, response);
System.out.println("์๋ต์ด ํํฐ๋ฅผ ํต๊ณผํฉ๋๋ค.");
}
}
๐น Filter์ ํน์ง
- DispatcherServlet ์ด์ ์ ์คํ๋จ
- Spring๊ณผ ๊ด๊ณ์์ด ์๋ธ๋ฆฟ ๋ ๋ฒจ์์ ๋์
- URL ํจํด์ ๊ธฐ์ค์ผ๋ก ์ ์ฉ ๊ฐ๋ฅ
- ์ฌ๋ฌ ๊ฐ์ ํํฐ๋ฅผ ๋ฑ๋กํ ์ ์์ผ๋ฉฐ, ์์๋ฅผ ์กฐ์ ๊ฐ๋ฅ
Interceptor (HandlerInterceptor)
๐น ์ญํ
- Spring MVC์์ ์ปจํธ๋กค๋ฌ์ ์์ฒญ์ ๊ฐ๋ก์ฑ๋ ์ญํ ์ ํฉ๋๋ค.
- ์ฃผ๋ก ๋ก๊ทธ์ธ ์ฒดํฌ, ์ธ์ฆ, ๊ถํ ๊ฒ์ฌ, ๋ก๊น ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
- DispatcherServlet์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ ํ์ ์คํ๋ฉ๋๋ค.
๐น ๋์ ๋ฐฉ์
- ์์ฒญ์ด ๋ค์ด์ค๋ฉด preHandle()์ด ์คํ๋จ → ์ปจํธ๋กค๋ฌ ์คํ ์ฌ๋ถ ๊ฒฐ์ ๊ฐ๋ฅ
- ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋จ
- ์ปจํธ๋กค๋ฌ ์คํ ํ postHandle()์ด ์คํ๋จ → ๋ชจ๋ธ ๋ฐ์ดํฐ ์์ ๊ฐ๋ฅ
- ๋ทฐ๊ฐ ๋ ๋๋ง๋ ํ afterCompletion()์ด ์คํ๋จ → ์์ธ ์ฒ๋ฆฌ ๋ฐ ๋ฆฌ์์ค ์ ๋ฆฌ
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor: ์์ฒญ์ ๊ฐ๋ก์ฑ๋๋ค.");
return true; // true: ์์ฒญ์ ์ปจํธ๋กค๋ฌ๋ก ๋ณด๋, false: ์์ฒญ ์ฐจ๋จ
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor: ์ปจํธ๋กค๋ฌ ์คํ ํ");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
System.out.println("Interceptor: ๋ทฐ ๋ ๋๋ง ํ");
}
}
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**") // ํน์ ๊ฒฝ๋ก์๋ง ์ ์ฉ
.excludePathPatterns("/login", "/signup"); // ์์ธ ๊ฒฝ๋ก ์ค์
}
}
๐น Interceptor์ ํน์ง
- DispatcherServlet ์ดํ์ ์คํ๋จ
- Spring MVC์์ ๋์ํ๋ฉฐ, HandlerMapping์ ํตํด ์ปจํธ๋กค๋ฌ ๋จ์์ ์์ฒญ์ ๊ฐ๋ก์ฑ
- addPathPatterns() ๋ฐ excludePathPatterns()์ ์ฌ์ฉํ์ฌ ํน์ URL ํจํด์๋ง ์ ์ฉ ๊ฐ๋ฅ
- preHandle()์์ ์์ฒญ์ ์ฐจ๋จํ ์๋ ์์
Filter vs Interceptor
๊ตฌ๋ถ | Filter | Interceptor |
์คํ ์์น | DispatcherServlet ์ด์ | DispatcherServlet ์ดํ |
๋์ ์์ค | ์๋ธ๋ฆฟ ์์ค (Spring๊ณผ ๋ฌด๊ด) | Spring MVC ์์ค (HandlerMapping ์ดํ) |
์ฃผ ์ฌ์ฉ ๋ชฉ์ | ๋ณด์, ์ธ์ฝ๋ฉ, ๋ก๊น , ์์ฒญ ์์ | ์ธ์ฆ, ๊ถํ ๊ฒ์ฌ, ๋ก๊น , ๋ฐ์ดํฐ ์กฐ์ |
์์ฒญ ์ฐจ๋จ ๊ฐ๋ฅ | doFilter()์์ ๊ฐ๋ฅ | preHandle()์์ ๊ฐ๋ฅ |
์ค์ ๋ฐฉ์ | @WebFilter ๋๋ FilterRegistrationBean | addInterceptors() ์ฌ์ฉ |
์ธ์ ๋ฌด์์ ์ฌ์ฉํ ๊น?
- ์ ์ญ์ ์ผ๋ก ๋ชจ๋ ์์ฒญ์ ๊ฐ๋ก์ฑ์ผ ํ๋ค๋ฉด → Filter
- ์: CORS ์ค์ , ์ธ์ฝ๋ฉ ๋ณํ, ๊ณตํต ๋ก๊น , ์์ฒญ/์๋ต ๋ณ์กฐ
- Spring MVC์์ ํน์ ์ปจํธ๋กค๋ฌ ๋ก์ง ์ ํ๋ฅผ ๊ฐ๋ก์ฑ์ผ ํ๋ค๋ฉด → Interceptor
- ์: ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ, JWT ์ธ์ฆ, API ์์ฒญ ๋ก๊น
์คํ ์์ ์์ฝ (Spring MVC ๊ธฐ์ค)
๋จ๊ณ | ์คํ ์ฃผ์ฒด | ์ค๋ช |
1๏ธโฃ | Filter | DispatcherServlet ์ด์ (Servlet ์คํ) |
2๏ธโฃ | Interceptor (preHandle) | Controller ํธ์ถ ์ |
3๏ธโฃ | @Aspect (Around / Before) | ๋ฉ์๋ ๋ ๋ฒจ AOP ์ง์ |
4๏ธโฃ | Controller | ์ค์ ๋ก์ง ์คํ |
5๏ธโฃ | @Aspect (After / AfterReturning / AfterThrowing) | Controller ๋ฉ์๋ ์ข ๋ฃ ์ดํ |
6๏ธโฃ | Interceptor (postHandle / afterCompletion) | ์๋ต ์ง์ , ๋ทฐ ๋ ๋๋ง ์ดํ |
7๏ธโฃ | ResponseBodyAdvice (if applicable) | JSON ๊ฐ๊ณต ๋ฑ ์๋ต ์ปค์คํฐ๋ง์ด์ง |
Interceptor์์ return false๋ฅผ ํ๊ฒ ๋๋ฉด
์ปจํธ๋กค๋ฌ๋ ์คํ๋์ง ์๊ณ , ์ดํ ๋ก์ง์ด ์ค๋จ๋ฉ๋๋ค.
์๋ต์ ์ง์ ์์ฑํด์ฃผ์ง ์์ผ๋ฉด ์๋ฌด ๋ด์ฉ ์์ด ์ข ๋ฃ๋ฉ๋๋ค.
return false๋ง ํ๊ณ ์๋ต์ ์์ฑํ์ง ์์ผ๋ฉด | โ ๋ธ๋ผ์ฐ์ ๋ ์๋ต์ด ์๊ฑฐ๋ ๋น ํ์ด์ง๋ก ๋ณด์ |
์๋ต์ด ์๋๋ฐ๋ ์ํ์ฝ๋๊ฐ 200์ผ ์๋ ์์ | โ ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ํผ๋ ๋ฐ์ |
์ฆ์ ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ postHandle, afterCompletion, AOP, Controller ๋ฑ ์ ๋ถ ์คํ๋์ง ์์ | ๐ ์์ ์ค๋จ๋จ |
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (isInvalidRequest()) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setContentType("application/json;charset=UTF-8");
String body = new ObjectMapper().writeValueAsString(Map.of(
"status", 403,
"message", "์๋ชป๋ ์์ฒญ์
๋๋ค."
));
response.getWriter().write(body);
return false;
}
return true;
}
728x90
๋ฐ์ํ
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring ApplicationContextInitializer (0) | 2022.01.11 |
---|---|
Request Content-Type์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ์ (0) | 2020.06.12 |
Session, Cookie (0) | 2020.05.18 |
Spring MVC (0) | 2020.05.16 |
Spring JDBC (Java DataBase Connection) (0) | 2020.05.16 |
๋ฐ์ํ
300x250