Filter๋ ์ ํ์ํ ๊น?
์ฐ๋ฆฌ๊ฐ ์น ์๋น์ค๋ฅผ ๋ง๋ค๋ฉด ์๋ง์ ์์ฒญ๋ค์ด ๋ค์ด์ค๋๋ฐ, ์ด๋ ๋ชจ๋ ์์ฒญ์ ๊ณตํต์ ์ผ๋ก ํด์ผ ํ๋ ์์ ๋ค์ด ์๋ค.
์๋ฅผ๋ค์ด
๋ก๊ทธ์ธํ๋์ง ์ฌ๋ถ
๋ก๊ทธ ๋จ๊ธฐ๊ธฐ(๋๊ฐ ์ธ์ ๋ญ ์์ฒญํ๋์ง)
์์ฒญ์ ์ธ์ฝ๋ฉ ์ ์ฉ
๊ทผ๋ฐ ์ด๊ฑธ ๋งค๋ฒ ์ปจํธ๋กค๋ฌ๋ง๋ค ๋ฐ๋ณตํด์ ์ฐ๋ฉด ๋๋ฌด ๋นํจ์จ์ ์
๊ทธ๋์ ์ค๊ฐ์์ ๊ฐ๋ก์ฑ์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ณตํต์์ ์๊ฐ ํ์ํจ -> Filter
Filter๋ ์ด๋์ ๋์ํ๋๊ฐ?
[์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ] → [Filter] → [์๋ธ๋ฆฟ(Servlet)] → [Controller]
- ์ฌ์ฉ์์ ์์ฒญ์ด ์ค๋ฉด ๋จผ์ Filter๊ฐ ๊ฐ๋ก์ฑ
- ์ฌ๊ธฐ์ ๋ก๊ทธ์ธ ์ฌ๋ถ ๊ฒ์ฌ, ๋ก๊ทธ ์ถ๋ ฅ ๊ฐ์ ๊ฑธ ํ๊ณ
- ํต๊ณผ๋๋ฉด ๋ค์ ๋จ๊ณ(์๋ธ๋ฆฟ)๋ก ๋๊ฒจ์ฃผ๋ ๊ฑฐ์
Filter์ ์ญํ
1. ์ธ์ฆ๊ฒ์ฌ -> ๋ก๊ทธ์ธํ ์ฌ๋๋ง ์์ฒญ ๊ฐ๋ฅํ๊ฒ
2. ๋ก๊น
-> ๋๊ฐ ์ธ์ ์ด๋์ ์์ฒญํ๋์ง ์ถ๋ ฅ
3. ์๋ต์กฐ์-> ์์ฒญ๊ฒฐ๊ณผ๋ฅผ ์์ ํด์ ๋ฐํ
4. ์์ฒญ์ฐจ๋จ-> ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด ์์ฒญ ์์ฒด๋ฅผ ๋ง์
Servlet Filter vs Controller
| ๊ตฌ๋ถ | Servlet Filter | Controller |
| ์์น | ๋งจ ์๋จ์์ ๋์ | ํต์ฌ ๋ก์ง ์ฒ๋ฆฌ |
| ์ฉ๋ | ๊ณตํต ๊ธฐ๋ฅ(๋ณด์, ์ธ์ฆ, ๋ก๊น ๋ฑ) | ๋น์ฆ๋์ค ๋ก์ง(ํ์๊ฐ์ , ๊ธ์ฐ๊ธฐ ๋ฑ) |
| ํธ์ถ์์ | ์์ฒญ์ด ๋ค์ด์ค์๋ง์ | Filter๋ฅผ ๋ชจ๋ ํต๊ณผํ ํ |
์ฝ๋ ํ๋ฆ ํ๋์ ๋ณด๊ธฐ
1) Filter๋ง๋ค๊ธฐ
System.out.println(...)//<= ๋จ์ ์ถ๋ ฅ
log.info(...)//<= ๋ก๊น
์ ์ฉ ๋๊ตฌ
public class CustomFilter implements Filter {
@Override <= ์ธํฐํ์ด์ค๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ doFilter๊ฐ์ ธ์ด
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// ์์ฒญ ๊ฐ๋ก์ฑ๊ธฐ
HttpServletRequest httpRequest = (HttpServletRequest) request;// <=ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ , ์ฑ, Postman ๋ฑ)๊ฐ ๋ณด๋ธ HTTP ์์ฒญ
System.out.println("์์ฒญ URI = " + httpRequest.getRequestURI());
//request๋ ServletRequest๋ผ๋ ์ธํฐํ์ด์ค ํ์
//httpRequest์์๋ ๋ธ๋ผ์ฐ์ ๋ Postman ๊ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์์ฒญ ์ ๋ณด๊ฐ๋ค์ด์์
// ๋ค์์ผ๋ก ๋๊น (ํํฐ or ์๋ธ๋ฆฟ)
chain.doFilter(request, response);
// ํํฐ๋ ์์ฒญ์ ๊ฐ๋ก์ฑ์ ๊ฒ์ฌํ๊ฑฐ๋ ๋ก๊น
ํ๊ฑฐ๋ ์ฒ๋ฆฌํ๋ ์ญํ .
//์ต์ข
๋ชฉ์ ์ง๋ Controller.
// ๊ทธ๋์ ์ฌ๊ธฐ์ doFilter()๋ฅผ ํธ์ถํด์ผ ๋ค์ ๋จ๊ณ๋ก ์์ฒญ์ ๋๊น.
//๋ง์ฝ, chain.doFilter()ํธ์ถ ์ ํ๋ฉด , ์์ฒญ์ ๋ค์ ๋จ๊ณ๋ก ์ ๋ ์ ๋์ด๊ฐ.
}
}
2) ๋ฑ๋กํ๊ธฐ(์ฐ๋ฆฌ๊ฐ ๋ง๋ ๊ฐ์ฒดFilter์ Spring์๊ฒ ์๋ ค์ฃผ๋ ์์ )
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean customFilter() {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();//<=bean์ ์ฌ๋ฃ ๋ด๊ธฐ
bean.setFilter(new CustomFilter()); // ํํฐ ๋ฑ๋ก <= ํํฐ๋ HTTP ์์ฒญ์ ๊ฐ๋ก์ฑ์ ์ ์ฒ๋ฆฌํ๋ ๋์ฐ๋ฏธ
bean.setOrder(1); // ์์ ์ง์ <=ํํฐ๋ ์ฌ๋ฌ ๊ฐ ์์ ์ ์์
// ์ธ์ฆ, ๋ก๊น
, XSSํํฐ <= ๋๊ฐ ๋จผ์ ์คํ๋๋ฉด ์ข์์ง ์์๋ฅผ ์ ํด์ผ ํจ.
// ์์๊ฐ ์ค์ํ ์ด์ : ์ธ์ฆ์ ๋จผ์ ํ๊ณ , ๊ทธ๋ค์ ๋ก๊น
ํด์ผ ํ ์๋ ์์ผ๋๊น.
bean.addUrlPatterns("/*"); // ๋ชจ๋ ์์ฒญ์ ํํฐ ์ ์ฉ
// /*๋ ๋ชจ๋ URL์์ฒญ์ ์๋ฏธํจ.
//์ฆ, ์ด๋ค URL๋ก ์์ฒญ์ด ์๋ ์ด ํํฐ๋ฅผ ๋ฌด์กฐ๊ฑด ๊ฑฐ์ณ๊ฐ๊ฒ ํ๊ฒ ๋ค
return bean;//<= ๋ง์ง๋ง์ผ๋ก ์ฌ๋ฃ ๋ฐํ
}
}
Filter vs Interceptor vs AOP (์ธ์ ๋ญ ์จ์ผ ๋ผ?)
| ๊ตฌ๋ถ | ์ค๋ช | ์ฌ์ฉ ์๊ธฐ |
| Filter | ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ, HTTP ์์ค์ ์์ฒญ์ ๋ค๋ฃธ | ์์ฒญ URL๊ฒ์ฌ, ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ |
| Intercepter | Spring์์ Controller ์ ์ ๋ผ์ด๋ฌ | ์ปจํธ๋กค๋ฌ ์๋ค๋ก ๋ก์ง ์ฝ์ ํ ๋ |
| AOP | ์ฝ๋ ์คํ ์ /ํ๋ฅผ ๊ฐ์ธ๋ ๊ตฌ์กฐ | ๋ก๊น , ํธ๋์ญ์ , ๊ณตํต ๋ก์ง ์ ์ฉ ๋ฑ |
'Backend > ๐ฑ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring]API ๋ก๊น (0) | 2025.08.21 |
|---|---|
| [Spring]ํ์ผ๊ตฌ์กฐ (์ค์) (0) | 2025.07.29 |
| [Spring] filter์ค์ต๊น์ง ์งํํ ํ ์ดํดํ ๋ด์ฉ ์ ๋ฆฌ (1) | 2025.07.29 |
| [Spring] Bean Validation (5) | 2025.07.28 |
| [Spring]์์กด๊ด๊ณ ์ฃผ์ (DI) (2) | 2025.07.28 |