서블릿의 라이프사이클과 선/후처리 할 수 있는 방법에 대해 알아보자.


◆ 웹에서의 경로

프로그래밍 중 헤깔려 할 수 있는 부분중 하나가 경로인데, 경로에 대한 개념을 잡아두면 경로코딩에 대한 어려움을 덜어낼 수 있다.

▶ 절대경로

웹 프로젝트에서 경로를 적게 되는 경우 / 로 시작하는 경로를 절대경로라고 한다.
웹 프로젝트의 경우 프로젝트안의 WebContent가 ‘/’가 되고 WebContent디렉터리를 시작으로 그 안부터 찾게 된다.

=> 또한 이는 주소창의 ip뒤에 직접 붙는 경로와 같으므로, 프로젝트의 접근경로를 수정했을 시 주의해서 사용해야 한다. ( 절대경로일 경우 수정한 경로도 포함해서 써 주어야 한다. )
ex ) /window/01.jsp => 192.168.10.80/window/01.jsp


▶ 상대경로

상대경로는 / 로 시작하지 않는 현재위치에서부터 찾아가는 경로로, 상대경로로 적게 되는 경우에는 수정한 경로명을 고려할 필요는 없다.


◆ Servlet 라이프 사이클

1. 서블릿 객체생성( 각각 페이지 최초 접근 시 한번 )

=> 객체 생성이 최초 한 번 뿐이고, 이 후 재활용 되기 때문에 다른 언어에 비해 처리속도가 빠르다.
즉, 모든 클라이언트는 해당 서블릿 객체를 공유하는 것이다.

2. init()호출( 최초 접근 시 한번 )

3. service()/doGet()/doPost() 호출 ( 요청 시 마다 )

=> service()는 get또는 post로 접근 시 호출되는 메서드로 get/post상관없이 구현할 때 사용할 수 있으며, doGet()/doPost()와 같이 있을 시에는 해당 메서드가 호출된 후 호출된다.

4. destroy() 호출 (마지막 한 번 )


=> Init()/destory()형태

// 이클립스의 기능을 이용하여 쉽게 만들  있다.
@Override
public void init() throws ServletException {
	System.out.println("서버가동");
	super.init();
}
	
@Override
public void destroy() {
	System.out.println("서버종료");
	super.destroy();
}
  • 참고
    같은 IP를 가지고 있는 PC라고 할 지라도 브라우저가 다를 경우 브라우저는 이를 다른 클라이언트라고 판단한다.


◆ Servlet 선처리/후처리

위의 init()메서드와 destory()메서드의 전/후 처리를 할 수 있는 타이밍을 제공해주는 메서드가 있다.
위 init()과 destory()는 오버라이드 하는 것이지만, 선/후처리 메서드는 임의의 메서드에 어노테이션을 붙여 만든다.

선 처리와 후처리 메서드는 이름이 정해져 있지 않고 임의의 메서드를 만들어 어노테이션을 붙임으로서 만들어진다. 선처리는 @PostConstruct / 후처리는 @PreDestory

@PostConstruct
private void firstInit() {
	System.out.println("선처리");
}
	
@PreDestroy
private void lastDestory() {
	System.out.println("후처리");
}

init()호출 -> 선처리메서드()호출 -> … -> destory()호출 -> 후처리메서드()호출


◆ 어플리케이션 리스너

어플리케이션은 서블릿과 달리 전체 서블릿을 통틀어 포함하고 있는 웹 프로젝트 전체를 말한다.
어플리케이션 리스너 클래스를 작성하여 서버가 작동되고 종료될 때 제어할 수 있는 선/후 처리작업을 만들 수 있다.
즉, 어플리케이션 라이프 사이클의 시작과 끝에서 제어할 수 있는 것이다.

▶ 리스너 작성

어플리케이션 리스너는 ServletContextListener인터페이스를 구현하여 만든다.
따라서 그 안에 contextDestoryed(ServletContextEvent e), contextInitialized(ServletContextEvent e)메서드를 반드시 오버라이드한다. 해당 두 메서드가 어플리케이션의 선/후처리를 담당하는 메서드이다.
( 이클립스에서 자동으로 만들어 주는 기능이 있으니 참조 )


▶ 리스너 등록

리스너를 작성만 하면 되는 것이 아니라 서블릿의 매핑작업처럼 리스너를 등록해줄 필요가 있다. 리스너 등록에는 두 가지 방법이 있다.

1. web.xml에 등록
<listener>
	<listener-class>listener.ServletListener</listener-class>
</listener>

위와 같이 서블릿등록할 때와 비슷한 방법으로 등록해 준다.


2. 어노테이션등록

서블릿의 매핑작업 처럼 간단하게 @WebListener어노테이션을 적어 등록할 수도 있다.

@WebListener
public class ServletListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent arg0)  { 
    	System.out.println("서버종료");
    }

    public void contextInitialized(ServletContextEvent arg0)  { 
    	System.out.println("서버구동");
    }
	
}