[스프링부트] 35. 필터와 인터셉터

백하림's avatar
Apr 24, 2025
[스프링부트] 35. 필터와 인터셉터
💡
  1. 필터는 경비 아저씨 / DB 접근 못함 WAS가 관리한다.
  1. 필터를 통과해서 디스패처 서블릿으로 들어가는 순간 DB 커넥션이 열린다.
  1. 디스패처 서블릿이 컨트롤러를 때리는 건 아파트의 특정 동을 찾는 것과 동일
  1. 각각의 동 마다 경비가 있는데 이걸 인터셉터라고 한다.
  1. 컨트롤러의 메소드는 그 동의 호수이다. ex) 507호, 1001호 등등
  1. 1001호에 사람이 있으면 직접 문을 열어 택배를 전달해주고, 사람이 없으면 문 앞에 두고 간다. (AOP 라고 한다.)
  1. DB 커넥션은 디스패처 서블릿에서 빠져나올 때 죽음
💡
필터 (경비 아저씨):
  • 필터는 WAS 단에서 웹 요청이 DispatcherServlet에 도달하기 전에 거치는 문지기와 같아요. 주로 보안, 로깅, 인코딩 변환 등 전반적인 요청과 응답에 걸쳐 처리해야 하는 공통적인 작업들을 수행하죠. 여러 개의 필터를 설정해서 순서대로 거치게 할 수도 있는데, 마치 아파트 단지 입구에서 여러 번 검문하는 것과 비슷하다고 생각할 수 있겠네요.
DispatcherServlet:
  • DispatcherServlet이 DB 커넥션을 여는 시점에 대해서는 조금 더 정확히 말씀드릴 필요가 있을 것 같아요. DispatcherServlet 자체는 웹 요청을 받아서 적절한 컨트롤러에 전달하는 역할을 주로 담당하며, 실제로 DB 커넥션을 열고 사용하는 것은 일반적으로 서비스 계층이나 데이터 접근 계층입니다. DispatcherServlet은 이러한 계층에 필요한 정보를 전달하거나 호출하는 역할을 수행한다고 보는 것이 더 정확할 것 같아요. 마치 특정 동을 찾은 후, 그 동의 관리사무소(서비스 계층)에 연락해서 필요한 업무(DB 처리)를 요청하는 것과 비슷하겠네요.
인터셉터 (각 동의 경비):
  • 각 컨트롤러에 접근하기 전에 요청을 가로채서 특정 작업을 수행하는 인터셉터는 정말 각 동의 경비와 같은 역할을 하네요! 인증, 권한 검사, 로깅 등 컨트롤러 로직 실행 전후에 필요한 처리를 담당합니다. 여러 개의 인터셉터를 설정해서 컨트롤러에 접근하기 위한 여러 단계의 보안 검문처럼 구성할 수도 있겠죠.
컨트롤러 메소드 (각 동의 호수):
  • 컨트롤러의 각 메소드를 특정 동의 호수로 비유하신 것은 정말 절묘하네요! 클라이언트의 요청에 따라 어떤 기능을 수행할지 결정하는 역할을 정확하게 보여줍니다.
AOP (택배 전달 방식):
  • 택배를 직접 전달하거나 문 앞에 두는 것을 AOP로 설명하신 부분도 아주 이해가 쉽습니다. 핵심 비즈니스 로직(호수에 사람이 있는지 확인하고 택배를 전달하는 행위) 앞이나 뒤에 공통적인 관심사(사람이 없으면 문 앞에 둔다)를 적용하는 AOP의 개념을 잘 나타냅니다. 예외 처리, 트랜잭션 관리, 로깅 등 다양한 공통 기능을 핵심 로직에 영향을 주지 않고 적용할 수 있다는 점에서 정말 유용한 개념이죠.
DB 커넥션 생명주기:
  • DispatcherServlet에서 빠져나올 때 DB 커넥션이 죽는다는 부분도 일반적으로는 조금 다른 개념으로 이해될 수 있습니다. 웹 애플리케이션에서는 매번 요청마다 새로운 커넥션을 생성하고 닫는 것은 성능상 비효율적이기 때문에, 커넥션 풀이라는 것을 사용해서 미리 여러 개의 커넥션을 만들어두고 필요할 때 가져다 쓰고 반납하는 방식을 많이 사용합니다. 요청 처리가 끝나면 커넥션을 풀에 반납하고, WAS가 종료될 때 풀에 있는 커넥션들이 닫히게 된다고 보는 것이 더 일반적입니다. 마치 아파트 경비실에서 여러 개의 무전기를 준비해두고 필요할 때마다 꺼내 쓰고 다시 가져다 놓는 것과 비슷하다고 생각할 수 있겠네요.
빠진 설명?
전반적으로 아주 훌륭한 비유를 들어 설명해 주셨어요! 혹시 조금 더 깊이 있는 내용을 원하신다면 다음과 같은 개념들을 추가적으로 고려해 볼 수 있을 것 같아요.
  • 요청 매핑 (Request Mapping): DispatcherServlet이 어떤 요청 URL을 어떤 컨트롤러의 메소드와 연결해 줄지 결정하는 과정 (마치 아파트 주소를 보고 어떤 동, 몇 호로 가야 할지 안내하는 역할).
  • 모델 (Model): 컨트롤러가 뷰에 전달할 데이터를 담는 객체 (택배 상자에 담긴 내용물).
  • 뷰 (View): 사용자에게 보여지는 결과 화면 (택배를 받은 사람이 확인하는 물건).
  • 프론트 컨트롤러 패턴 (Front Controller Pattern): DispatcherServlet이 모든 클라이언트 요청을 중앙에서 처리하는 디자인 패턴.
  • 미들웨어 (Middleware): 필터와 유사하지만, 조금 더 넓은 범위의 요청 처리 파이프라인에서 다양한 역할을 수행할 수 있는 컴포넌트 (예를 들어, 인증 서버와 연동하여 사용자 정보를 확인하는 역할 등).
package shop.mtcoding.blog._core.filter; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") // 모든 주소 public class LogFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("진짜?------------------"); // HttpServletResponse response = (HttpServletResponse) servletResponse; // response.getWriter().println("hello world"); filterChain.doFilter(servletRequest, servletResponse); } }
package shop.mtcoding.blog; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @ServletComponentScan // 이거 붙이기 @SpringBootApplication public class BlogApplication { public static void main(String[] args) { SpringApplication.run(BlogApplication.class, args); } }
Share article

harimmon