[Java] 38. Java에서 웹 서비스 프로젝트(JSP Servlet)를 작성하는 방법


Study/Java  2021. 5. 31. 12:53

안녕하세요. 명월입니다.

 

이 글은 Java에서 웹 서비스 프로젝트(JSP servlet)를 작성하는 방법에 대한 글입니다.

 

웹이라는 프로그램은 Server(Web server)와 client(Browser)간의 정해진 표준 규약으로 소켓 통신을 하는 것을 말합니다.

간단하게 설명하면 client(Browser)에서 url 주소 포함 경로와 ParamString(주소줄에 ?뒤에 적혀있는 일련의 값들)과 기본적인 http 해더와 요청 값을 작성하여 Server에 요청을 하게되면 해당 값을 계산하여 응답하고 접속을 끊는 규약을 우리는 웹 서비스라고 합니다.


그래서 우리는 웹 서비스 서버를 만들기 하기 위해서는 웹으로부터 오는 값을 해석을 해야하고 그 값에 맞게 응답 헤더와 data값을 작성해야 합니다. 그것을 일일히 콘솔 환경에서 만들기는 무척 힘이 듭니다.

Java에서는 특정한 요청을 자동으로 파싱하고 우리는 간단하게 변수등을 이용해서 그 값을 쉽게 취득하고 다시 응답 헤더와 data 값을 만들 때도 간단한 값만 return 함으로써 쉽게 웹 서비스 서버를 만들 수 있습니다.

그것을 Java Server Page(JSP)라고 이야기 합니다.


참고로, 우리가 웹서비스를 하기 위해서는 스트럿츠나 스프링 등등의 이야기를 많이 듣게 됩니다. 스트럿츠나 스프링 등은 웹 프로그래밍의 프레임워크 라이브러리이지 그것이 웹 플렛폼에 대한 이야기는 아닙니다.

프레임워크라는 것은 우리가 프로그램을 만들 때, 자주 사용되는 함수나 라이브러리 그리고 복잡한 알고리즘을 간단하게 작성할 수 있게 도와주는 잡약된 라이브러리라고 생각하면 됩니다. 즉, 기본적으로 JSP 프로젝트 위에서 이 JSP를 더욱 쉽게 다루기 위한 도구입니다.


그래서 처음 Java로 웹 서버를 만들게 된다고 하면 스트럿츠나 스프링을 알기 전에 Java servlet을 이해할 필요가 있습니다.

 

링크 - https://ko.wikipedia.org/wiki/

 

먼저 서블릿 프로젝트를 실행하기 전에 이클립스에 톰켓을 설정해야 합니다. 이전의 글에서 개발하기 전에 톰켓을 설정하는 방법에 대해 작성한 글이 있습니다.

링크 - [Java] 37. 이클립스(eclipse)에서 톰켓을 설정하는 방법

 

톰캣(Web application server)가 설정이 되었다면 웹 서비스 프로젝트를 만들어 봅시다.

New Project -> Other를 실행합니다.

그 중 Web -> Dynamic Web Project를 선택하고 Next를 누릅니다.

참고로 Static Web Project와 Dynamic Web Project의 차이는 Static는 servlet 환경이 아닌 그냥 서버에서 요청받은 web page(html)를 응답하는 것으로 동적으로 html를 수정하거나 값을 넣을 수 있는 프로젝트가 아닙니다.

즉, 요청에 따라 html 페이지의 데이터를 변환하기 위해서는 Dynamic Web Project를 실행하게 됩니다.

그리고 프로젝트 이름과 톰켓 설정과 module version이 맞는지 확인하고 Finish를 누릅니다.

※참고로 이클립스 plug in을 엔터프라이즈 버전으로 설치를 해야 웹 서블릿을 생성하는데 문제가 없습니다. 기본 이클립스의 경우는 해당 이미지처럼 작동하지 않습니다. 즉 Web Servlet 플러그인을 따로 설치해야 합니다. 귀찮으니 엔터프라이즈 버전으로 설치합시다.

링크 - [Java] 01. Java 설치와 Eclipse 설치

프로젝트를 생성하면 먼저 web.xml를 살펴보겠습니다. web.xml은 servlet에서 사용될 환경 변수 같은 것입니다. 각자 Web Server와 환경과 구축 사양이 다르기 때문에 설정이 필요합니다. web.xml를 없는 경우는 아래와 같은 방법으로 생성하면 됩니다.

언제부터인가 이 web.xml이 자동으로 생성되지 않네요..

web.xml이 생성되었으면 기본적인 내용을 확인하겠습니다.

<?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"
         version="3.1">
  <display-name>HelloworldTest</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

welcome-file-list 태그만 있는데 이는 root 페이지 일때 보여 줄 페이지입니다. 즉, localhost/index.jsp이라고 접속하는 것이 아니고 localhost/일 경우 접속하는 것입니다.

저는 index.jsp 파일을 지정했습니다.

 

그럼 이제 index.jsp를 만들어서 웹 브라우저에서 hello world를 보겠습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    Hello world
  </body>
</html>

그리고 기동해 보겠습니다.

※Window -> Browser 설정

이클립스에서 기본 브라우저로 확인도 가능합니다만 기본 브라우저로 보면 약간 이상헤 보이기 때문에 자주 사용하는 Chrome 브라우저를 이용해서 결과를 확인하는 것이 좋습니다.

일단 웹 서비스는 기동했습니다. 그러나 우리가 만들고 싶은건 static 프로젝트처럼 웹페이지를 응답하는 것이 아닌 서블릿 페이지입니다.

즉, 브라우저에서 요청하는 값에 따라 프로그램 처리를 따라서 결과를 내보내고 싶은 것입니다.


먼저 기동되었던 웹 서버를 끕니다.

그리고 프로젝트에서 서블릿을 추가합니다.

우선, 저는 Test라는 서블릿을 만들었습니다.

그럼 아래 이미지 같이 서블릿이 생성됩니다.

// 패키지 설정
package test;

import java.io.IOException;
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("/Test")
// 호스명과 클래스 이름은 꼭 같은 필요는 없다. 그러나 클래스 관리가 쉽게 하기 위해서는 맞추는 게 좋다.
public class Test extends HttpServlet {
  // 직렬화 키, HttpServlet 클래스는 기본적으로 Serializable를 상속 받고 있다
  private static final long serialVersionUID = 1L;
  // 생성자
  public Test() {
    super();
  }
  // 브라우저에서 method가 get방식으로 호출할 때, 실행되는 함수
  // 파라미터 request는 브라우저에서 요청하는 값이 있는 파라미터
  // 파라미터 response는 브라우저로 응답할 값을 저장해야하는 파라미터
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    // response.getWriter()함수로 데이터 영역의 Stream를 받는다.
    // 기본적이 요청에 문자 Served at를 입력하고 요청 url를 넣는다.
    response.getWriter().append("Served at: ").append(request.getContextPath());
    // 개행을 넣는다.
    response.getWriter().append("<br />");
    // Hello world 문자를 넣는다.
    response.getWriter().append("Hello world");
  }
  // 브라우저에서 method가 post방식으로 호출할 때, 실행되는 함수
  // 파라미터 request는 브라우저에서 요청하는 값이 있는 파라미터
  // 파라미터 response는 브라우저로 응답할 값을 저장해야하는 파라미터
  protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
    // doGet함수를 실행한다.
    // 즉, get방식 요청이나 post방식 요청이나 결과값은 같다.
    doGet(request, response);
  }
}

작성이 끝났으면 서버를 다시 실행합니다.

저는 호스트를 /Test로 지정했을 때 servlet를 요청하는 것으로 작성하였기 때문에 웹 브라우져 경로에 Test를 입력하고 접속합니다.

개행 태그가 그대로 나왔습니다. 소스 보기로 확인하겠습니다.

이유인즉, 정상적인 html 태그가 아니기 때문에 html 문서가 아닌 text문서로 읽어들인 것이었습니다.

정상적인 html 태그는 Docuemnt 태그가 필요하고 기본적으로 html 태그로 시작하여 내용은 body태그 안에 넣어야 합니다.

 

여기까지 Java에서 웹 서비스 프로젝트(JSP servlet)를 작성하는 방법에 대한 설명이었습니다.

 

궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.