본문 바로가기
JAVA_Servlet

초보의 Servlet 개발 web.xml

by old Developer 2020. 11. 17.

JSP로 CRUD를 만들어 보면서 개발의 맛은 봤겠다. 이것들을 Servlet으로 바꿔보자.

 

1. 새로운 프로젝트 생성

 

JSP 개발 때 사용했던 프로젝트는 그냥 두고 신규 프로젝트를 생성해서 하나씩 짚어나가자.

web.xml 작업을 해야 하니 Dynamic Web Project 생성 시 web module은 2.5 버전으로 설정하고 프로젝트 이름은 적당히 주고 생성된 프로젝트의 web.xml을 열자.

 

web module 2.5 버전으로 생성확인

 

프로젝트는 만들었으니 이제 기본적인 것부터 하나씩 붙여보자.

 

2. web.xml

 

web.xml을 배포 서술자고 DD고 뭐 Deploy De... 라는등 어려운 말 많지만 쉽게 접근하자 Tomcat Server 시작할 때 설정값 읽어다가 그 설정대로 서버 올려줌 게임할 때 옵션 설정하는 거랑 같은 거임 파일이나 한 번 열어보자. 내용이 텅텅 비어있고 태그 몇 개가 전부인데 그 몇개 안되는 태그지만 그래도 살펴보면

 

- <? xml...> 누가 봐도 버전과 캐릭터 셋 설정인 듯

- <web-app...> 태그는 xml 스키마니깐 요놈이 어떤 xml인지를 설명하는 것이라 생각하면 편하겠고 바꿀 일 없으니깐 그냥 그런가 보다 하고 넘어가자 

- <display...> 배포하면 Tomcat 관리자로 접속 시 요기에 적어둔 이름으로 표기하고 상태도 보여주고 뭐 그렇다.

- <welcome... list> 여기에 있는 파일 목록이 서버 접속 시 첫화면으로 오픈해줄 파일 목록이다. 하위 태그로 <welcome-file>을 넣고 파일의 확장자를 포함한 경로와 파일명을 입력한다.

 

위 내용을 보면 <web-app> 정보는 web module 2.5 기준으로 작성될 배포명 olDevServlet web module이고 서버 접근하면 환영해주는 파일들로 index.xxx 들과 defaulf.xxx 파일들이 있음 하나만 짚고 넘어가자면 index.html이 없으면. htm을. jsp를 순차적으로 찾게 되고 아무런 파일을 생성하지 않으면 표현할 게 없어서 404 not found를 보여준다.

 

이제 index.jsp를 어떻게 찾는가는 이해가 됐을 것이다. 만약 welcome 파일에 olDevServletMain.jsp를 만들고 작성한다면 열어줄 것인가? 당연히 열어준다. index 파일에서 forward 해줘도 forwad 대상의 경로만 정확하다면 찾아준다. 이것을 조금 쉽게 이해자면 web server의 java main method라 생각하면 쉽겠다. java 실행하려면 반드시 하나의 main method가 있어야 하지 않은가? 그렇다고 보면 되겠다.

 

몇 개 있지도 않은 내용 가지고 주저리주저리 말이 많았는데 web.xml에는 많은 태그와 그 태그의 설정을 사용할 수 있도록 지원한다. 그 많은 태그를 한 번에 다 서술할수는 없고 그래서 그냥 JSP 개발에 이어서 Servlet을 개발해볼 거니깐 Servlet mapping만 짚고 넘어가자.

 

3. Servlet mapping

 

일전에 JSP가 컴파일이 되어. class파일로 대기하다가. jsp가 트리거가 되어 browser에 html롤 응답한다고 이야기한 적이 있는데 이 컴파일이 되는. jsp가 HttpServlet을 상속하여 컴파일이 이루어지므로 request 객체를 내장 객체로 사용할 수 있다고도 했었다. 근데 이 HttpServlet 직접 상속하여 요청과 응답을 처리하는 작업을 시작해볼 것인데 이는. jsp로 만들어지지 않고. java로 만들어지므로 Tomcat은 이런 놈 있는지도 모르고. jsp가 아니므로 트리거도 없다. 이런 애들을 searchMberList 내놔하면 예예 여기있습니다. 하고 찾을수 있도록 등록하는게 Servlet mapping이라 생각하면 될 것 같다.

 

자 그럼 java 파일을 만들고 Servlet 매핑도 하고 쓸데없이 많은 welcome 파일도 좀 정리하자.

 

소스코드 :

package com;

import javax.servlet.http.HttpServlet;

public class OlDevSampleServlet extends HttpServlet {

	private static final long serialVersionUID = 3161530544990290786L;

}

 

java 파일을 하나 생성했는데 메서드 어떤 것도 생성하지 않고 class에서 HttpServlet 객체만 상속했다.

serial.. UID는 저 HttpServlet을 까고 보면 조상님께서 Serializable이시다. 반드시 있어야 하는것은 아니지만 eclipse에서 노란딱지 띄우니깐 만들어주자.  (Serializable.... 나중에 살펴보자.... 쩝)

 

뭐 그냥 그렇다는 거고 src 밑으로 바로 만들기는 뭐하니깐 com이라는 package를 하나 생성해줬다.

 

src

  -- com

     -- OlDevSampleServlet.java

 

위와 같은 구조로 만들었는데 전체경로에서 src는 생략된다. 어차피 무조건 거기에 만들어야는데 매번 쓸 필요 없잖은가? 그래서 경로를 적게되면 com부터 적으면된다.

 

참고로 모를 리 없겠지만 package는 파일을 효율적으로 관리하기 위한 것이니깐 몇 동 몇 호에 뭘 관리할지는 알아서 하면 되시겠다.

 

소스코드 :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://java.sun.com/xml/ns/javaee"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		 id="WebApp_ID"
		 version="2.5">
		 
	<display-name>olDevServlet</display-name>
  
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
  
	<servlet>
		<servlet-name>sampleServlet</servlet-name>
		<servlet-class>com.OlDevSampleServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>sampleServlet</servlet-name>
		<url-pattern>/sampleServlet.do</url-pattern>
	</servlet-mapping>
  
</web-app>

 

딸랑 하나 만든 java파일을 소스 코드와 같이 servelt, servelt-mapping 설정해주었다. 태그의 하위 태그로 딸랑 2개 있는데 <servlet-mapping> 태그는 저게 끝이고 <servlet> 태그는 하위 태그가 더 있다 필요하면 차차 사용해보기로 하고 소스코드나 살펴보자.

 

- <servlet> 태그

자식 태그로 <servlet-class> 태그가 있는데 HttpServlet 상속받은 java class의 위치를 알려주는 태그이다. src는 생략된다고 하지 않았던가? 그래서 com.xxx 파일을 확장자 생략하고 기입한다. 어차피 다 java니깐... 그럼 <servlet-name> 태그는 뭐겠는가? web.xml 파일에서 참조할 때 사용하라고 지정하는 이름이다. java에서 사용한다던가 하는 것이 아니고 어디까지나 web.xml 내에서 사용하는 것이다.

 

- <servlet-mapping> 태그

자식 태그로 <servlet-name> 태그가 있는데 이는 본인이 참조 대상이 아닌 <servlet> 태그의 <servlet-name> 을 넣어주어야 한다. <servlet> 태그로 HttpServlet을 상속한 java servlet을 선언해두지 않았던가? 그 녀석 찾으려면?  <servlet> 태그의 <servlet-name>이 참조라 했으니 이 <servlet-mapping> 태그가 참조할 HttpServlet은 OlDevSampleServlet.java 요놈이야 하고 알려주어야 한다는 거다. 그래서 <servlet>의 자식 태그인 <servlet-name>에 작성한 sampleServlet을 <servlet-mapping> 태그의 자식인 <servlet-name>에 동일하게 작성해야 한다.

<url-pattern> 태그는 jsp 만들면서 /userRegistView.jsp 와 같은 url을 입력하고 화면 이동하지 않았는가? 맞다 그 url이다 sampleServlet.do라고 설정 해두었으니 우린 OlDevSampleServlet.java에 접근하려고 한다면 /sampleServlet.do를 주소창 입력 또는 submit 해야 한다.

 

이것을 쉽게 풀어 보면 /sampleServlet.do url이 들어오면 sampleServlet을 찾아줘 그 sampleServlet은 com.OlDevSampleServlet.java야 정도 되시겠다.

 

그럼 여기까지 해놓고 Tomcat을 시작하고 localhost:8080/sampleServlet.do를 입력해보자.

 

에러난다...

 

실행시키면 405 에러가 발생한다. 오류가 나는 것은 당연한 것인데 앞서 설명 하대로 HttpServlet을 상속하면 요청과 응답을 처리해주어야 한다. 즉 요청을 받아주질 않아 어? 나 갈데없는데? 힝~ 했다고 보면 되시겠다.

 

web.xml에 servlet과 servlet-mapping은 설정했으니 요청받게끔 java를 수정해보자.

 

4. url-pattern 처리

 

url-pattern 처리라는게 http로부터 /smapleServlet.do라는 url로 Request가 들어온다고 생각하면 되는데 이 요청을 OlDevSampleServlet.java 파일에서 부모인 HttpServlet의 doGet method를 overriding해서 /sampleServlet.do url의 요청을 받고 응답으로 sample.jsp를 전달해주자.

 

소스코드 :

package com;

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OlDevSampleServlet extends HttpServlet {

	private static final long serialVersionUID = 3161530544990290786L;

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		System.out.println("################ 요기 들어오나?");
		resp.sendRedirect("/sample.jsp");
		
	}
}

 

뭐 거창하게 응답을 받고 sample.jsp로 응답하자고 해봤자 부모 객체의 method overriding 하나 한 게 전부임...

그래서 overriding 한 doGet method를 살펴보면 method agument로 HttpServletRequest와 HttpServletResponse를 받고 있는데 이 Request와 Response는 상속한 HttpServlet이 http로부터 들어오는 Stream을 읽고 파싱 해서 요청 값에 대한 객체인 Request를 응답 값에 대한 객체인 Response로 넘겨주고 있다고 생각하는 게 편하겠고 http의 request, response 즉 요청과 응답은 휘발성으로 요청 1회에 대응하는 응답 1회로 구성되고 반드시 요청, 응답 세트로 움직이며 응답을 발생시키기 전까지 무한하진 않지만 일정 시간 작업을 진행하면 되도록 구성되어 있다. 즉 response로 응답하면 끝나는 거다.

 

소스코드의 내용을 다시 보자면 request로는 아무짓도 하지 않았고 response 객체로 sendRedirect의 agument로 sample.jsp로 응답하고 http의 요청을 마무리 지었다. 요청으로 값을 주거나 한 게 아니므로 그냥 sample.jsp 화면 던져주고 끝낸 것이다. (응답에서 .jsp를 던져주면 이미 컴파일된 xxx_jsp.class는 html로 browser에 전달 될 듯?)

 

response 객체의 method인 sendRedirect는 네가 한 요청을 sample.jsp로 보내줄게 정도로 생각하면 되고 이와 관련된 내용은 차차 보도록 하자. 어디까지나 web.xml의 servlet 설정과 mapping 이므로 다음으로 넘어가자.

 

Webcontent 아래 sample.jsp를 만들자 <body> 태그에 화면이 호출되면 구분이나 되게 sample.jsp! 정도 적어주고 이제 다시 실행시켜보자.

 

sample.jsp 생성 위치

 

sample.jsp화면을 확인하고 Servlet으로 정말 들어오는지 확인용으로 찍어둔 System.out.println("################ 요기 들어오나?"); 내용이 eclipse console창에 찍히는지도 확인하자.

 

smple.jsp 화면과 console을 확인하자.

 

위 이미지와 같이 화면이 열리고 console창에 내용이 확인되면 첫 번째로 등록해본 Servlet이 정상 작동되는 거다.

 

web.xml의 많은 설정중 servlet과 servelt-mapping 다루어 보았는데 JSP로 만들었던 애들을 하나씩 하나씩 바꿔가며 JSP로 만들어진 내용과 servlet으로 변경되는 내용, 그리고 여타 java를 하나씩 짚어보고 web.xml의 설정을 하나 둘 추가해보자.

댓글