본문 바로가기
교재 실습/자바 웹 개발 워크북

33. 필터 사용하기 (2)

by Jint 2022. 1. 30.

Filter 인터페이스에 선언된 세 개의 메서드인 init(), doFilter(), destroy()는 필터의 생명주기와 관련된 메서드다. 이 메서드들이 언제 호출되는지 순서를 살펴본다.

 

서블릿 컨테이너는 웹 애플리케이션을 시작할 때 배치기술서(web.xml)에 등록된 필터의 인스턴스를 생성하며 필터에 대해 준비작업을 하도록 init()를 한 번 호출한다. 클라이언트의 요청이 들어오면 그 요청에 해당하는 필터의 doFilter()를 호출하고, doFilter()에서는 필터로서 해야 할 작업을 실행한 뒤 다음 필터의 doFilter()를 호출한다. 마지막 필터까지 이 과정을 반복한다. 마지막 필터는 내부적으로 서블릿의 service()를 호출한다. 서블릿의 service() 호출이 끝나면 service()를 호출했던 이전 필터로 돌아간다. 이런식으로 반복해서 제일 처음 호출되었던 필터까지 돌아간다. 마지막으로 클라이언트에게 응답 결과를 보낸다.

 

doFilter()에 필터가 할 일을 작성한다. 이 메서드에서 다음 필터를 호출하는 nextFilter.doFilter()를 기준으로, 호출 전은 서블릿 실행 전에 처리할 작업을 적고 호출 후는 서블릿 실행 후 처리할 작업을 적는다. 호출 전에 주로하는 작업은 문자집합 설정, 압축해제, 암호화된 데이터 복원, 로그 작성, 사용자 검증, 사용권한 확인 등을 수행한다. 호출 후에 주로하는 작업은 응답 데이터 압축, 응답 데이터 암호화, 데이터 형식 변환 등을 수행한다.

 

- 필터의 배치

필터의 배치 방법도 서블릿과 마찬가지로 DD파일(web.xml)에 기술하는 방법과 필터의 소스 파일에 어노테이션을 이용하여 직접 배치 정보를 설정하는 방법이 있다.

 

먼저 web.xml 파일에 문자 집합을 설정하는 필터를 등록한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
		 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
		 id="WebApp_ID"
		 version="3.1">
  <display-name>web04</display-name>
  
  	<!-- 컨텍스트 초기화 파라미터 -->
	<context-param>
		<param-name>driver</param-name>
		<param-value>com.mysql.jdbc.Driver</param-value>
	</context-param>
	<context-param>
		<param-name>url</param-name>
		<param-value>jdbc:mysql://localhost/studydb</param-value>
	</context-param>
	<context-param>
		<param-name>username</param-name>
		<param-value>study</param-value>
	</context-param>
	<context-param>
		<param-name>password</param-name>
		<param-value>study</param-value>
	</context-param>
  
  	<!-- 필터 선언 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>spms.filters.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	
	<!-- 필터 URL 매핑 --> 
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	...

  <welcome-file-list>
	<welcome-file>index.html</welcome-file>
	<welcome-file>index.htm</welcome-file>
	<welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

컨텍스트 매개변수를 정의하는 태그 다음에 필터를 선언하는 태그를 두는데 사실 Servlet2.4 이상부터는 순서에 상관없이 태그를 작성할 수 있지만 이전 버전과의 호환을 위해 컨텍스트 매개변수를 정의하는 태그 뒤에 작성했다.

 

톰캣 서버를 재시작한 뒤 테스트하면 정상적으로 회원 정보 등록과 변경이 수행된다.

 

@WebFilter 어노테이션을 사용하여 문자 집합을 설정하는 필터를 CharacterEncodingFilter 클래스에 등록한다.

package spms.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

@WebFilter(
	urlPatterns="/*",
	initParams={
		@WebInitParam(name="encoding",value="UTF-8")
	})
public class CharacterEncodingFilter implements Filter {
	
	...
	
}

톰캣 서버를 재시작한 뒤 테스트하면 정상적으로 회원 정보 등록과 변경이 수행된다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글