[상태 유지와 공통 처리] 4. 필터(Filter)란?

2026. 3. 30. 10:17·Web/Web Basics

 

“컨트롤러 앞에서 공통 로직을 한 번에 적용한다”

“로그인 체크를 어디에 넣어야 하지?”

 

보호해야 하는 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)

여기서 중요한 포인트는 두 가지이다.

  1. Filter는 HTTP 전용이 아니다
  • 그래서 파라미터 타입이 ServletRequest/ServletResponse이다
  • HTTP 기능이 필요하면 HttpServletRequest/HttpServletResponse로 다운캐스팅한다
  1. 반드시 chain.doFilter()를 호출해야 다음 단계로 진행된다
  • 이 호출을 하지 않으면 요청이 필터에서 멈춘다
  • 즉 “통과시키지 않겠다”는 의미가 된다

이 구조 덕분에 필터는 다음이 가능하다.

  • 조건이 맞으면 통과(chain.doFilter)
  • 조건이 틀리면 여기서 끊고 redirect/에러 처리

 

 

@WebFilter로 적용 범위를 지정한다

필터는 모든 요청에 다 걸 수도 있고,
특정 경로에만 걸 수도 있다.

예를 들어

  • @WebFilter("/*") : 전체 요청
  • @WebFilter("/todo/*") : todo 아래만

실무에서는 보통 “로그인 체크”처럼 필요한 범위만 걸어주는 방식이 많다.

 

 

로그인 체크 필터 흐름

로그인 체크 필터는 보통 이런 흐름으로 작성한다.

  1. 현재 요청 URI를 확인한다
  2. 로그인 페이지/로그인 처리 URL은 예외로 통과시킨다
  3. 그 외 경로는 세션에서 loginUser를 확인한다
  4. 없으면 로그인 페이지로 redirect 한다
  5. 있으면 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
'Web/Web Basics' 카테고리의 다른 글
  • [데이터 처리와 DB연동] 1. DTO / VO(Entity) / DAO / Service는 왜 나누는가?
  • [상태 유지와 공통 처리] 5. 리스너(Listener)란?
  • [상태 유지와 공통 처리] 3. SESSIONID이란?
  • [상태 유지와 공통처리] 2-1. req.getSession()과 JSESSIONID, HttpSession
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발서적
    java
    aws
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
[상태 유지와 공통 처리] 4. 필터(Filter)란?
상단으로

티스토리툴바