서블릿의 라이프사이클과 선/후처리 할 수 있는 방법에 대해 알아보자.
◆ 웹에서의 경로
프로그래밍 중 헤깔려 할 수 있는 부분중 하나가 경로인데, 경로에 대한 개념을 잡아두면 경로코딩에 대한 어려움을 덜어낼 수 있다.
▶ 절대경로
웹 프로젝트에서 경로를 적게 되는 경우 / 로 시작하는 경로를 절대경로라고 한다.
웹 프로젝트의 경우 프로젝트안의 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()형태
-
- 참고
- 같은 IP를 가지고 있는 PC라고 할 지라도 브라우저가 다를 경우 브라우저는 이를 다른 클라이언트라고 판단한다.
◆ Servlet 선처리/후처리
위의 init()메서드와 destory()메서드의 전/후 처리를 할 수 있는 타이밍을 제공해주는 메서드가 있다.
위 init()과 destory()는 오버라이드 하는 것이지만, 선/후처리 메서드는 임의의 메서드에 어노테이션을 붙여 만든다.
선 처리와 후처리 메서드는 이름이 정해져 있지 않고 임의의 메서드를 만들어 어노테이션을 붙임으로서 만들어진다. 선처리는 @PostConstruct / 후처리는 @PreDestory
init()호출 -> 선처리메서드()호출 -> … -> destory()호출 -> 후처리메서드()호출
◆ 어플리케이션 리스너
어플리케이션은 서블릿과 달리 전체 서블릿을 통틀어 포함하고 있는 웹 프로젝트 전체를 말한다.
어플리케이션 리스너 클래스를 작성하여 서버가 작동되고 종료될 때 제어할 수 있는 선/후 처리작업을 만들 수 있다.
즉, 어플리케이션 라이프 사이클의 시작과 끝에서 제어할 수 있는 것이다.
▶ 리스너 작성
어플리케이션 리스너는 ServletContextListener인터페이스를 구현하여 만든다.
따라서 그 안에 contextDestoryed(ServletContextEvent e), contextInitialized(ServletContextEvent e)메서드를 반드시 오버라이드한다. 해당 두 메서드가 어플리케이션의 선/후처리를 담당하는 메서드이다.
( 이클립스에서 자동으로 만들어 주는 기능이 있으니 참조 )
▶ 리스너 등록
리스너를 작성만 하면 되는 것이 아니라 서블릿의 매핑작업처럼 리스너를 등록해줄 필요가 있다. 리스너 등록에는 두 가지 방법이 있다.
1. web.xml에 등록
위와 같이 서블릿등록할 때와 비슷한 방법으로 등록해 준다.
2. 어노테이션등록
서블릿의 매핑작업 처럼 간단하게 @WebListener어노테이션을 적어 등록할 수도 있다.