-
서블릿(Servlet)의 이해 ServletContextListener기술 2020. 6. 29. 18:07
스프링에 대한 포스팅을 하기 전, 서블릿은 무엇인지에 대해 시리즈로 정리하려한다.
서블릿은 정적인 html표준 마크업 언어로만 이루어진 http request/response를 자바 어플리케이션에서 받아 처리할 수 있도록 고안된 구현체이다.
여기서 자바 어플리케이션은 오픈소스인 톰캣, JBOSS, Wildfly / 상용 WAS인 WebLogic, WebSphere, Jeus 등이다. 나열한 자바 어플리케이션들은 어플리케이션 개발자가 웹 서버를 구축할 때 바로 사용할 수 있도록 만들어져있다.
그럼 서블릿을 구현체라고 한 이유는 무엇일까.
기본적으로 *.jsp에 매핑된 org.apache.jasper.servlet.JspServlet와 같은 완성형 서블릿도 탑재하고있으나, 개발자가 직접 구현하고자하는 서블릿은 직접 구현해줘야하기 때문이다. 따라서 extends 와 implements 를 통해 부모클래스를 상속받거나 인터페이스를 구현하는 방식으로 자바 웹 어플리케이션을 작성하도록 되어있다.
http요청이 자바 웹 어플리케이션 컨테이너로 가면 HTTP Servlet Request/Response객체를 담고있는 서블릿 인스턴스가 되며, 이러한 Servlet Request는 URI정보에 따라 서블릿에 매핑되어 구현된 혹은 구현할 서블릿 클래스에서 동작하게 되는 원리다.
이해가 안돼도 상관없다.. 오늘 포스팅과 다음 포스팅까지 천천히 따라오면 이런 원리구나 하고 자연스럽게 이해될 것이다.
이번 포스팅에서는 WAS가 기본적으로 제공하는 common라이브러리를 활용해서 ServletContextListener를 만들어 볼 것이다.
ServletContextListener는 context의 라이프사이클을 감시하는 기능을 제공한다. 현업에서는 보통 WAS기동 시 web.xml에 listener와 context-param을 정의하여 어플리케이션에 필요한 value들을 불러오는데 사용한다. Spring에서도 사용하고 있으니 잘 알아두어야한다.
자바 어플리케이션은 기본적으로 class형태의 바이트코드로 컴파일되어 동작한다.
그말인 즉은 JAVA기반 WAS에서도 class또는 lib가 필요하다. 우선 자바파일을 하나 만들어보자.
ServletContextListener를 implements 한다 ServletContextListener를 구현하기위해 test_listener를 정의했다.
이제 context를 초기화하자.
ServletContextEvent에서 사용할 수 있는 함수 인터페이스를 구현하면 contextInitialized 함수에서 ServletContextEvent를 파라미터로 받는다.
이 sce가 context의 라이프사이클을 감시하며 초기화 되는 순간 수행할 여러가지 이벤트를 정의해줄 수 있다.
메소드 명을 잘 보면 필터 등록, JSP파일, 리스너 등록, 서블릿 등록 등 관련된 많은 이벤트를 정의할 수 있다. 이 메소드들을 직접 활용해보길 바란다.
우선 메소드의 호출시점을 확인하기 위한 print문과 ServletContext가 어떤 역할을 하는지 눈으로 확인하기 위해 간단한 코드를 작성하였다.
ServletContextListener 인터페이스 구현 예제 이제 클래스로 컴파일 후 WEB-INF/classes 에 패키지형태로 등록해주고 web.xml에 리스너를 등록해주면 된다.
테스트용 클래스 파일 등록 web.xml 설정 이제 리스너를 통해 등록된 서블릿 컨텍스트를 불러 사용해보는 간단한 JSP파일을 작성하고, WAS를 실행해보겠다.
등록한 서블릿 컨텍스트를 사용하는 JSP 예제 아까 구현했던 ServletContextListener에서 name에 sanghoon이라는 String객체를 할당했다.
WAS기동 시 화면 WAS를 기동하면 ServletContextListener 인터페이스를 구현한 test_listener 클래스를 통해 contextInitailized가 수행된 것을 알 수 있다.
제대로 꺼내와져서 사용되는지 테스트 페이지에서 확인.
테스트 페이지 확인 contextInitailized를 통해서 ServletContext에 String객체를 할당하고 이를 JSP에서 꺼내 활용했다.
String객체가 된다면 다른 객체도 같은 방식으로 활용할 수 있을 것이다.
이해가 안되는 부분이나, 포스팅에 잘못된 부분이 있다면 댓글로 남겨주시길!
'기술' 카테고리의 다른 글
Kafka Quick guide (0) 2021.07.16 Eclipse에서 외부 jar/class 보는 방법(JadClipse) (0) 2020.12.07 메이븐으로 Spring 프로젝트 생성 (0) 2020.06.19 JAVA(자바) 접근 제어자/정보은닉 (0) 2020.05.25 WAS용도 SSL keystore 제작과정 (0) 2020.05.13