๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํด์ผํ ์ ๋ฌด๊ฐ ๋ง๋ค.
๊ณตํต ์ ๋ฌด์์ ์ค๋ณต ์ฝ๋๊ฐ ๋ง์์ง๊ฑฐ๋ ํ๋ก์ ํธ ๋จ์๊ฐ ์ปค์ง์๋ก ์๋ฒ์ ๋ถํ๋ฅผ ์ฃผ๋ฉฐ, ์์ค ๊ด๋ฆฌ๋ ๋์ง ์๋๋ค.
๋ฐ๋ผ์, Spring์์ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํํฐ(Filter)์ ์ธํฐ์ ํฐ(Interceptor)๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์์ฒญ/์๋ต ์ฒ๋ฆฌ ์ /ํ์ ๊ณตํต์์ ์ ์ํํ ๋ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ
(Servlet)ํํฐ => Java EE ํ์ค ์คํ Dispatcher Servlet์์ ์ ๊ณต
(Spring)์ธํฐ์ ํฐ => Spring MVC์์ ์ ๊ณต

HTTP ์์ฒญ → WAS → "ํํฐ" → ์๋ธ๋ฆฟ → ์ปจํธ๋กค๋ฌ
HTTP ์์ฒญ → WAS → ํํฐ → ์๋ธ๋ฆฟ → "์ธํฐ์ ํฐ" → ์ปจํธ๋กค๋ฌ
1. Servlet Filter
- ๋์คํจ์ฒ ์๋ธ๋ฆฟ ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ /ํ์ ์์ ์ ์ฒ๋ฆฌํ๋ฏ๋ก ํต์บฃ๊ณผ ๊ฐ์ ์น ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๊ณ , ์คํ๋ง ๋ฒ์ ๋ฐ์์ ์ฒ๋ฆฌ๋จ
- jacax.servlet ์ ๋ฑ๋ก๋ Filter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ๋ฑ๋กํ๋ฉด, ์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐํํฐ๋ฅผ ์ฑ๊ธํค ๊ฐ์ฒด๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํจ javax.servlet.Filter์ 3๊ฐ์ง ๋ฉ์๋
- init() - ์ฒ์ 1ํ
- doFilter()
- destroy() - ๋ 1ํ
public interface Filter {
// init() ๋ฉ์๋ (์ฒ์)
// - ํํฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ๊ณ ์๋น์ค์ ์ถ๊ฐ
// - ์น ์ปจํ
์ด๋๊ฐ 1ํ init ๋ฉ์๋ ํธ์ถํ์ฌ ํํฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ๋ฉด ์ดํ์ ์์ฒญ๋ค์ doFilter๋ฅผ ํตํด ์ฒ๋ฆฌ
public default void init(FilterConfig filterConfig) throws ServletException {}
// doFilter() ๋ฉ์๋
// - url-pattern์ ๋ง๋ ๋ชจ๋ HTTP ์์ฒญ์ด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌ๋๊ธฐ ์ ์ ์น ์ปจํ
์ด๋์ ์ํด ์คํ๋จ
// - ํ๋ผ๋ฏธํฐ : FilterChain => chain.doFilter() ์ /ํ์ ์ฐ๋ฆฌ๊ฐ ํ์ํ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ฃ์ด์ค
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException{
System.out.println("Filter ์คํ ์ ");
chain.doFilter(request, response); // ๋ค์ ํํฐ or ์๋ธ๋ฆฟ ํธ์ถ
System.out.println("Filter ์คํ ํ");
}
// destroy() ๋ฉ์๋ (๋)
// - ํํฐ ๊ฐ์ฒด๋ฅผ ์๋น์ค์์ ์ ๊ฑฐ
// - ์น ์ปจํ
์ด๋๊ฐ 1ํ ํธ์ถ๋๋ฉฐ, ์ดํ๋ doFilter์ ์ํด ์ฒ๋ฆฌ๋์ง ์์
public default void destroy() {}
}
- ์ฉ๋
- ์ธ์ฝ๋ฉ ์ค์ (UTF-8)
- ๊ณตํต๋ ์ธ์ฆ ์ฒ๋ฆฌ
- ๋ชจ๋ ์์ฒญ์ ๋ํ ๋ก๊น /๋ชจ๋ํฐ๋ง
- CORS ์ฒ๋ฆฌ
- ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ๊ณต
- Spring๊ณผ ๋ถ๋ฆฌ๋์ด์ผํ๋ ๊ธฐ
2. Spring Interceptor
- ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ /ํ ์์ฒญ๊ณผ ์๋ต์ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ์ Spring Context์์ ๋์
- org.springframework.web.servlet์ HandlerInterceptor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ(3๊ฐ์ง ๋ฉ์๋)
- preHandle() - ์ปจํธ๋กค๋ฌ ํธ์ถ ์
- postHandle() - ์ปจํธ๋กค๋ฌ ํธ์ถ ํ
- afterCompletion() - ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ํ
public interface HandlerInterceptor {
// preHandel() ๋ฉ์๋
// - ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์คํ. ์ปจํธ๋กค๋ฌ ์ด์ ์ ์ฒ๋ฆฌํด์ผํ๋ ์ ์ฒ๋ฆฌ ์์
์ด๋ ์์ฒญ์ ๋ณด๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
// - handler ํ๋ผ๋ฏธํฐ๋ ํธ๋ค๋ฌ ๋งคํ์ด ์ฐพ์์ค ์ปจํธ๋กค๋ฌ ๋น์ ๋งคํ๋๋ HandlerMethod๋ผ๋ ์๋ก์ด ํ์
์ ๊ฐ์ฒด๋ก์จ,
// @RequestMapping์ด ๋ถ์ ๋ฉ์๋์ ์ ๋ณด๋ฅผ ์ถ์ํํ ๊ฐ์ฒด
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("๐น preHandle: ์ปจํธ๋กค๋ฌ ์คํ ์ ");
return true; // false๋ฉด ์ปจํธ๋กค๋ฌ๋ก ๊ฐ์ง ์์
}
// postHandle() ๋ฉ์๋
// - ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋ ํ์ ์คํ. ์ปจํธ๋กค๋ฌ ์ดํ์ ์ฒ๋ฆฌํด์ผํ๋ ํ์ฒ๋ฆฌ ์์
๋
// - ModelAndView ํ์
์ ์ ๋ณด๊ฐ ์ ๊ณต
// - ์ต๊ทผ์๋ Json ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ RestAPI๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ(@RestController)๋ฅผ ๋ง๋ค๋ฉด์ ์์ฃผ ์ฌ์ฉ๋์ง ์๋๋ค.
// - ์ปจํธ๋กค๋ฌ ํ์ ๊ณ์ธต์์ ์์
์ ์งํํ๋ค๊ฐ ์ค๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด postHandle์ ํธ์ถ๋์ง ์์
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
System.out.println("๐ธ postHandle: ์ปจํธ๋กค๋ฌ ์คํ ํ, ๋ทฐ ๋ ๋๋ง ์ ");
}
// afterCompletion() ๋ฉ์๋
// - ๋ชจ๋ ๋ทฐ์์ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ์ผ์ ํฌํจํด ๋ชจ๋ ์์
์ด ์๋ฃ๋ ํ์ ์คํ
// - ์์ฒญ ์ฒ๋ฆฌ ์ค์ ์ฌ์ฉํ ๋ฆฌ์์ค๋ฅผ ๋ฐํํ ๋ ์ฌ์ฉ
// - ์ปจํธ๋กค๋ฌ ํ์ ๊ณ์ธต์์ ์์
์งํํ๋ค๊ฐ ์ค๊ฐ์ ์์ธ ๋ฐ์ํ๋๋ผ๋ ๋ฐ๋์ ํธ์ถ๋จ
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
System.out.println("โ
afterCompletion: ๋ทฐ ๋ ๋๋ง ํ, ๋ฆฌ์์ค ์ ๋ฆฌ");
if (ex != null) {
System.out.println("์์ธ ๋ฐ์: " + ex.getMessage());
}
}
}
- ์ฉ๋
- ์ธ๋ถ์ ์ธ ๋ก๊ทธ์ธ ์ฒดํฌ / ๊ถํ ์ธ์ฆ
- API ํธ์ถ ์ ๊ฒ์ฆ
- ๊ณตํต ๋ฐ์ดํฐ ์ฝ์ (์: ๋ฉ๋ด ์ ๋ณด)
- ์ฑ๋ฅ ์ธก์
- Controller๋ก ๋๊ฒจ์ฃผ๋ ์ ๋ณด(๋ฐ์ดํฐ)์ ๊ฐ

(์ฐธ๊ณ ์ฌํญ) ์กฐ๊ธ ์ค๋๋ ์ฑ ๋ค์ ๋ณด๋ฉด ํํฐ(Filter)๋ ์๋ธ๋ฆฟ ๊ธฐ์ ์ด๋ผ์ Spring์ ๋น์ผ๋ก ๋ฑ๋กํ ์ ์์ผ๋ฉฐ ๋น์ ์ฃผ์ ๋ฐ์์๋ ์๋ค๋ ๋ด์ฉ์ด ๋์ด. ํ์ง๋ง ์ค์ ๋ก ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด Filter ์ญ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก์ด ๊ฐ๋ฅํ๊ณ , ๋น์ ์ฃผ์ ๋ ๋ฐ์ ์ ์๋ค.
DelegatingFilterProxy์ SpringBoot์ ๋ฑ์ฅ
์คํ๋ง 1.2๋ถํฐ DelegatingFilterProxy๊ฐ ๋์ค๋ฉด์ ์๋ธ๋ฆฟ ํํฐ ์ญ์ ์คํ๋ง์์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง.
๊ทธ๋ฆฌ๊ณ , ์ด DelegatingFilterProxy๋ฅผ ๋ฑ๋กํ๋ ๊ณผ์ ์ Spring์ด๊ธฐ ๋๋ฌธ์ ํ์ํ ๊ฒ์ด๊ณ , SpringBoot๋ผ๋ฉด DelegatingFilterProxy์กฐ์ฐจ ํ์ ์๋ค!
'๋ฐฑ์๋(Back-End) ๊ฐ๋ฐ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| POST ๋ฐฉ์ ํ๋ผ๋ฏธํฐ์ ๋ํ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ ํํฐ ์ค์ (UTF-8) (0) | 2025.03.06 |
|---|---|
| [TOMCAT] ์๋ฒ ํฌํธ ์ถฉ๋๋ก ์ธํด ์๋ฒ ์์์ด ์๋ ๊ฒฝ์ฐ (0) | 2025.03.01 |
| [Spring] Entity? DTO? VO? (1) | 2025.02.27 |
| [Spring] DI์ IOC ๋? (0) | 2025.02.27 |
| [Spring] Spring Framework(์คํ๋ง ํ๋ ์ ์ํฌ)์ STS(Spring Tool Suite) (0) | 2025.01.19 |