초보개발자 긍.응.성
Servlet 구조 분석(1) - Servlet, ServletConfig, ServletContext 본문
Spring MVC는 Servlet위에 구현되어 있습니다. Servlet에 대한 이해가 없다면 그만큼 Spring에서 제공하는 기능을 뒤에서 어떻게 동작하는지 모르게 된다고 생각하였기에 docs를 보며 구조를 분석하여 보았습니다.
1. Interface Servlet
Servlet이 구현해야 할 모든 method가 정의되어 있는 interface이다.
Servlet에 대한 기본 개념은 아래 게시물을 참조하면 좋겠다.
interface의 가장 중요한 service 만 구현하고 싶다면 구현체 GenericServlet과 HttpServlet을 사용할 수 있다.
package javax.servlet;
...
public interface Servlet {
void init(ServletConfig config) throws ServletException;
// Servlet이 생성된 후 init 메서드를 통해 초기화한다
ServletConfig getServletConfig();
// 서블릿 초기화에 이용된 ServletConfig를 반환한다. init 함수에서 파라미터로 받아온 그 ServletConfig이다
// 구현체인 GenericServlet 같은 경우 init으로 넘어온 ServletConfig 를 attribute로 갖고있고 이를 반환하도록 구현되있다
void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;
// 파라미터로 들어온 요청(resquest)에 대해 처리하여 응답(response)을 생성한다
// multithread환경에서 동시에 여러 요청을 처리하여야 하므로, 공유할 변수의 일관성을 생각하여 multi-threaded programming을 적용해야 안전하다
// ServletException: servlet의 기능을 수행하는데 발생하는 예외
// IOException: input과 output에 대해 발생하는 예외
String getServletInfo();
// 해당 서블릿에 대한 정보를 반환한다
// 일반적으로 서블릿 정보, 저자, 버전 그리고 저작권 등에 대한 정보를 반환한다
// XML이나 HTML과 같은 markup언어가 아닌 String 으로 작성한다
void destroy();
// Servlet Container 가 종료되면 생성된 모든 서블릿에 대해 destroy 메서드가 실행된다. 그 후 GC에 의해 정리된다
}
2. Interface ServletConfig
서블릿 컨테이너가 서블릿을 생성하고 초기화할 때 전달하는 설정에 대한 interface이다.
package javax.servlet;
...
public interface ServletConfig {
String getServletName();
// 서블릿의 이름을 반환한다
// 이 이름은 서버관리자가 지정해 주거나, 웹 애플리케이션에서 배포 설명자 혹은 클래스이름으로 정해지게 된다
ServletContext getServletContext();
// 실행중인 caller가 참조하는 ServletContext를 반환한다
// ServletContext에 대해서는 항목 3 에서 정리한다
String getInitParameter(String name);
// 초기화에 사용될 파라미터 이름`name`에 해당하는 값을 반환한다
// 해당 초기화 파라미터가 없다면 null 을 반환한다
Enumeration<String> getInitParameterNames();
// 초기화 할 파라미터들의 이름에 대한 Enumeration을 가져온다
// 이름은 String형이므로 반환형은 Enumeration<String>이다
}
3. public Interface ServletContext
너무 많은 메서드가 존재하고 모든 세세한 기능들은 다 파악하지 못했다. 그냥 어떤 목적을 위해 존재하는 interface 인지만 알아보았다.
하나의 서블릿이 서블릿 컨테이너가 정의하고 관리하는 자원을 사용하기 위한 메서드들을 가지고 있는 interface이다.
예를 들어 GenericServlet의 log함수는 ServletContext에서 정의된 log메서드를 이용한다.
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
...
public void log(String msg) {
this.getServletContext().log(this.getServletName() + ": " + msg);
}
...
Web Application 당 하나의 context가 존재한다. Web Application 은 서블릿 컨테이너 내에서 application 단위로 서블릿을 관리하게 되며 정보를 공유할 수 있게 도와주는 역할을 담당한다.
서블릿에 대한 정보를 가져오려면 ServletContainer에 접근해야 하는데 이때 접근을 가능하게 해주는 것이 ServletContext이다.
ServletConfig의 getServletContext() 메서드를 통해 ServletContext를 얻을 수 있고, GenericServlet과 HttpServlet의 경우 getServletContext를 통해 ServletContext를 불러올 수 있다.
ServletContext를 이용할 때 가능한 작업
- 파일의 MIME type을 얻는다
- log파일에 log를 기록한다
- 서블릿의 버전을 확인한다
- 서버 url에 해당하는 ServletContext 객체를 얻습니다
※ 참고자료
'WEB' 카테고리의 다른 글
Servlet 구조 분석(5) - ServletResponse (0) | 2020.04.18 |
---|---|
Servlet 구조 분석(4) - ServletRequest (0) | 2020.04.18 |
Servlet 구조 분석(3) - HttpServlet (0) | 2020.04.18 |
Servlet 구조 분석(2) - GenericServlet (0) | 2020.04.18 |
Filter 와 Interceptor의 차이란? (0) | 2020.04.12 |
JSP란? (0) | 2020.04.10 |
Apache & Nginx & Tomcat란? (0) | 2020.04.09 |
Reverse Proxy란? (0) | 2020.04.09 |