[ 목차 ]
공통 관심사
로그인 여부를 확인하는 로직을 모든 메서드마다 작성해놓아야 하는 경우, 로그인 여부를 확인하는 로직을 공통 관심사라고 한다.
공통 관심사는 Servlet Filter, Spring Intercepter를 사용한다.
Servlet Filter
- 공통 관심사 로직 처리
- 공통된 로직을 중앙 집중적으로 구현하여 재사용성이 높고 유지보수가 쉽다.
- 모든 요청이 하나의 입구를 통해 처리되어 일관성을 유지한다.
- filter는 개발자가 순서를 지정하여 자유롭게 추가할 수 있다.
- HTTP 요청 및 응답 필터링
- Filter Chain
- 여러 개의 필터가 순차적으로 적용될 수 있다.
- filterChain.doFilter(request, response); 다음 필터로 제어를 전달한다.
- doFilter()
- 실제 필터링 작업을 수행하는 주요 메소드로 필터가 처리할 작업을 정의한다.
- 다음 필터로 제어를 넘길지 여부를 결정한다.
- Filter를 적용하면 Servlet이 호출되기 이전에 Filter를 항상 거치게된다.
- 공통 관심사를 필터에만 적용하면 모든 요청 or 응답에 적용된다 .
- Filter는 특정 URL Pattern에 적용할 수 있다.
- Spring을 사용하는 경우 Servlet은 **Dispatcher Servlet**이다.
filter interface
Java Servlet에서 HTTP 요청과 응답을 가로채고, 이를 기반으로 다양한 처리 작업을 수행하는 데 사용되는 Interface이다.
- 주요 메서드
- init()
- Filter를 초기화하는 메서드이다.
- Servlet Container가 생성될 때 호출된다.
- default ****method이기 때문에 implements 후 구현하지 않아도 된다.
- doFilter()
- Client에서 요청이 올 때 마다 doFilter() 메서드가 호출된다.
- doFilter() 내부에 필터 로직(공통 관심사 로직)을 구현하면 된다.
- WAS에서 doFilter() 를 호출해주고 하나의 필터의 doFilter()가 통과된다면
- Filter Chain에 따라서 순서대로 doFilter() 를 호출한다.
- 더이상 doFilter() 를 호출할 Filter가 없으면 Servlet이 호출된다.
- Client에서 요청이 올 때 마다 doFilter() 메서드가 호출된다.
- destroy()
- 필터를 종료하는 메서드이다.
- Servlet Container가 종료될 때 호출된다.
- default method이기 때문에 implements 후 구현하지 않아도 된다.
- setFilter()
- 등록할 필터를 파라미터로 전달하면 된다
- setOrder()
- Filter는 Chain 형태로 동작한다.
- 즉, 실행될 Filter들의 순서가 필요하다.
- 파라미터로 전달될 숫자에 따라 우선순위가 정해진다.
- 숫자가 낮을수록 우선순위가 높다.
- addUrlPatterns()
- 필터를 적용할 URL 패턴을 지정한다
- 여러개 URL 패턴을 한번에 지정할 수 있다.
- 규칙은 Servlet URL Pattern과 같다.
- filterRegistrationBean.addUrlPatterns("/*")
- 모든 Request는 Custom Filter를 항상 지나간다.
- init()
@Slf4j
public class CustomFilter implements Filter {
@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain
) throws IOException, ServletException {
// Filter에서 수행할 Logic
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
log.info("request URI={}", requestURI);
// chain 이 없으면 Servlet을 바로 호출
chain.doFilter(request, response);
}
}
Servlet Filter 요약 정리
- Filter를 사용하려면 Filter Interface를 Implements 하여 구현한다.
- 구현한 Filter를 Bean으로 등록 한다.
- HTTP 요청이 오면 doFilter() 메서드가 호출된다.
- ServletRequest는 기능이 별로 없어서 HttpServletRequest로 다운 캐스팅 해야한다.
- chain.doFilter(request, response)
- (순서를 설정해둔)다음 필터가 있으면 Filter를 호출한다.
- 다음 실행할 필터가 없으면 Servlet을 호출한다.
- 해당 메서드를 호출하지 않으면 다음 단계로 진행되지 않는다.
- 다음 필터나 Servlet을 호출하지 않는다.
- Filter를 등록하는 방법은 여러가지가 있다.
- SpringBoot의 경우 FilterRegistrationBean 을 사용한다.
'코딩 > 자바' 카테고리의 다른 글
[Spring] Spring Data JPA (0) | 2025.02.05 |
---|---|
[Spring] JPA (0) | 2025.02.05 |
[Spring] Token, JWT (0) | 2025.02.05 |
[Spring] Session (0) | 2025.02.05 |
[Spring] Cookie (0) | 2025.02.05 |