Spring์ ๊ณตํต๋ ๋ก์ง์ ์ฒ๋ฆฌํ์ฌ ์ปจํธ๋กค๋ฌ์์ ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋๋ก ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์ค๋์ ๊ทธ ์ค ํํฐ(Filter)์ ์ธํฐ์ ํฐ(Interceptor)์ ๋ํด ์์๋ณด๊ณ ๋น๊ตํด๋ณด๊ณ ์ ํฉ๋๋ค.
ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ :)
HTTP ์์ฒญ์ด ๋ค์ด์ค๋ ํ๋ฆ - ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์ค์ฌ์ผ๋ก
๋ณธ๊ฒฉ์ ์ผ๋ก ํํฐ์ ์ธํฐ์ ํฐ์ ๊ฐ๋ ์ ์๊ธฐ ์ ์
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์๋ฒ๋ก ์์ฒญ์ด ๋ค์ด์ฌ ๋ ์ด๋ป๊ฒ ์ปจํธ๋กค๋ฌ๊น์ง ๋ฟ๋์ง ์ดํดํ ํ์๊ฐ ์์ต๋๋ค.
ํํฐ์ ์ธํฐ์ ํฐ๋ฅผ ๊ฒ์ํ๋ฉด ๋์คํจ์ฒ ์๋ธ๋ฆฟ(Dispatcher Servlet)์ด๋ผ๋ ์ฉ์ด๊ฐ ๋ง์ด ์ธ๊ธ๋๊ฑฐ๋ ์.
์ด ๊ธ์์๋ ํํฐ์ ์ธํฐ์ ํฐ๋ฅผ ์ดํดํ๊ธฐ ์ํ ์ต์ํ๋ง ๊ฐ๋ตํ ๋์๋ณด๊ฒ ์ต๋๋ค.

ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ด๋ ์๋ฒ๋ก ๋ค์ด์ต๋๋ค.
์ฌ๊ธฐ์ ์๋ฒ๊ฐ ํฐ์บฃ(Tomcat)์ด๋ผ๊ณ ํ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋(Servlet Container)?
- HTTP ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ์น ์๋ฒ
- ์๋ธ๋ฆฟ์ด๋(Servlet)?
- HTTP ์์ฒญ/์๋ต์ ์ฒ๋ฆฌํ๋ ์๋ฐ ๊ฐ์ฒด
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์คํ ํ๊ฒฝ์ ๋ํ๋ด๋ ์๋ธ๋ฆฟ ์ปจํ ์คํธ(Servlet Context)๋ฅผ ์์ฑํ๊ณ ,
๊ทธ ์์ ์ฌ๋ฌ ์๋ธ๋ฆฟ์ ๋ฑ๋กํด ๋ก๋๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ํฌํจํ๋ MVC ํจํด์์๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ(Dispatcher Servlet)์ด
๋ชจ๋ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ก ์ธํด ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ค๊ณ ๋ ํฉ๋๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ ์ง์ ์ฒ๋ฆฌํ์ง ์๊ณ ,
์คํ๋ง์ด ๊ด๋ฆฌํ๋ ๋น์ด ๋ฑ๋ก๋ ์ปจํ ์ด๋(=์คํ๋ง ์ปจํ ์คํธ)์์
๋ค์ด์จ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ ํ ์ปจํธ๋กค๋ฌ ๋น์ ์ฐพ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ์์ํฉ๋๋ค.
์ด ์์ฒญ๋ค์ ์ฒ๋ฆฌํ๋ ์คํ๋ง ์ปจํ ์คํธ ์์๋ ์ปจํธ๋กค๋ฌ์ ์๋น์ค, ๋ ํฌ์งํ ๋ฆฌ ๋น ๋ฑ์ด ๋ด๊ฒจ ์์ต๋๋ค.
ํํฐ(Filter)
ํํฐ๋ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ ์ ์ฒ๋ฆฌ/ํ์ฒ๋ฆฌ ๋ก์ง์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๋ถ๊ฐ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ฃ .
ํํฐ๋ ์คํ๋ง์ด ์๋๋ผ ์๋ฐ ์๋ธ๋ฆฟ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ ํ url ํจํด๋ณ ๋ชจ๋ ์์ฒญ์ ๋ํด ๋ถ๊ฐ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์์ฒญ์ ๋ํด ์์ ์ ํ๋ค๊ณ ํ๋ ํท๊ฐ๋ฆด ์ ์์ง๋ง, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์คํ๋๊ธฐ ์ด์ ๋จ๊ณ์์ ์์ฒญ/์๋ต์ ๊ฐ๋ก์ฑ ์์ ํ๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
์ฆ, ์คํ๋ง์์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด๋
์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ์์ญ์ ๋๋ค.

์์๋ก ๊ณตํต ๋ก๊น ๋๋ Spring Security ํํฐ ์ค์ ์ด ์์ต๋๋ค.
Spring Security ์ค์ ์์ `/login` ์์ฒญ์ ๊ฐ๋ก์ฑ ์ปจํธ๋กค๋ฌ๊น์ง ๊ฐ์ง ์๊ณ ๋ ์ ์ ๋ฅผ ์ธ์ฆํ๋ ํํฐ๋ฅผ ๊ตฌํํ ์ ์์ฃ .
์๋๋ฉด ์ธ์ฆ์ด ํ์ํ url์ ๋ํด ์ธ์ฆ๋ ์ ์ ์ธ์ง ํ์ธํ๋ ํํฐ๋ ํฌํจ๋ฉ๋๋ค.
ํํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ `javax.servlet`์ Fitler ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ฉฐ,
๋ค์๊ณผ ๊ฐ์ ํต์ฌ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
- `init()`
- ํํฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ณ , ์๋น์ค์ ์ถ๊ฐํ๊ธฐ ์ํ ๋ฉ์๋
- ์ด ๋ฉ์๋๋ฅผ 1ํ ์คํํ์ฌ ํํฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ฉด ์ดํ ์์ฒญ๋ค์ `doFilter()`๋ฅผ ํตํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
- `doFilter()`
- url ํจํด์ ๋ง๋ ๋ชจ๋ HTTP ์์ฒญ์ด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌ๋๊ธฐ ์ ์ ์คํ๋๋ ๋ฉ์๋
- FilterChain์ ํตํด ๋ค์ ๋จ๊ณ๋ก ์์ฒญ์ด ์ ๋ฌ๋ฉ๋๋ค.
- `destroy()`
- ํํฐ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ ์ฌ์ฉํ๋ ์์์ ๋ฐํํ๋ ๋ฉ์๋
์ธํฐ์ ํฐ(Interceptor)
์ธํฐ์ ํฐ ์ญ์ ํํฐ์ฒ๋ผ
์์ฒญ/์๋ต์ ๊ฐ๋ก์ฑ ์ถ๊ฐ ๋ก์ง์ ์ํํฉ๋๋ค.
ํํฐ์ ๋ฌ๋ฆฌ, ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ์ ์ด๋ฉฐ ์คํ๋ง ์ปจํ ์คํธ์์ ๋์ํฉ๋๋ค.
๋ค๋ง ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ๋๊ธฐ๊ธฐ ์ ๋๋ ์ปจํธ๋กค๋ฌ๊ฐ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์๋ต์ ๋๊ธฐ๊ธฐ ์ ๊ณผ ๊ฐ์ด
๋์คํจ์ฒ ์๋ธ๋ฆฟ๊ณผ ์ปจํธ๋กค๋ฌ ์ฌ์ด์์ ๋์ํฉ๋๋ค.

์ธํฐ์ ํฐ๋ `org.springframework.web.servlet`์ `HandlerInterceptor` ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ฃผ์ ๋ฉ์๋๋ 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
- `preHandle()`
- ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์คํ๋๋ ๋ฉ์๋
- ์ปจํธ๋กค๋ฌ ์ด์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑ
- `postHandle()`
- ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ ํ์ ์คํ๋๋ ๋ฉ์๋(๋ทฐ ๋ ๋๋ง ์ )
- ์ปจํธ๋กค๋ฌ ์ดํ์ ์ฒ๋ฆฌํด์ผ ํ๋ ํ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑ
- `afterCompletion()`
- ๋ชจ๋ ๋ทฐ์์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ์ผ์ ํฌํจํด ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ํ ์คํ๋๋ ๋ฉ์๋(๋ทฐ ๋ ๋๋ง ํ)
์์ฝ
| ๊ตฌ๋ถ | ํํฐ(Filter) | ์ธํฐ์ ํฐ(Interceptor) |
| ๊ด๋ฆฌ ์ฃผ์ฒด | ์๋ธ๋ฆฟ ์ปจํ ์ด๋ | ์คํ๋ง ์ปจํ ์ด๋ |
| ์คํ ์์ (๋จ๊ณ) | ํด๋ผ์ด์ธํธ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ ์ฌ์ด | ๋์คํจ์ฒ ์๋ธ๋ฆฟ๊ณผ ์ปจํธ๋กค๋ฌ ์ฌ์ด |
| ์คํ๋ง์ ์์ธ ์ฒ๋ฆฌ ์ฌ๋ถ | X (์คํ๋ง ์์ธ ์ฒ๋ฆฌ๊ฐ ์ ์ฉ ์ ๋จ) | O (์คํ๋ง์ `@ExceptionHandler`, `ControllerAdvice`๊ฐ ์ ์ฉ๋จ) |
| Request/Response ๊ฐ์ฒด ์กฐ์ ๊ฐ๋ฅ ์ฌ๋ถ | O | X |
| ์ฉ๋ | - ์์ฒญ ๋จ์ ๋ณด์/์ธ์ฆ/์ธ๊ฐ ์์
(ํ ํฐ ์ ํจ์ฑ ๋ฑ ์ด ์์ฒญ์ด ์๋ฒ๋ก ๋ค์ด์๋ ๋๋์ง 1์ฐจ์ ์ผ๋ก ๊ฑฐ๋ฆ) - ๋ชจ๋ ์์ฒญ์ ๋ํ ๋ก๊น (์ปจํธ๋กค๋ฌ ํธ์ถ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์) - Spring๊ณผ ๋ถ๋ฆฌ๋์ด์ผ ํ ๊ธฐ๋ฅ |
- ์ธ๋ถ์ ์ธ ๋ณด์/์ธ์ฆ/์ธ๊ฐ ์์
(ํน์ API๋ณ Role ํ์ธ) - API ํธ์ถ์ ๋ํ ๋ก๊น - ์ปจํธ๋กค๋ฌ๋ก ๋๊ฒจ์ฃผ๋ ๋ฐ์ดํฐ์ ๊ฐ๊ณต |
์ฐธ๊ณ ์๋ฃ
[Spring] ํํฐ(Filter)์ ์ธํฐ์
ํฐ(Interceptor)์ ๊ฐ๋
๋ฐ ์ฐจ์ด
[Spring] ํํฐ(Filter) vs ์ธํฐ์
ํฐ(Interceptor) ์ฐจ์ด ๋ฐ ์ฉ๋ - (1)
[Spring] Dispatcher-Servlet(๋์คํจ์ฒ ์๋ธ๋ฆฟ)์ด๋? ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๊ฐ๋
๊ณผ ๋์ ๊ณผ์
+ ๊ฐ์ด ์ฝ์ผ๋ฉด ์ข์ ๊ธ: Spring BOOT์ @RestController: HTTP ์์ฒญ์ ๋ํ ์๋ต ์ฒ๋ฆฌ ๊ณผ์
'๐ฟSpring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring] AOP ๊ธฐ๋ฐ API ์์ฒญ๋ณ ์ฟผ๋ฆฌ ํ์ / ์คํ ์๊ฐ ์ธก์ ์นด์ดํฐ ๊ตฌํ (0) | 2025.11.02 |
|---|---|
| [Spring] AOP(Aspect Oriented Programming) ๊ฐ๋ ์ดํดํ๊ธฐ (1) | 2025.09.15 |
| [Spring] DI(Dependency Injection) ์์กด์ฑ ์ฃผ์ (4) | 2025.08.14 |
| [Spring] IoC ์ ์ด์ ์ญ์ (1) | 2025.08.12 |
| Spring์์ ์บ์ ์ฌ์ฉํ๊ธฐ: CaffeineCache, @Cacheable, @CachePut, @CacheEvict (1) | 2025.06.12 |
