춘식이왔엉
초보 개발자의 기록
춘식이왔엉
  • 분류 전체보기
    • ElasticSearch
    • ETL
    • 네트워크
    • 교육과정 기록
      • 🎨UI구현
      • 💻back-end
      • Java Script
      • jQuery
      • 💾DB & SQL
      • ☕ Java
      • 🧇 Python
      • 🪀알고리즘
    • 📘에러 노트
    • git
    • 자유로운 이야기
      • 📚자격증
      • 🏋️‍♂️운동 기록

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

공지사항

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
춘식이왔엉

초보 개발자의 기록

[7.18] 서블릿 Listener / Filter
교육과정 기록/💻back-end

[7.18] 서블릿 Listener / Filter

2022. 7. 19. 03:58

서블릿 이벤트

서블릿은 다양한 시점에 발생되는 이벤트와 이벤트를 처리하기 위한 인터페이스를 정의하고 있다.

이들 이벤트와 인터페이스를 이용하면 웹 어플리케이션에서 필요로 하는 데이터의 초기화나 요청 처리 등을 추적할 수 있고, 데이터 저장 영역 ( application, session, request)에 데이터가 들어가고 나가는 (혹은 그 객체가 생성되고 소멸되는) 일련의 작업들에 대해 컨트롤이 가능하다.

이런 이벤트에 대해서 미리 web.xml 파일에 등록해두면 웹 서버는 초기 구동 시에 해당 이벤트를 대기 상태로 두었다가 이벤트 발생 시 자동으로 이벤트를 감지하고 우리가 지정한 클래스 내의 메서드를 실행해준다.

때문에 서블릿에서 이벤트 클래스를 실행되게 하려면 web.xml 파일의 설정이 중요하다. 

이러한 이벤트는 외부의 변화보다는 내부의 변화를 처리하는 경우가 많다.

< 이벤트 리스너의 종류 > 

1. ServletContextListener

- 웹 어플리케이션의 시작과 종료시 자동으로 발생

2. SevletContextAttributeListener

- ServletContext 객체에 속성이 추가, 삭제, 수정될 때 발생

3. HttpSessionListener

- HttpSession 객체가 생성되거나 소멸될 때 발생

4. HttpSessionAttributeListener

- HttpSession 객체에 속성이 추가, 삭제, 수정될 때 발생

 

ServletContextListener API

서블릿이 LifeCycle를 가지고 있는 것처럼, 웹 어플리케이션도 LifeCycle를 갖는다.

Tomcat 컨테이너가 시작될 때 웹 어플리케이션도 초기화되고, Tomcat 컨테이너가 종료될 때 웹 어 플리케이션도 제거된다.

웹 어플리케이션이 초기화되고 제거되는 이벤트를 감지하는 ServletContextListener API를 사용하면, 언제 초기화되고 제거 되었는지를 쉽게 알 수 있다.

< 실습 > 

1) Listener 클래스 작성

public class ServletContextListenerImpl 
	implements ServletContextListener {		// default 메소드가 들어있음
	
	@Override
	public void contextInitialized(ServletContextEvent e)  { 	// 웹어플리케이션에 필요한 자원객체 생성
		log.trace("contextInitialized() invoked.");
    }//contextInitialized
	
	@Override
    public void contextDestroyed(ServletContextEvent e)  {  // 사용했던 자원객체 해제
        log.trace("contextDestroyed() invoked.");
    }//contextDestroyed
	
}//class

 

2) web.xml에 태그를 사용하여 등록하거나, @WebListener 어노테이션을 사용하여 등록

* web.xml 파일 설정

- <listener> 태그를 사용해 ServletContextListener를 구현한 클래스를 등록.

- 리스너로 등록되면 Tomcat 컨테이너가 시작 및 종료 시에 이벤트를 감지할 수 있음

 

* @WebListener 어노테이션

- web.xml에 <listener> 태그를 등록하는 대신에, 어노테이션으로 listener 등록이 가능하다.

@WebListener
public class ServletContextListenerImpl 
	implements ServletContextListener {  
   }

 

콘솔창 로그 확인

- 초기화 감지

- 제거 감지


 

 

Filter API

 

클라이언트인 웹 브라우저에서 서블릿으로 요청하면, 웹 컴포넌트인 서블릿이 요청을 받아 서 작업을 처리하고 결과를 HTML 형식으로 작성하여 웹 브라우저에게 응답 처리한다.

이때, 서블릿이 요청 받기 전과 결과를 웹 브라우저에게 응답하기 전에 특정 작업을 수행할 수 있도록 Filter API를 사용할 수 있다.

즉, 웹 컴포넌트가 실행되기 전의 선처리(pre-processing) 작업과 응답되기 전의 후처리(post-processing) 작업을 수행하는 API이다.

다수의 Filter를 체인(Chain)처럼 묶어서 적용시킬 수도 있으며, 선처리 작업의 필터를 요청 필터(Request Filter)라고 하고 후처리 작업의 필터를 응답필터(Response Filter)라고 한다.

  • 선 처리 작업의 대표적인 적용 예 - 한글인코딩 및 보안관련 작업 등
  • 후처리 작업 -  압축 및 데이터 변환작업 등

 

< 실습 >

1) Filter 인터페이스를 구현한 클래스를 작성

public class MyFilter 
   extends HttpFilter implements Filter {
 
   public void init(FilterConfig fConfig) throws ServletException {
	      log.trace("MyFilter 초기화");
   } // init    

   
   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
         throws IOException, ServletException {
      
      // 1. 요청에 대한 선처리 (Pre-processing or Munging)
      log.info("\t+ Pre-processing for request.");    
      res.setContentType("text/html; charset=utf8");
      
      // 요청(request)에 대한 선처리와 응답(response)에 후처리를 제어하는 호출
      	chain.doFilter(req, res);  

      // 2. 응답에 대한 후처리 (Post-processing)
      log.info("\t+ Post-processing for request.");
            
   } // doFilter
   
   public void destroy() {
	      log.trace("MyFilter 제거");
   } // destroy

} // end class

 

2) web.xml에 태그를 사용하여 등록하거나, @WebFilter 어노테이션을 사용하여 등록

- web.xml 설정

- @WebFilter 어노테이션 사용

@WebFilter("/*")
public class MyFilter extends HttpFilter implements Filter {
}

 

3) 콘솔창 로그를 통해 Filter가 적용되었는지 확인

- 초기화

 

- Filter 작업 ( 선처리 / 후처리 )

 

- 제거

저작자표시 비영리 변경금지 (새창열림)

'교육과정 기록 > 💻back-end' 카테고리의 다른 글

[7.25] 서블릿 - 파일 업로드 & 다운로드  (0) 2022.07.25
[7.21] 서블릿 - 세션 관리  (0) 2022.07.21
[7.15] 서블릿에서 파일 접근  (0) 2022.07.15
[7.14] 서블릿 핵심 클래스  (0) 2022.07.14
[7.13] 서블릿 (맵핑 & API & 파라미터 처리)  (0) 2022.07.14
    '교육과정 기록/💻back-end' 카테고리의 다른 글
    • [7.25] 서블릿 - 파일 업로드 & 다운로드
    • [7.21] 서블릿 - 세션 관리
    • [7.15] 서블릿에서 파일 접근
    • [7.14] 서블릿 핵심 클래스
    춘식이왔엉
    춘식이왔엉
    개발 공부를 하면서 정리하는 블로그입니다.

    티스토리툴바