[열혈강의 : 자바 웹 개발 워크북] 을 보고 요약 및 공부한 내용을 적는 글임을 알립니다.
Chapter 03. 서블릿 프로그래밍 (2)
원래는 하나의 글로 되어있지만 내용이 긴 관계로 끊어서 두 번째 글을 진행합니다.
서블릿 프로그래밍에 대한 기본적인 개념은 (1)을 보셔야 함을 안내드리며
2016/02/11 - [PROGRAM/JAVA / JSP] - [자바 웹 개발 워크북] 서블릿 프로그래밍 (1)
해당 포스팅에서는 서블릿 구동방법과 web.xml 파일에 설정하는 방법을 소개합니다.
1) 서블릿 배치 정보 web.xml 작성
앞선 글에서 배치 설명서 파일이라고 언급했던 web.xml 파일에 대해서 우선적으로 설명하겠다.
배치 기술서라고도 하며 Deployment Descriptor, DD 파일이라고도 불린다.
웹 애플리케이션의 배치 정보를 담고 있으며, 웹 애플리케이션에서 실행되어야 할 서블릿 정보를 담게 된다.
기본적인 web.xml 파일의 구조와 테스트 servlet 파일 설정 내역을 아래와 같이 기술해보겠다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 웹 애플리케이션 명이 display-name으로 지정된다. -->
<display-name>ServletProject</display-name>
<!-- 서블릿 선언 -->
<servlet>
<servlet-name>HelloOjava</servlet-name>
<servlet-class>ojava.webprogram.servlet.OjavaHello</servlet-class>
</servlet>
<!-- 서블릿을 URL과 연결 -->
<servlet-mapping>
<servlet-name>HelloOjava</servlet-name>
<url-pattern>/Ojava</url-pattern>
</servlet-mapping>
<!-- 해당 웹 애플리케이션의 기본 호출 페이지로, 하단에 지정된 welcome-file 순으로 불러들인다. -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
굵게 표시한 서블릿 선언영역과 주석처리한 내용을 제외하고는 기본적으로 프로젝트 생성 시,
자동으로 web.xml을 만들도록 설정하는 경우 작성되어지는 내용이다.
위의 서블릿 선언내역은 임의로 지정한 내용이나, 향후에 사용하고자 하는 서블릿이 있는 경우
web.xml 파일에 해당 내용을 선언해주어야 서블릿 컨테이너가 해당 서블릿을 찾을 수 있기 때문에
클래스명이 틀리지 않게 잘 등록해주어야 한다.
태그를 하나씩 살펴보면
<!-- 서블릿 선언 -->
<servlet>
<servlet-name>HelloOjava</servlet-name>
<servlet-class>ojava.webprogram.servlet.OjavaHello</servlet-class>
</servlet>
서블릿 선언부에는 사용하고자 하는 서블릿 클래스를 지정해주고, 이를 명명할 이름을 지어준다.
위에 명시한 것 처럼 서블릿 이름은 실제 클래스의 이름과 같을 필요는 없다.
다만 servlet-class를 작성할 때, 클래스명이나 패키지명이 틀리면 찾지 못하므로 정확하게 적어야 한다.
패키지명과 클래스명을 한 번에 알아내는 방법은
Project Explorer에서 원하는 java 파일을 오른쪽 클릭하면 Copy Qualified Name 이라는 메뉴가 있다.
해당 메뉴를 클릭하면 Fully Qualified Name을 복사할 수 있다. (대신 / 를 . 으로 바꾸는 수고가 필요하다)
<!-- 서블릿을 URL과 연결 -->
<servlet-mapping>
<servlet-name>HelloOjava</servlet-name>
<url-pattern>/Ojava</url-pattern> <!-- 웹 애플리케이션 루트 뒷 부분에 붙는 URL -->
</servlet-mapping>
위에서 선언한 서블릿 이름을 실제 URL과 맵핑하기 위한 작업이 필요하다.
웹 브라우저 URL 입력창에서 서블릿을 호출하기 위해서 필요한 작업으로
서블릿 이름과 URL Pattern을 연결지어주면 호출하기 위한 사전 작업이 종료된다.
이를 통해서 HelloOjava 라는 이름으로 명명한 서블릿 파일은 URL Pattrun에 따라 다음과 같이 호출된다.
http://localhost:8080/ServletProject/Ojava
------------------- ------------ ---------------------> URL 패턴으로 지정한 서블릿
서버정보:포트정보 웹 애플리케이션 이름 (Context Root)
위의 URL을 입력했을 때 ojava.webprogram.servlet.OjavaHello 서블릿 클래스 파일을 호출하게 된다.
이렇게 하나 하나 서블릿을 모두 지정해야 하는 경우에
수 많은 서블릿 설정을 진행해야 하는 것인가 싶어서 막막하게 생각할 수 있지만
향후에 프레임워크를 도입하면 좀 더 간략하게 맵핑할 수 있는 방법이 있다.
일단은 이런 원리로 맵핑이 된다는 개념만 알고가면 될 듯 하다.
2) 서블릿의 구동 절차
위에서 web.xml 파일에 서블릿을 선언해주고 URL을 입력해서 서블릿을 호출하는 과정을 설명하면
1. 우선적으로 웹 브라우저에 URL을 입력함으로써 서블릿 컨테이너로 요청을 보내게 되고
2. 서블릿 컨테이너는 기존에 생성된 서블릿 인스턴스가 없다면, web.xml 정보를 이용해 서블릿 클래스를 로드한다.
3. 인스턴스를 생성하고
4. 생성자를 호출하며
5. 서블릿 초기화 함수인 init() 함수를 호출하고
6. 클라이언트의 요청을 처리를 위해 구현한 service() 함수를 호출하여 기능을 수행하며
7. 서블릿 결과값에 대해서 서블릿 컨테이너가 브라우저로 결과값을 응답한다.
8. 서블릿 컨테이너 종료 또는 웹 애플리케이션이 종료되면,
9. 서블릿 컨테이너는 destroy() 함수를 통해 인스턴스를 해제시킨다.
인스턴스 생성여부를 확인하는 건, 서블릿 인스턴스는 하나만 생성되어 웹 애플리케이션이 종료될 때까지 이를 사용하기 때문이다.
서블릿 호출 시 기존의 인스턴스가 있는 것으로 확인되면 이를 그대로 사용하게 되며
이 때 초기화 함수인 init 은 호출되지 않는다. 해당 서블릿 인스턴스가 해제되는 건 8번째 단계에만 해당된다.
3) 웹 애플리케이션 배치
여기서 말하는 배치란 batch가 아닌 deploy를 의미하는 것으로, 서버에 구동시키는 것을 말한다.
java 개발 시 보편적으로 사용되는 IDE인 eclipse 에서는 Server를 통해 간단하게 배치할 수 있는 기능을 제공한다.
Servers View 가 기본적으로 켜져있겠지만, 서버 설정이 되어있지 않거나 창을 닫았다면
상단 도구에서 Window -> Show View -> Servers 를 선택하자.
Tomcat 서버 또는 기타 사용하고자 하는 서버를 선택하여 등록하고,
해당 서버에서 웹 애플리케이션을 배치하는 방법은 크게 두 방법이 있다.
1. 등록된 서버를 선택 > 마우스 오른쪽 버튼 을 눌러서 '컨텍스트 메뉴'를 열고 > 'Add and Remove...' 선택
Workspace에 구현된 웹 애플리케이션 목록이 나오고, 이 중 배치하고자 하는 웹 애플리케이션을 Add 하면 된다.
2. 등록된 서버를 선택 > 더블클릭 > 해당 서버의 Overview로 접속
하단에 위치한 Tabs에서 Modules를 선택하면 서버에서 구동 중인 Web Module 정보를 확인할 수 있다.
Add Web Module 버튼을 클릭하여 구동할 웹 애플리케이션을 선택한다.
※ Server Overview에는 해당 서버의 다양한 정보가 있으니 잘 알아두면 좋다. (해당 내용을 설명할 기회도 있을..지도)
※ Web Module로 등록할 때 지정하는 Path가 웹 애플리케이션 루트 Path로 사용된다.
기본적으로 웹 애플리케이션 이름이 지정되지만, '/' 로 지정하게 되면 바로 URL Pattern을 서버 정보 뒤에 덧붙이면 된다.
ex) http://localhost:8080/ServletProject/Ojava -> http://localhost:8080/Ojava 서버정보 뒤에 바로 이어서 입력!
웹 애플리케이션이 배치될 때 사용되는 것은, 앞에서 웹 애플리케이션 정의할 때 지정한
Content Directory 폴더이다. 지난 설명에도 썼지만 해당 폴더를 복사해서 배치하게 된다.
우리는 기본값을 이용해서 생성했기 때문에 Content Directory는 WebContent라는 이름으로 생성되었다.
왼쪽의 프로젝트 구성도 중 WebContent 폴더를 복사하여
구동할 서버 내부에 두게되고, 해당 웹 애플리케이션을 구동하기 위한
파일 디렉토리를 구성하게 된다.
이 곳에 해당되는 파일들은 html, js, css, jsp, image 파일 등이다.
그렇다면 java 확장자로 생성된 서블릿 파일은?
서블릿 파일 자체를 서버에 올리지는 않지만 이를 컴파일 한 class 파일을
서버에 올려서 이를 통해 서블릿을 구동시킨다.
컴파일 된 class 파일은 output folder로 정의한 build\classes 폴더에 모여있고
이 폴더는 서버 배치 폴더로 들어갈 때, WEB-INF\classes 라는 이름으로 존재하게 된다.
(classes 라는 폴더 이름도 사용자가 프로젝트 설정에서 지정/변경이 가능하다.)
4) war 파일을 통한 웹 애플리케이션 배치
지금까지 알아본 방법은 eclipse에서 제공하는 방식의 서버 배치 방법이었고
실제로 테스트서버나 운영서버에 배포하기 위해서 이와 같은 방식을 차용할 수는 없으므로
war (Web Archive) 파일로 내보내는 방법과 war 파일을 통한 배치 방식을 소개한다.
우선 배치 대상이 되는 웹 애플리케이션을 war 파일로 만들어보자.
1. war 파일로 내보내기를 원하는 프로젝트의
컨텍스트 메뉴로 접근하여 (우클릭을 통한 메뉴 열기)
Export 를 클릭하면 내보낼 수 있는 여러 방법이 나온다.
그 중 Web > WAR File 을 클릭한다.
2. WAR 파일로 내보내기 위한 설정 작업
Web Project 부분에서는 현재 Workspace에서 내보내고자 하는 프로젝트를 설정할 수 있다. Destination은 WAR 파일을 내보낼 위치를 지정하는 곳이며
하단의 옵션값은 각각 다음과 같다.
Optimize for a specific server runtime
-> 특정 서버 런타임 방식에 최적화 시킨다
Export source files
-> java source 파일까지 내보낼 것인지 설정 (일반적으로는 class만 내보냄)
Overwrite exisiting file
-> 저장될 폴더에 같은 파일이 있다면 덮어쓸 것인지 설정
3. 이렇게 만든 war 파일을 직접 서버에 올리는 것으로 가정하고
로컬 PC에 깔려있는 tomcat 경로에 접근하여, webapp 폴더에 war 파일을 이동시킨다.
tomcat 경로의 webapp 폴더는 웹 애플리케이션을 배치하는 폴더이다.
지금까지는 eclipse에서 서버를 구동시키고 중단시켰지만,
tomcat 경로의 bin 폴더에 들어가서 직접 구동시키고 중단시킬 수 있는 방법이 있다.
4. tomcat 경로 하위의 bin 폴더에서
startup.bat 파일을 실행시키면 서버가 구동된다
(startup.sh 파일은 유닉스용 shell 파일이다.)
서버를 중단시키고 싶은 경우, shutdown.bar를 실행시키면 구동 된 서버를 중단 시킬 수 있다. 이 역시도 sh 확장자는 유닉스용이다.
tomcat 서버를 구동시키면 왼쪽과 같이 webapps 폴더 내에
war 파일로 만들었던 ServletProject라는 폴더가 생긴 것을 확인할 수 있다.
서버가 구동될 때 war 파일을 풀어서 웹 애플리케이션을 실행할 수 있도록 자동으로 배치된다.
5) Servlet, GenericServlet 그리고 @WebServlet Annotation
서블릿을 생성하기 위해서 Servlet 인터페이스를 구현해왔는데
그러다보니 init(), destroy() 등 기본적으로 구현해주어야 하는 모든 함수들을 구현하였다.
구현할 내용 자체가 없더라도 빈 함수로라도 구현해야 했는데
이런 불편함을 덜고 서블릿 구현의 간소화를 위해서 추상클래스인 GenericServlet를 사용한다.
GenericServlet 추상클래스는 Servlet 인터페이스를 구현하고 이를 상속해 줄 수 있다.
이를 상속받으면 실제 서블릿의 내용을 다루는 service() 함수만 구현해주면 되므로 무척이나 간편해진다.
책에서는 ServletRequest, ServletResponse 주요 함수에 대해 정리해두었는데
Request, Response 주요 함수는 별도로 정리하기로 한다.
또한 인코딩 속성과 관련된 내용도 별도 포스팅으로 따로 묶어서 한 번에 정리하...려고 한다.
실제 구현에 대한 내용은 생략하며 인터페이스, 추상클래스, 상속 등에 대한 개념은
해당 내용을 중점적으로 다루는 다른 포스팅을 통해서 공부하시기를 추천한다.
@WebServlet Annotation 이란, 서블릿을 선언해주는 설정값을 간소화시켜줄 수 있는 정의요소로
Servlet 3.0 사양부터 사용 가능한 내용이다.
해당 포스팅의 맨 윗부분에서 설명했던 web.xml 파일 내의 서블릿 설정을 대체할 수 있는 내용으로
HelloWorld라는 이름으로 지정했던 서블릿 파일과 URL Pattern을 맵핑하는 방법은 다음과 같이 변경될 수 있다.
@WebServlet("/Ojava")
public class OjavaHello extends GenericServlet {
.
.
}
클래스 윗부분에 선언한 어노테이션 한 줄로, Servlet 선언과 URL 맵핑작업을 대체할 수 있다.
이와 관련하여 WebServlet 어노테이션에 사용할 수 있는 주요 속성을 정리하며 마무리한다.
속성명 |
설명 |
예시 |
name |
서블릿 이름을 설정하는 속성. 기본값은 빈 문자열 ("") |
@WebServlet(name=서블릿 이름) |
urlPatterns |
서블릿의 URL 목록을 설정 |
@WebServlet(urlPatterns="/Ojava") @WebServlet(urlPatterns={"/Ojava", "ojava.do", "ojavalist.action"}) |
value | urlPattern과 같은 용도이지만, 단독 사용 시 속성명 생략 가능. | @WebServlet("/Ojava") |
짬짬이 시간 나는대로 정리하다 보니 꽤 오래걸렸다.
아주 당연하게 설정하고는 했던 프로젝트 기본 설정들이 여러 부분에서 사용되는 점을
다시 한 번 확인하고 나니 설정값들이 어떻게 쓰여지는 지에 대해 많이 알 수록 좋겠다는 생각이 든다.
해당 챕터 내용에 대해 잘 알아두면 기본적인 내용은 이제 마무리 했다고 할 수 있다.
이제 다음으로 이어질 내용은 드디어 데이터 연동을 할 수 있도록 'JDBC'에 대해 이야기한다.
'PROGRAM > JAVA / JSP' 카테고리의 다른 글
Google Chart API 이용하여 QR코드 생성하기 (0) | 2017.06.12 |
---|---|
KISA 권고 암/복호화 방식 : SEED 128, SEED 256 (0) | 2017.05.15 |
[자바 웹 개발 워크북] 서블릿 프로그래밍 (1) (0) | 2016.02.11 |
[자바 웹 개발 워크북] 웹 프로그래밍 기초 (0) | 2016.02.04 |
[자바 웹 개발 워크북] 웹 애플리케이션 환경의 실행과 개발 (0) | 2016.02.03 |