Servlet사용하기(2) – 실행,응답과 한글화

지난 시간에서는 Tomcat을 이용하여 이클립스에서 Servlet 를 실행시켰습니다. 이번시간에는 응답과 한글화에 대해서 살펴보겠습니다.

1. 서블릿에서 init(), service()

저번시간에 만들어 놓은 FirstServlet 을 수정하여 살펴보겠습니다.

서블릿에서 init() 메소드와 service() 메소드는 서블릿 생명주기의 중요한 부분을 담당합니다. 이들 메소드의 역할과 작동 방식을 이해하는 것은 서블릿 기반의 웹 애플리케이션 개발에 있어 필수적입니다.

1.1 init() 메소드

  • 역할: init() 메소드는 서블릿의 초기화를 담당합니다. 이 메소드는 서블릿이 처음 생성될 때 단 한 번만 호출되며, 서블릿의 생명주기 동안 초기 설정이나 자원 할당과 같은 작업을 수행합니다.
  • 호출 시점: 웹 컨테이너(예: Tomcat)가 서블릿 인스턴스를 생성한 후, 서블릿을 서비스하기 전에 자동으로 호출됩니다.
  • 특징: 이 메소드는 필요한 초기화 파라미터를 받아서 서블릿의 설정을 구성할 수 있으며, 이러한 파라미터는 웹 애플리케이션의 배포 설명서(예: web.xml) 또는 어노테이션을 통해 제공될 수 있습니다.

1.2 service() 메소드

  • 역할: service() 메소드는 클라이언트의 요청을 처리하고, 그에 대한 응답을 생성하는 데 사용됩니다. 이 메소드는 서블릿이 요청을 받을 때마다 반복적으로 호출됩니다.
  • 호출 시점: 클라이언트로부터 요청이 들어올 때마다 웹 컨테이너에 의해 호출됩니다. 각 요청마다 서블릿은 service() 메소드를 통해 요청을 처리하고 적절한 응답을 반환합니다.
  • 특징: service() 메소드는 HttpServletRequest와 HttpServletResponse 두 객체를 매개변수로 받습니다. 이들 객체를 통해 요청의 세부 정보를 알 수 있으며, 응답을 구성할 수 있습니다.
  • 동작: 기본적으로 service() 메소드는 요청의 HTTP 메소드(GET, POST 등)를 확인하고, 해당하는 doGet(), doPost() 등의 메소드를 호출합니다. 개발자는 이러한 메소드를 오버라이딩하여 특정 HTTP 메소드에 대한 요청을 처리하는 로직을 구현할 수 있습니다.

1.3 코드

Java
package ex01;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet("/first")
public class FirstServlet extends HttpServlet{
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 실행됨!");
		super.init(config);
	}
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service() 실행됨!");
		super.service(arg0, arg1);
	}
}
  • FirstServlet 클래스는 클라이언트로부터 최초의 요청이 있을 때 init() 메소드가 실행되고, 이후의 요청에 대해서는 service() 메소드가 실행됩니다.
  • @WebServlet(“/first”) 어노테이션은 이 서블릿이 처리할 요청의 URL을 지정합니다.

1.4 실행결과

  • 실행 후 init()은 한번만 동작 된다는 것을 보기 위해 F5 새로고침을 눌러준다.
  • 다음과 같이 405 오류가 떳지만, 이클립스의 콘솔창에서는 init()이 한번만 실행되고 service()가 여러번 실행되는 모습을 볼 수 있다.

2. Servlet 에서 응답 살펴보기

2.1 service(HttpServletRequest req, HttpServletResponse resp)

  • service() 메소드: SecondServlet에서는 service() 메소드가 HttpServletRequest와 HttpServletResponse 객체를 매개변수로 받습니다.
  • 이는 표준 HTTP 요청과 응답을 나타냅니다. 따라서 1번 코드에서 못받은 응답을 2번코드에서는 받을 수 있습니다.

2.2 @WebServlet

  • @WebServlet(“/second”) 어노테이션은 이 서블릿이 처리할 HTTP 요청의 URL 패턴을 정의합니다.
  • 여기서는 /second라는 경로로 들어오는 요청을 이 서블릿이 처리하도록 설정되어 있습니다.
Java
package ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("SecondServlet!!");
		PrintWriter out = resp.getWriter();
		out.print("<html><head><title>Test</title></head>");
		out.print("<body><h1>have a nice day!!</h1></body>");
		out.print("</html>");
		out.close();
	}
}
  • 이 코드는 웹 브라우저로부터 /second 경로로 요청이 들어올 때, 간단한 HTML 페이지를 생성하여 응답하는 기본적인 서블릿의 작동 방식을 보여줍니다.
  • service() 메소드를 통해 요청을 받고, PrintWriter를 사용하여 HTML 기반의 응답을 동적으로 생성하고, 이를 클라이언트에게 전송하는 과정을 구현하였습니다.

2.3 실행결과

  • 이번에는 WebServlet을 second로 주었으니 second로 접속합니다. 아래와 같이 out.print에서 준 hava a nice day가 잘 나온 모습을 볼 수 있습니다.
  • 또한 콘솔에서는 System.out.println() 으로 출력한 내용이 잘 나오는 것을 볼 수 있습니다.

2.4 web.xml에서 매핑하기

XML
    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>ex01.SecondServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/second</url-pattern>
    </servlet-mapping>
  • web.xml 에서 작성해야 합니다.
  • <servlet-mapping> 에서 <url-pattern>을 지정하였으므로 클라이언트로부터 http://localhost:8080/example/second 라는 요처잉 오면 <servlet> 에서 <servlet-name> 으로 지정한 이름을 호출합니다.
  • <servlet-mapping>에서 <servlet>의 <servlet-name>을 찾아 <servlet-class>를 호출하게 됩니다.
  • 그 뒤 <servlet-class>에 지정한 service() 메소드가 실행됩니다.

3. servlet에서 한글화

  • 서블릿에서 그냥 한글을 출력하려고 하면 인코딩 방식이 달라서 아래의 사진과 같이 나오게 됩니다.

3.1 resp.setContentType(“text/html;charset=UTF-8”);

그래서 위의 코드를 활용하여 한글을 출력할 수 있습니다. 코드의 설명은 아래와 같습니다.

  • resp: HttpServletResponse 객체로, 서블릿이 클라이언트에 응답을 보낼 때 사용합니다.
  • setContentType: 이 메소드는 응답의 콘텐츠 타입을 설정합니다.
  • “text/html”: 응답이 HTML 형식임을 나타냅니다.
  • “charset=UTF-8”: 응답에 사용되는 문자 인코딩을 ‘UTF-8’로 설정합니다. 이는 한글을 포함한 다양한 문자를 정확하게 표현할 수 있게 해 줍니다.
Java
package ex01;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/third")
public class ThirdServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.print("<h1> 재밌는 Servlet </h1>");
		out.close();
	}
}

본글은 위의 책을 바탕으로 하여 작성하였습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top