본문 바로가기
events/부스트코스

[부스트코스] 1. 웹 프로그래밍 기초 | 5. Servlet - BE

by kimtahen 2020. 2. 21.
반응형

1) Servlet 이란?

  자바 웹 어플리케이션 (Java Web Application) 은 WAS(Web Application Server ex) Apache Tomcat)에 설치되어 동작하는 어플리케이션 을 의미한다. 여기서 'Servlet'은 이 자바 웹 어플리케이션에 포함된, 자바로 작성된 클래스 중 하나이다. 자바 웹 어플리케이션은 Servlet 뿐만 아니라, 다른 여러가지 리소스(HTML, CSS, ...)들을 포함한다. 그렇다면, Servlet은 자바 웹 어플리케이션에서 어떠한 역할을 하는 것일까?

   Servlet'동적인 처리를 하는 프로그램의 역할'을 한다. 부스트코스 강의에서는 아래와 같이 Servlet을 정의한다.

- Servlet은 Was에서 동작하는 Java class
- Servlet은 HttpServlet Class를 상속받아야 한다.
- Servlet과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두가지(JSP, Servlet)을 조화롭게 사용해야한다.

 

2) Servlet 작성 방법

  Servlet 작성방법은 2가지로 나누어진다.

 

1. Servlet 3.0 spec 이상 : web.xml파일을 사용하지 않고, 자바 annotation을 사용한다. annotation은 이전 포스팅에서 사용했던 방식인데,

@WebServlet("/HelloWorld")

 

바로 이렇게 작성하는 방식을 말한다.

 

2. Servlet 3.0 spec 이하 : web.xml파일에 직접 등록해야한다.

 

 

Dynamic Web Project를 하나 생성해보자. Eclipse에서 File - New - Dynamic Web Project 순으로 클릭한다. 그러면 익숙한 창이 하나 뜬다.

노란 색으로 표시해둔 부분을 보자. 

Target runtime 은 이 웹 어플리케이션이 WAS상에서 동작하므로, 설치된 Apache Tomcat을 가리킨다. 그리고

Dynamic web module version 이 바로 Servlet spec을 의미한다.

이제 Next를 누르면

이 화면이 나오는데, 다른거 없이 소스파일과 컴파일된 소스파일이 저장될 디렉터리를 선택하는 단계이다. 

Next를 누르면 이제는

이런 화면이 나온다. Context root가 바로, 

http://localhost:8080/{Context root}/.... 

이 위치의 URL을 의미한다. 여기까지 완료되면 이제 Finish를 클릭한다.

 

1. Servlet 3.0 spec 이상에서 Servlet 작성법

이제 Servlet을 생성한다. Servlet은 좌측 Project Explorer에서 방금 생성한 프로젝트의 아이콘을 우클릭하면 나오는 메뉴에서, New - Servlet 순으로 클릭하면 생성할 수 있다.

여기서 패키지 이름과 클래스 이름을 작성하고 Next를 클릭한다.

그럼 이러한 창이 뜨는데, 여기서 URL mappings 가 바로, Servlet에 요청하는 URL을 설정하는 부분이다. 

http://localhost:8080/{Context root}/{Servlet}

URL 중 주황색 부분을 의미한다.

URL mappings 의 /TenServlet 을 클릭하고 edit을 누르면 수정이 가능하다. 또한 추가도 가능하다. onetoten 으로 바꾼 후 Next를 클릭한다.

아직까지는 doGet 매서드만 필요하기 때문에 doGet매서드만 체크해주고 나머지는 체크해제를 해준다. 이제 Finish를 클릭하면 Servlet 생성이 완료된다.

 

이렇게 TenServlet.java 파일이 생성된다. 눈여겨 보아야 할 부분은 annotation 이 아까 편집했던 URL로 설정된다는 것이다.

@WebServlet("/onetoten")

 

"Servlet은 동적인 처리" 를 한다고 위에서 언급했었다. 이 말은 즉, Servlet에서 설정해놓은 URL로 요청이 들어오면, Servlet이 실행되면서 동적으로 코드를 만들어 응답을 보낸다는 것을 의미한다.

 

Servlet의 코드를 직접 작성해보자. HTTP get메서드로 요청이 들어왔을때 실행되는 메서드가 바로 doGet 메서드이다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
}

이 메서드는 파라미터로 request, response 객체를 받는다. HTTP는 요청과 응답으로 구성되는데, 이 요청과 관련된 부분이 바로 request이고, 응답과 관련된 부분은 response이다. 그러므로, 응답으로 HTML을 주고 싶다면 response 객체를 수정하고 추가하면 된다.

 

HTML로 응답하는 Servlet을 만들기 위해서는 일단 response객체의 setContentType 메서드로 타입을 설정해주어야 한다.

response.setContentType("text/html; charset=utf-8");

html을 전달하고 utf-8로 인코딩 할 것이므로, 이런식으로 작성해주면 된다. charset은 문자 인코딩 방식을 설정해주기 위한 것이다.

다음으로 클라이언트로 보낼 출력스트림을 생성해보자.

PrintWriter out = response.getWriter();
out.println("1부터 10까지 출력");
for(int i = 0; i<10; i++) {
	out.println(i);
}
out.close();

response 객체의 getWrite() 메서드는 PrintWriter 객체를 반환한다. 이 객체를 사용하여 텍스트를 전송할 수 있다. 반환한 PrintWriter 객체를 사용하기 위해서는 import 해주어야한다.

상단에 아래와 같은 코드를 추가시켜준다.

import java.io.PrintWriter;

이제 out을 출력스트림으로 사용할 수 있다. 그리고 마지막에서는 out.close()를 실행해주므로써, 객체를 해제 시킨다.

 

서버를 실행시킨다. 서버 실행은 좌측 Project Explorer 에서 project 아이콘을 우클릭하여 Run As - Run On Server - Finish 순으로 클릭한다.

그러면 위와 같이 404 Error을 만날 수 있다. 당연하다. 왜냐하면 방금 작성한 Servlet 은 http://localhost:8080/example/onetoten URL에서 실행되기 때문이다 따라서 상단의 주소에 onetoten을 덧붙여준다.

그러면 브라우저에서 정상적으로 출력되는 것을 확인할 수 있다.

 

만약 for문이 무한루프로 돌면 어떤일이 발생할까? out.close(); 코드를 삭제해주고 for문을 무한루프를 돌며 0부터 계속 출력하도록 설정해준다.

서버를 실행해보니 eclipse에 심한 부하가 걸리면서 프로그램이 멈춘다.

크롬 브라우저로 접속해보니 프로그램이 다운되지는 않는다. 

 

2. Servlet 3.0 spec 미만에서 Servlet 작성법

다시 프로젝트를 위에서 했던 방식대로 생성해보자. 대신 이번에는 프로젝트 생성시 Dynamic web module version  을 2.5로 설정해 준 뒤 프로젝트를 생성해보자.

이번에는 

Servlet spec 3.0 미만이기 때문에 web.xml파일이 생성되었음을 확인할 수 있다.

 

다음으로 아까 했던 방식과 같은 방식으로 Servlet을 하나 생성해보자. 그리고선 다시 web.xml 파일을 확인해보면

<?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>example25</display-name>
  <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>
  <servlet>
    <description></description>
    <display-name>TenServlet</display-name>
    <servlet-name>TenServlet</servlet-name>
    <servlet-class>exam.TenServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TenServlet</servlet-name>
    <url-pattern>/onetoten</url-pattern>
  </servlet-mapping>
</web-app>

<servlet></servlet> 이 부분이 추가된 것을 확인할 수 있다. web.xml에 따라 서버는 /onetoten 으로 url이 입력되면, servlet-name에서 TenServlet을 찾아서 exam.TenServlet 을 실행시킨다. exam은 아까 생성했던 package name이다. servlet spec 3.0 이상에서는 annotation 이 이러한 일련의 과정을 자동으로 처리해준다. 

 

아까 사용했던 코드를 그대로 붙여넣어주고 서버를 실행시켜보면 아래와 같이 정상적으로 출력이 된다.

반응형

댓글