“컨트롤러 앞에서 공통 로직을 한 번에 적용한다”
“로그인 체크를 어디에 넣어야 하지?”
보호해야 하는 URL이 많아지면
컨트롤러마다 똑같은 코드를 반복하게 된다.
HttpSession session = req.getSession(false);
if (session == null || session.getAttribute("loginUser") == null) {
resp.sendRedirect("/login-form");
return;
}
이걸 모든 서블릿에 복붙하면
- 코드가 중복되고
- 빠뜨리기 쉽고
- 유지보수도 힘들어진다
그래서 “요청이 컨트롤러에 들어가기 전에” 공통 로직을 적용하는 장치가 필요하다.
그게 필터(Filter)이다.
필터는 “서블릿 앞단에서 실행되는 가로채기(Interceptor)”이다
필터는 서블릿 API에서 제공하는 특별한 객체이다.
- 요청이 서블릿/JSP에 도달하기 전에 실행된다(사전 처리)
- 필요하면 서블릿 실행 후에도 실행될 수 있다(사후 처리)
- 특정 URL 패턴에만 적용할 수 있다
즉 필터는 “컨트롤러 앞에서 공통 처리를 한 번에 적용하는 장치”이다.
필터의 핵심 메서드: doFilter()
필터는 doFilter() 메서드 하나가 핵심이다.
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
여기서 중요한 포인트는 두 가지이다.
- Filter는 HTTP 전용이 아니다
- 그래서 파라미터 타입이 ServletRequest/ServletResponse이다
- HTTP 기능이 필요하면 HttpServletRequest/HttpServletResponse로 다운캐스팅한다
- 반드시 chain.doFilter()를 호출해야 다음 단계로 진행된다
- 이 호출을 하지 않으면 요청이 필터에서 멈춘다
- 즉 “통과시키지 않겠다”는 의미가 된다
이 구조 덕분에 필터는 다음이 가능하다.
- 조건이 맞으면 통과(chain.doFilter)
- 조건이 틀리면 여기서 끊고 redirect/에러 처리
@WebFilter로 적용 범위를 지정한다
필터는 모든 요청에 다 걸 수도 있고,
특정 경로에만 걸 수도 있다.
예를 들어
- @WebFilter("/*") : 전체 요청
- @WebFilter("/todo/*") : todo 아래만
실무에서는 보통 “로그인 체크”처럼 필요한 범위만 걸어주는 방식이 많다.
로그인 체크 필터 흐름
로그인 체크 필터는 보통 이런 흐름으로 작성한다.
- 현재 요청 URI를 확인한다
- 로그인 페이지/로그인 처리 URL은 예외로 통과시킨다
- 그 외 경로는 세션에서 loginUser를 확인한다
- 없으면 로그인 페이지로 redirect 한다
- 있으면 chain.doFilter로 통과시킨다
이렇게 하면 컨트롤러마다 로그인 체크 코드를 쓰지 않아도 된다.
필터는 UTF-8 인코딩 처리에도 자주 쓰인다
POST로 한글이 깨지는 문제는
컨트롤러마다 request.setCharacterEncoding("UTF-8")을 넣으면 해결되지만
이것도 중복이 생긴다.
그래서 인코딩 처리도 필터로 많이 뺀다.
즉 필터는 로그인뿐 아니라 “모든 공통 관심사”를 처리하는 도구이다.
핵심 정리
- 필터는 서블릿 앞에서 실행되는 공통 처리 장치이다
- doFilter에서 chain.doFilter를 호출해야 다음 단계로 넘어간다
- HTTP 기능이 필요하면 HttpServletRequest/Response로 다운캐스팅한다
- 로그인 체크, 인코딩 처리 같은 반복 코드를 필터로 분리할 수 있다
'Web > Web Basics' 카테고리의 다른 글
| [데이터 처리와 DB연동] 1. DTO / VO(Entity) / DAO / Service는 왜 나누는가? (0) | 2026.03.30 |
|---|---|
| [상태 유지와 공통 처리] 5. 리스너(Listener)란? (0) | 2026.03.30 |
| [상태 유지와 공통 처리] 3. SESSIONID이란? (0) | 2026.03.30 |
| [상태 유지와 공통처리] 2-1. req.getSession()과 JSESSIONID, HttpSession (0) | 2026.03.30 |
| [상태 유지와 공통 처리] 2. 세션이란? (0) | 2026.03.30 |