[JSP & Servlet 배경지식] 4. Servlet – Deployment Descriptor(DD) 2014-09-19

> DD(Deployment Descriptor : 배포서술자)를 살펴보기 전에 자바 개발환경에서의 약속된 폴더구조를 알아보자.

>>> eclipse 개발환경에서의 폴더구조
eclipse_folder
>>>>>> description
① 서블릿파일들을 소스형태로 저장한다. 주로 비지니스로직을 구현한다.
② 서블릿파일들이 빌드되어 class형태로 자동 생성된다.
③ 사용자에게 보여지는 부분을 html로 구성한다.
④ 이번 포스팅에서 설명할 배포서술자가 위치하고 있으며 없어서는 안되는 파일이다.
⑤ 개발시 사용될 라이브러리들을 다운받아 추가하고 사용한다.
>>> Tomcat 서비스 환경에서의 폴더구조
service_folder
>>>>>> description
서비스 환경에서는 소스파일은 필요가 없고 빌드된 형태로 WEB-INF/Classes 폴더에 존재하게 된다.

> DD(Deployment Descriptor : 배포서술자)는 WEB-INF폴더 아래 web.xml이라는 파일명으로 항상 존재해야 하며 서버 시작시 메모리에 로딩된다. 클라이언트 요청에 대해 컨테이너는 DD를 참조하여 해당 서블릿에 맵핑시켜 준다. 또한 DD는 다음의 여러가지 환경정보를 설정할 수 있도록 한다.

- ServletContext 설정
- Session이 유지되는 시간 설정
- Servlet/JSP에 대한 정의
- Servlet/JSP 매핑
- Mime Type 매핑
- Welcome File list
- Error Pages 처리
- 리스너/필터 설정
- 보안설정 (에러처리)
>>> ServletContext & ServletConfig

– ServletContext : 어느 서블릿 객체에서든 접근 가능한 String을 저장한다. (READ or WRITE 가능)

<context-param>
   <param-name>propertiesPath</param-name>
   <param-value>/conf/global.properties</param-value>
</context-param>
ServletContext context = this.getServletContext();
String propertiesPath = context.getInitParameter("propertiesPath");

– ServletConfig : 특정 서블릿 객체에서만 접근 가능한 String을 저장한다. (READ만 가능)

<servlet>
   <servlet-name>main</servlet-name>
   <servlet-class>com.MainServlet</servlet-class>
   <init-param>
      <param-name>title</param-name>
      <param-value>홈페이지</param-value>
   </init-param>
</servlet>
ServletConfig config = this.getServletConfig();
String title = config.getInitParameter("title");
>>> session-config : 30분설정
<session-config>
   <session-timeout>30</session-timeout>
</session-config>
>>> Servlet/JSP 정의 및 매핑
<servlet>
   <servlet-name>{서블릿이름}</servlet-name>
   <servlet-class>{서블릿이름에 해당하는 클래스}</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>{서블릿이름}</servlet-name>
   <url-pattern>{클라이언트가 요청할 url패턴}</url-pattern>
</servlet-mapping>
url-pattern의 설정법
> 이름까지 정확히 일치
   /[경로]/이름
> 디렉토리까지 일치
   /[경로]/*
> 확장자만 일치
   *.확장자
>>> mime type 매핑

특정파일을 다운로드 시켰을때 다운로드창이 아닌 파일이 깨져보일때 정상적인 다운로드를 위해 설정해야 한다.

<mime-mapping>
   <extension>xls</extension>
   <mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
* mime type
엑셀 97~2003 통합문서 (*.xls)
> application/vnd.ms-excel
엑셀 통합문서 (2007 이상 *.xlsx)
> application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
ZIP 파일 (*.zip)
> application/zip
TAR 파일 (*.tar)
> application/x-bzip
워드 97~2003 문서 (*.doc)
> application/msword
워드 문서 (2007 이상 *.docx)
> application/vnd.openxmlformats-officedocument.wordprocessingml.document
PDF 파일 (*.pdf)
> application/pdf
한글 (*.hwp)
> application/x-hwp
>>> Welcome File list

도메인으로만 접근하였을때 최초로 보여질 페이지를 지정한다.

<welcome-file-list>
   <welcome-file>index.html</welcome-file>
   <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
>>> Error Pages 처리

error 발생시 안내 페이지를 지정한다.

<error-page>
   <error-code>500</error-code>
   <location>/500.jsp</location>
</error-page>
>>> 리스너/필터 설정

– Listener : 어떠한 이벤트가 발생하면 호출되어 처리하는 객체로 인터페이스만 제공되므로 클래스는 직접 구현해야한다.

<listener>
   <listener-class>{구현된 클래스 경로}</listener-class>
</listener>

– Filter : HTTP요청과 응답을 변경할 수 있는 재사용가능한 코드로 클라이언트와 서블릿 사이에 위치하여 request & response값을 알맞게 변경 할 수있게 한다.

<filter>
   <filter-name>{필터명}</filter-name>
   <filter-class>{클래스 경로}</filter-class>
</filter>
<filter-mapping>
   <filter-name>{필터명}</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

[JSP & Servlet 배경지식] 3. Servlet – concept 2014-09-19

> 서버(Server)와 애플릿(Applet)의 약어로 동적인 웹페이지를 생성하는 서버측 프로그램 혹은 그 사양을 말하며 초창기 CGI방식 웹서버의 성능개선을 목적으로 썬마이크로시스템스에서 발표하였다.

>>> 초창기 CGI방식 웹서버와의 차이점
- 플랫폼 독립성 : JVM(자바가상머신) 위에서 동작해 하드웨어와 운영체제에 따라 다른 애플리케이션을 구현하지 않아도 된다.
- 안전성 : 악의적 혹은 잘못 작성된 서블릿이 서버의 파일시스템에 손상을 입히지 않도록 JVM 에서 접근을 제어한다.
- 효율성 : 멀티스레드 방식으로 동작하므로 서블릿이 생성되면 서버가 종료되지 않는 이상 메모리에 남게 된다. 이로 인해 이후에 오는 요청에 대해서는 서블릿을 새로 생성하지 않아도 되 시스템 메모리 활용에 큰 이점이 있다.
>>> 멀티프로세스 방식 VS 멀티스레드 방식
- 멀티 프로세스 방식
multiprocess ==> 클라이언트의 요청을 받아 웹 애플리케이션을 직접 실행하는 구조로 각각의 요청에 대해 프로세스를 생성하고 응답한 뒤 종료하는 형태이다. 이는 각각의 많은 요청이 들어오는 경우 프로세스를 계속 생성하므로(프로세스를 create하는 작업은 필요이상의 부담을 주게 된다) 시스템 부하가 커지게되 안정적인 서비스가 힘들다.
- 멀티 스레드 방식
multithread ==> 클라이언트의 요청을 받으면 웹 애플리케이션을 거치지 않고 웹 컨테이너로 요청이 전달된다. 그리고 웹 컨테이너가 요청을 처리할 스레드를 생성하는 형태이다. 멀티스레드 방식은 최초 요청 시 웹 애플리케이션을 실행한 후 종료하지 않은 상태에서 같은 요청이 여러 번 오는 경우, 실행되고 있는 웹 애플리케이션의 스레드를 생성해 요청을 처리하는 방법이다. CGI에서 사용하는 멀티프로세스 방식보다 시스템 부하를 줄여 안정적인 서비스를 제공할 수 있다.
>>> 서블릿의 종류
- Generic 서블릿 : GenericServlet(javax.servlet.GenericServlet)을 상속받아 구현 한다.
genericServlet==> 프로토콜 독립적인 서블릿으로 service()를 오버라이딩해 사용한다.
- HTTP 서블릿 : HttpServlet(javax.servlet.http Servlet)을 상속받아 구현 한다.
HttpServlet은 GenericServlet을 상속받아 HTTP 프로토콜에 관련된 기능을 구현한 것이다.
httpServlet==> GenericServlet을 상속받아 사용하는 것보다 편리하며 클라이언트 요청에 따라 doGet, doPost, doPut 등의 메소드를 호출한다.

[JSP & Servlet 배경지식] 2. WS & WAS / Container 2014-09-19

1. Web Server & Web Application Server

> 동적웹페이지를 서비스 하기 위해서는  WAS(웹 어플리케이션 서버)가 필요하다. 하지만 정의하는 기준에 따라 다르게 어떤건 WAS가 아니라고 하는 경우가 있지만 이는 해석하는 기준의 차이므로 무의미한 논쟁일 뿐이다. 일반적인 정의에 대하여 정리해 보자

>>> 웹 서버 (Web Server)
ex) Apache, Nginx, IIS, WebtoB 등
- 클라이언트의 요청을 받아 정적인페이지(웹페이지, 이미지)를 HTTP 프로토콜을 통해 전송한다.
- 클라이언트의 요청 중 자체적으로 처리할 수 없는 정보에 대해서는 WAS에 처리를 요청한다.
- 요청이 많을 경우 웹서버에서는 웹문서를 WAS에서는 JSP페이지를 양분하여 처리 함으로서 서버
의 부담을 줄여주는 역할도 한다.
>>> 웹 어플리케이션 서버 (Web Application Server)
ex) Tomcat, WebLogic, WebSphere, Jeus, JBoss 등
- 웹서버에서 처리할 수 없는 동적인 정보를 처리하여 웹서버에 정적인 정보를 제공한다.
- 일반적으로 웹서버의 기능을 내제하고 있어 웹 서버 없이도 서비스가 가능하다.
- PHP의 경우 WAS의 역할을 하지만 웹서버의 모듈형태로 작동하므로 WAS라 불리는데 이견이 많다.
- WAS의 내부 구조

was의 내부동작

>>>>>> description
– WAS의 내부구조
① 웹서버로 부터 요청이 들어오면 제일먼저 컨테이너가 이를 알맞게 처리한다.
② 컨테이너는 배포서술자(web.xml)를 참조하여 해당 서블릿에 대한 스레드를 생성하고 요청(httpServletRequest) 및 응답(httpServeletResponse) 객체를 생성하여 전달한다.
③ 다음으로 컨테이너는 서블릿을 호출(service())한다.
④ 호출된 서블릿의 작업을 담당하게 된 스레드(미리 생성된 스레드)는 요청에 따라 doPost() 또는 doGet()을 호출한다.
⑤ 호출된 doPost() 또는 doGet() 메소드는 생성된 동적페이지를 Response객체에 실어서 컨테이너에 전달한다.
⑥ 컨테이너는 전달받은 Response객체를 HTTPResponse형태로 전환하여 웹서버에 전달하고 생성되었던 스레드를 종료하고 요청(httpServletRequest) 및 응답(httpServeletResponse) 객체를 소멸시킨다.

2. Container

WAS별로 다양한 종류의 컨테이너를 내장하고 있으며 이들중 서블릿에 관련된 기능을 모아놓은 것을 서블릿 컨테이너라 부른다. 이외에도 여러 종류의 컨테이너가 있으며(Servlet 컨테이너, JSP 컨테이너, EJB 컨테이너 등)  다양한 컴포넌트 들을 내장하고 있다.

>>> 서블릿 컨테이너 (Servlet Container)
서블릿 컨테이너는 [그림:WAS의 내부 구조]에서와 같이 servlet를 실행하고 관리하는 역할을 하는데 개발자가 신경써야 할 복잡한 부분을 대신 처리하여 주기 때문에 편리하다. 한가지 예로 자바애플리케이션 개발시 필요한 main()메소드가 존재하지 않는 것이 이때문이다. 다음은 서블릿 컨테이너의 주된 역할이다.
- 생명 주기 관리 : 서블릿을 로드해 초기화(init 메소드) 한다. 또 클라이언트의 요청으로 서블릿 메소드를 호출하며, 서블릿 컨테이너가 종료되면 서블릿을 종료시키고(destroy 메소드 호출) 메모리를 정리한다.
- 통신 지원 : 웹서버로부터 받은 요청을 분석해 서블릿을 실행시키고 서블릿에서는 웹서버의 정보를 확인할 수 있도록 하는 기능을 제공한다.
- 멀티스레딩 지원 : 클라이언트의 요청에 따라 서블릿을 생성하고, 이미 생성된 서블릿에 대한 요청은 스레드를 생성해 실행한다.
>>> 컴포넌트 (Component)
- 특정 기능이나 관련된 기능이 재사용 가능한 형태로 만들어진 프로그램 빌딩 블록으로 소프트웨어 개발을 레고 블록 쌓듯이 진행할 수 있도록 하는 기술을 말한다.