5 분 소요

고급 기능

필터

  • 서블릿이 수행되기 전이나 후에 추가 기능을 수행
  • 서블릿과 별도의 객체로 분리, javax.servlet.Filter 상속
  • 작업 순서
    • Filter 인터페이스 상속받아 필터 객체 구현 ⇒ <filter> 태그로 web.xml에 필터 객체 등록 ⇒ <filter-mmapping> 태그로 web.xml에 필터 매핑 설정

구현 가능 기능

  • 서블릿이 호출되기 전에 서블릿 요청 가로채는 기능
  • 서블릿이 호출되기 전에 요청 내용을 점검하는 기능
  • 요청 헤더의 수정과 조정 기능
  • 서블릿이 호출된 후에 서블릿 응답을 가로채는 기능
  • 응답 헤더의 수정과 조정 기능

필터를 서블릿과 분리해서 구현하는 이유

  • 유지 보수성이 높은 시스템 개발
  • 하나의 서블릿에 여러개의 필터, 여러개의 서블릿에 하나의 필터 수행

구현

public class SampleFilter implements Filter {
	public void init(FilterConfig config) {
		// 필터 객체 생성 시 한 번 수행되는 초기화 코드
	}
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		// 서블릿 수행 전에 수행할 코드
		chain.doFilter(req, res);
		// 서블릿 수행 후에 수행할 코드
	}
}
  • java.servlet.Filter 인터페이스 상속 ⇒ 모든 메소드 재정의
  • init()
    • 필터 객체가 생성될 때 호출. 서버가 시작될 때 한번만 호출되기 때문에 주로 초기화 기능 구현
  • destroy()
    • 필터 객체가 삭제될 때 호출되는 메소드. 자원 해제 기능
  • doFilter(ServletRequest, ServletResponse, FilterChain)
    • 필터링 설정한 서블릿을 실행할 때마다 호출되는 메소드. 실제 필터링 기능 구현
    • doFilter 메소드에 chain.doFilter() 명령문이 없으면 실행 흐름은 더 이상 진행하지 못하고 현재 메소드에서 끝나게 됨

필터 등록

  • web.xml 파일에 <filter> 태그 사용

      <filter>
      	<filter-name>flow2</filter-name>
      	<filter-class>com.edu.test.FlowFilterTwo</filter-class>
      	<init-param>
      		<param-name>en</param-name>
      		<param-value>UTF-8</param-value>
      	</init-param>
      </filter>
    
    • <filter> : javax.servlet.Filter 인터페이스를 상속받고 있는 객체 등록
    • <filter-name> : 등록하는 필터의 논리적 이름 지정
    • <filter-class> : 등록하는 필터의 클래스 이름 지정
    • <init-param> : web.xml에서 필터 객체에 변수 전달
    • <param-name> : 필터 객체에 전달하는 변수의 이름 지정
    • <param-value> : 필터 객체에 전달하려는 변숫값 지정

    ### web.xml 작성 시 태그 순서

      <display-name?>
      <description?>
      <distributeable?>
      <context-param*>
      <filter*>
      <filter-mapping*>
      <listener*>
      <servlet*>
      <servlet-mapping*>
      <welcome-file-list?>
      <error-page*>
        
      <!-- 
      	? : 사용되지 않을 수도 있고 사용되면 한번만 사용
      	* : 사용되지 않을 수도 있고 여러번 사용될 수 있음
      --!>
    

필터 매핑

<filter-mapping>
	<filter-name></filter-name>
	<url-pattern>	</url-pattern>
</filter-mapping>
  • <filter-mapping> : <filter> 태그가 어떤 서블릿을 필터링할 것인지 설정
  • <filter-name> : 실행할 필터 지정. 필터의 클래스 이름이 아닌 <filter-name> 태그에 저장한 이름
  • <url-pattern> : 필터링할 서블릿 지정. 클라이언트가 요청하는 URL 지정
  • <servlet-name> : <servlet-name> 태그에서 지정된 값만 사용 가능
  • FilterChain
    • void doFilter(ServletRequest request, ServletResponse, FilterChain chain
    • 필터가 실행될 때 doFilter() 메소드의 세 번째 인자로 전달
    • 하나의 요청에 필터들이 실행되고, 서블릿이 실행될 때 처리 흐름을 제어할 수 있는 객체
  • FilterConfig
    • 필터 객체의 init() 메소드의 인자값으로 전달되는 객체
    • 필터에 대한 정보값 추출하는 메소드 갖고 있음
    • 필터에 대한 정보는 web.xml <filter> 태그로 지정 ⇒ <filter> 태그에 대한 정보값 추출할 목적

@WebFilter 어노테이션

  • 작업 순서
    • Filter 인터페이스 상속받아 필터 객체 구현 ⇒ 필터 객체에 @WebFilter 어노테이션 선언 ⇒ @WebFilter()에 filterName 속성 추가⇒ @WebFilter()에 urlParams 속성 추가
  • WebFilter
    • urlPatterns, value : 필터링할 페이지의 실행요청 URL 지정. 반드시 지정해야 할 속성으로 둘 중 어느 것을 사용해도 상관없음
    • servletNames : 필터링 할 서블릿 이름 지정
    • filterName : 등록하는 필터의 이름
    • initParams : 필터에 전달하는 초기 파라미터 값
  • 필터 매핑 설정 방법
    • @WebFilter(”/login”)
      • 클라리언트가 요청하는 페이지의 실행 요청 url 설정
    • @WebFilter(”/*”)
      • 와일드 카드 사용해서 설정
    • @WebFilter(value=”/hello”)
      • value 속성으로 지정
    • @WebFilter(”/hello”)
      • urlPatterns 속성으로 지정

리스너

  • 어떤 일이 발생하기를 기다렸다가 그 일이 발생했을 때 수행되는 메소드를 가지고 있는 자바 객체 ⇒ 이벤트 핸들러

리스너 종류

  • 객체 생성, 삭제 이벤트
  • 속성의 추가, 삭제, 대체 이벤트

등록

  • 원하는 내용을 해당 이벤트 핸들러 객체를 상속받아 구현 ⇒ 컨테이너가 인식하도록 web.xml에 등록

      <listener>
      	<listener-class></listener-class>
      </listener>
    
    • <listener> : 리스너 객체를 등록할 때 사용하는 태그
    • <listener-class> : <listener> 태그를 사용할 때 반드시 지정해야 하는 태그. 실제 리스너 객체의 클래스 이름을 패키지 이름과 함께 정확하게 지정

구현

  • HttpServletRequest 객체
    • 클라이언트에게 서블릿 요청을 받았을 때 생성되었다가 요청이 끝나고 응답할 때 삭제
    • HttpServletRequest 객체가 초기화되거나 해제되는 시점에 발생하는 이벤트는 ServletRequestEvent, 객체에 속성을 등록, 추출 대체하는 시점에 발생하는 이벤트는 ServletRequestAttributeEvent.
  • HttpSession 객체
    • HttpSession 객체가 생성되거나 해제되는 시점에 발생하는 이벤트 HttpSessionEvent, 객체에 속성을 등록, 추출, 대체하는 시점에 발생하는 이벤트 HttpSessionBindingEvent
  • ServletContext 객체
    • 웹 애플리케이션 서비스가 준비되는 시점에 생성, 중지될 때 삭제
    • 객체가 초기화되거나 삭제되는 시점에 발생하는 이벤트 ServletContextEvent, 객체에 정보 등록, 삭제, 대체하는 시점에 발생하는 이벤트 ServletContextAttributeEvent

@WebListener 어노테이션

  • 작업 순서
    • 원하는 이벤트를 가지고 있는 리스너 객체 상속하여 메소드 구현
    • 구현된 리스너 클래스 선언부 앞에 @WebListener 어노테이션 선언

오류 처리

  • try-catch 블록 사용
  • 메소드 선언부에 throws 절 선언
  • web.xml에 오류 처리 설정

자바 오류 객체

  • 자바는 모든 내용을 객체로 표현 ⇒ 오류도 객체로 표현, java.lang 패키지에서 기본으로 제공
  • Throwable 객체는 모든 오류들의 최상위 객체 ⇒ Throwable 객체를 상속하고 있는 겍체 Error, Exception
    • Error : 물리적 오류
    • Exception : 프로그램적인 오류
  • Exception 하위 객체
    • RuntimeException : 실행 중 발생하는 오류
      • NullPointerException ⇒ 프로그램 개발 시 가장 많이 발생하는 오류
    • IOException : 외부 데이터와 입출력 작업 중 발생하는 오류

프로그램 내에서 오류 처리

  • try-catch 처리
    • 오류가 발생했을 때 프로그램 실행이 강제로 중단되지 않도록 프로그램 내에서 발생한 오류를 적절하게 처리하기 위해 사용
    • 오류가 발생할 수 있는 잠재적 위험이 있는 명령문 try { } 안에 작성 ⇒ catch() 문 안에 처리할 오류 타입의 변수 선언 ⇒ catch { } 안에 오류 발생 시 실행할 오류 처리 구문 구현
  • throws 선언
    • 메소드 선언부에 나오며 throws 다음에 발생할 수 있는 오류들 나열
    • 오류를 메소드 내에서 처리하지 않고 호출한 곳에서 처리하라고 선언 ⇒ 메소드를 호출하는 곳의 상황에 맞게 동적으로 처리하기 위함
  • web.xml
    • 오류가 발생했을 때 처리할 페이지를 web.xml 파일에 지정
    • 동일한 오류에 try-catch 구문, web.xml 중복 설정되면 try-catch가 항상 우선 처리
    • web.xml 오류 처리는 현재 웹 애플리케이션 전체가 대상, try-catch 구문은 try 블록만 대상
    • web.xml 파일에 설정하는 <error-page> 태그 사용법 두가지

        <error-page>
        	<error-code></error-code>
        	<location></location>
        </error-page>
              
        <error-page>
        	<exception-type></exception-type>
        	<location></location>
        </error-page>
      
      • <error-page> : 웹 애플리케이션에서 발생하는 오류를 처리할 때 사용하는 태그. 처리할 오류와 페이지가 무엇인지 값으로 지정
      • <error-code> : 처리할 오류 지정하는 태그. 오류 코드로 값 지정
      • <exception-type> : 처리할 오류를 지정하는 또 다른 태그. 오류가 정의된 객체 이름으로 지정(패키지 이름과 함께 정확하게 지정)
      • <location> : 오류가 발생했을 때 실행할 페이지 경로 지정(정확하게)
    • 서버는 오류 처리 페이지로 넘어가기 전 오류 정보를 HttpServletRequest 객체에 등록한 다음 오류 처리 페이지로 이동 ⇒ 오류 처리 페이지에서 전달받은 HttpServletRequest객체에 발생한 오류에 대한 정보 등록되어 있음 ⇒ 이 정보를 기반으로 발생한 오류에 적절한 오류 처리
      • javax.servlet.error.status_code : 발생된 오류 코드 정보
      • javax.servlet.error.exception_type : 발생된 오류 객체의 타입 정보를 가지고 있는 Class형 객체
      • javax.servlet.error.message : 발생된 오류의 메세지 정보
      • javax.servlet.error.exception : 발생된 오류 객체
      • javax.servlet.error.request_uri : 오류가 발생된 페이지의 URI 정보