필터와 래퍼

예지성준·2024년 5월 16일
0
post-thumbnail

필터와 래퍼

요청과 응답 사이에서 걸러주는 기능

  • 웹 사이트를 개발하다보면 여러 웹 컴포넌트(JSP 페이지와 서블릿 클래스의 통칭)에 똑같은 사전작업이나 사후 작업을 해야 하는 경우가 종종 있습니다.
    예를 들어 어떤 웹 컴포넌트는 로그인한 다음에만 사용할 수 있어야 하기 때문에 먼저 로그인 여부를 체크해야 합니다. 그리고 어떤 웹 컴포넌트는 유료 서비스를 제공하기 때문에 실행 후에 요금을 부과하는 처리를 해야 합니다.

  • 각각의 웹 컴포넌트 마다 이런 코드를 따로 작성해 둔다면, 프로그래밍 분량이 굉장히 많아질 것이고, 코드 간의 일관성을 유지하기도 힘들어질 것입니다. 그러므로 이런 코드는 한 곳에 작성해 놓고 공통적으로 사용할 수 있으면 편리할 것입니다. 필터와 래퍼는 그러한 방법을 제공하는 기술입니다.

  • 필터(fiilter) 란 글자 그대로 여과기 역할을 하는 프로그램입니다. 이프로그램은 자바 클래스 형태로 구현해야 하는데, 이 클래스를 필터 클래스(filter class)라고 합니다. 하지만 이 클래스가 클래스 형태 그대로 바로 실행되는 것은 아닙니다.

  • 웹 컨터이너는 이 클래스를 가지고 필터 객체를 만들고, 그 다음에 그 필터 객체를 초기화합니다. 그리고 나서야 비로소 그 객체가 필터로서 실행될 수 있습니다. 이것은 서블릿 클래스가 서블릿 객체로 만들어지고, 초기화되고 난 다음에 실행되는 것과 마찬가지 입니다.

  • 초기화된 필터는 웹 브라우저와 웹 컴포넌트 사이에 위치하게 됩니다.

  • 웹 브라우저가 웹 컴포넌트를 호출했을 때 그 대신 필터가 호출되며, 필터는 사전작업을 수행한 다음에 웹 컴포넌트를 호출할 것입니다.

  • 그때부터 웹 컴포넌트가 시작되어서 실행되고, 실행이 끝나고 나면 제어 흐름은 다시 필터로 되돌가갈 것입니다. 그러면 필터는 필요한 사후작업을 수행한 다음에 웹브라우저로 응답을 보낼 것입니다.

필터체인메서드가 호출되지 않으면 체인이 연결되지 않는다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	// 사전 작업 기술 
	... 
	
	chain.doFilter(request, response);
	
	// 사후 작업 기술
	... 
	
}
  • chain.doFilter(request, response); : 필터의 다음번 멤버를 호출하는 역할을 하는데, 그 멤버는 필터가 될 수도 있고 웹 컴포넌트가 될 수도 있다.
  • 위에서 처럼 chain.doFilter 메서드 호출문을 기술한 다음에, 그 앞과 뒤에 웹 컴포넌트에 대한 사전작업과 사후작업에 해당하는 로직을 기술하면 필터 클래스가 완성

1. 필터 클래스, 필터 객체, 필터

Filter 인터페이스를 구현 -> 필터 클래스

2. 필터가 위치하는 곳

3. 필터 클래스의 작성, 설치, 등록

✅서블릿 설정 먼저!

✅필터 만들기
✔필터클래스 생성

init이랑 destroy는 default메서드라 override안해줘도 된다.

#web.xml 
<filter>
	<filter-name>..</filter-name>
	<filter-class>...</filter-class>
</filter>
<filter-mapping>
	<filter-name>...</filter-name>
	<url-pattern>...</url-pattern>
</filter-mapping>
#필터 등록
<filter>
        <filter-name>board-filter</filter-name>
        <filter-class>filters.BoardFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>board-filter</filter-name>
        <url-pattern>/board</url-pattern>
    </filter-mapping>
  • 필터 체인(filter chain)
    다음 필터를 체크하게되고 있으면 넘어가고 없으면 마지막으로 응답을 하게된다.

✅ 필터클래스 하나 더 만든 후 필터체인으로 연결

✔web.xml에 board2필터 추가 등록

<filter>
        <filter-name>board2-filter</filter-name>
        <filter-class>filters.Board2Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>board2-filter</filter-name>
        <url-pattern>/board</url-pattern>
    </filter-mapping>

실행! - 요청

필터가 더이상 없으면 doGet실행


✅ 공통 필터 만들기

✔web.xml에 common필터 추가 등록

<filter>
        <filter-name>common-filter</filter-name>
        <filter-class>filters.CommonFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>common-filter</filter-name>
        <url-pattern>/*</url-pattern><!--모든 경로에 다 유지할 필터-->
    </filter-mapping>

http://localhost:3000/day04/board url요청🔽

http://localhost:3000/day04/member/join url요청🔽

4. 필터 클래스의 init 메서드와 destroy 메서드

init() : 필터 객체가 생성이 되고 처음 1번 호출 -> 설정

destroy() : 필터 객체가 소멸 전에 1번 호출

#web.xml 
<filter>
	<filter-name>..</filter-name>
	<filter-class>...</filter-class>
          <init-param>
            <param-name>이름</param-name>
            <param-value></param-value>
        </init-param>
</filter>
<filter-mapping>
	<filter-name>...</filter-name>
	<url-pattern>...</url-pattern>
</filter-mapping>

5. 래퍼 클래스 작성 및 적용하기

이렇게 필터쪽에 직접 작성하지 않는게 좋다

공통기능은 래퍼를 이용해서 쓰는게 좋다 !!!!!!

기본 구현 클래스 - Adapter클래스:

ServletRequest 인터페이스 -> ServletRequestWrapper
ServletResponse 인터페이스 -> ServletResponseWrapper

HttpServletRequest 인터페이스 -> HttpServletRequestWrapper
HttpServletResponse 인터페이스 -> HttpServletResponseWrapper

👩‍🏫참고) 클래스명에 Wrapper있다고 해서 감싸는 구조는 아님

✅CommonRequestWrapper클래스 작성

✅필터쪽 직접 작성한 부분 변경

✔BoardController

http://localhost:3000/day04/board?id=user01주소 요청


얘도 애노테이션으로,,

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글