초보자를 위한 Java 웹 응용 프로그램 자습서

Java 웹 애플리케이션은 동적 웹 사이트를 생성하는 데 사용됩니다. Java는 서블릿JSP를 통해 웹 애플리케이션을 지원합니다. 정적 HTML 페이지로 웹 사이트를 만들 수 있지만 정보를 동적으로 만들고 싶을 때는 웹 애플리케이션이 필요합니다.

Java 웹 애플리케이션

이 기사의 목적은 웹 애플리케이션의 다양한 구성 요소에 대한 기본 세부 정보를 제공하고 Servlet과 JSP를 사용하여 첫 번째 Java 웹 애플리케이션을 만드는 방법을 설명하는 것입니다.

  1. 웹 서버와 클라이언트
  2. HTML 및 HTTP
  3. URL 이해
  4. 왜 Servlet과 JSP가 필요한가요?
  5. Servlet과 JSP를 사용한 첫 번째 웹 애플리케이션
  6. 웹 컨테이너
  7. 웹 애플리케이션 디렉터리 구조
  8. 배포 서술자

웹 서버와 클라이언트

웹 서버는 클라이언트 요청을 처리하고 응답을 클라이언트에게 보낼 수 있는 소프트웨어입니다. 예를 들어, 아파치는 가장 널리 사용되는 웹 서버 중 하나입니다. 웹 서버는 일부 물리적인 기계에서 실행되며 특정 포트에서 클라이언트 요청을 수신합니다. 웹 클라이언트는 서버와 통신하는 데 도움이 되는 소프트웨어입니다. 가장 널리 사용되는 웹 클라이언트로는 Firefox, Google Chrome, Safari 등이 있습니다. 서버에서 무언가를 요청할 때 (URL을 통해), 웹 클라이언트는 요청을 생성하고 서버에 보내며 서버 응답을 구문 분석하여 사용자에게 제시하는 역할을 담당합니다.

HTML과 HTTP

웹 서버와 웹 클라이언트는 두 개의 별개 소프트웨어이므로 통신을 위해 일반적인 언어가 필요합니다. HTML은 서버와 클라이언트 간의 공통 언어이며 HyperText Markup Language의 약자입니다. 웹 서버와 클라이언트는 공통 통신 프로토콜인 HTTP (HyperText Transfer Protocol)가 필요합니다. HTTP는 TCP/IP 통신 프로토콜 위에서 동작합니다. HTTP 요청의 중요한 부분 중 일부는 다음과 같습니다:

  • HTTP 메서드 – 수행할 동작, 일반적으로 GET, POST, PUT 등입니다.
  • URL – 액세스할 페이지입니다.
  • 폼 매개변수 – 자바 메서드의 인수와 유사합니다. 예를 들어 로그인 페이지에서 사용자, 비밀번호 정보입니다.

샘플 HTTP 요청:

GET /FirstServletProject/jsps/hello.jsp HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

HTTP 응답의 중요한 부분 중 일부는 다음과 같습니다:

  • 상태 코드 – 요청이 성공했는지 여부를 나타내는 정수입니다. 잘 알려진 상태 코드 중에는 성공을 나타내는 200, 찾을 수 없음을 나타내는 404, 액세스 금지를 나타내는 403 등이 있습니다.
  • 콘텐츠 유형 – 텍스트, HTML, 이미지, PDF 등입니다. MIME 유형으로도 알려져 있습니다.
  • 콘텐츠 – 클라이언트에서 렌더링되고 사용자에게 표시되는 실제 데이터입니다.

샘플 HTTP 응답:

200 OK
Date: Wed, 07 Aug 2013 19:55:50 GMT
Server: Apache-Coyote/1.1
Content-Length: 309
Content-Type: text/html;charset=US-ASCII

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=Wed Aug 07 12:57:55 PDT 2013
</h3>
</body>
</html>

MIME 유형 또는 콘텐츠 유형: 위의 샘플 HTTP 응답 헤더를 보면 “Content-Type” 태그가 포함되어 있습니다. MIME 유형이라고도 하며 서버가 클라이언트에게 전송하여 전송하는 데이터 유형을 알려줍니다. 이는 클라이언트가 사용자를 위해 데이터를 렌더링하는 데 도움이 됩니다. 가장 많이 사용되는 MIME 유형 중 일부는 text/html, text/xml, application/xml 등입니다.

URL 이해

URL은 Universal Resource Locator의 약자로, 서버 및 리소스의 위치를 찾는 데 사용됩니다. 웹의 모든 리소스에는 고유한 주소가 있습니다. 예를 들어 URL의 일부를 살펴보겠습니다. https://localhost:8080/FirstServletProject/jsps/hello.jsp https:// – URL의 첫 번째 부분으로, 서버-클라이언트 통신에 사용될 통신 프로토콜을 제공합니다. localhost – 서버의 고유한 주소로, 대부분의 경우에는 서버의 호스트 이름이 고유한 IP 주소로 매핑됩니다. 때로는 여러 호스트 이름이 동일한 IP 주소를 가리키며 웹 서버 가상 호스트가 특정 서버 인스턴스로 요청을 보냅니다. 8080 – 서버가 수신 대기하는 포트로, 선택 사항이며 URL에 제공하지 않으면 요청이 프로토콜의 기본 포트로 이동합니다. 포트 번호 0에서 1023까지는 잘 알려진 서비스를 위한 예약된 포트입니다. 예를 들어, HTTP에는 80, HTTPS에는 443, FTP에는 21 등이 있습니다. FirstServletProject/jsps/hello.jsp – 서버에서 요청된 리소스입니다. 정적 HTML, PDF, JSP, 서블릿, PHP 등이 될 수 있습니다.

왜 Servlet과 JSP가 필요한가요?

웹 서버는 정적 콘텐츠 HTML 페이지에 적합하지만 동적 콘텐츠를 생성하거나 데이터를 데이터베이스에 저장하는 방법을 알지 못합니다. 그래서 우리는 동적 콘텐츠를 생성하는 데 사용할 수 있는 다른 도구가 필요합니다. PHP, Python, Ruby on Rails, Java Servlets 및 JSP와 같은 여러 프로그래밍 언어가 동적 콘텐츠를 위해 있습니다. Java Servlet 및 JSP는 웹 서버의 기능을 확장하여 동적 응답 및 데이터 지속성을 제공하는 서버 측 기술입니다.

자바 웹 개발

서블릿과 JSP를 이용한 첫 번째 웹 애플리케이션

첫 번째 서블릿 응용 프로그램을 만들기 위해 “Eclipse IDE for Java EE Developers”를 사용할 것입니다. 서블릿은 서버 측 기술이므로 Servlet 기술을 지원하는 웹 컨테이너가 필요합니다. 따라서 Apache Tomcat 서버를 사용할 것입니다. 설정은 매우 간단하며 이 부분은 여러분에게 맡기겠습니다. 개발의 편의를 위해 Tomcat을 Eclipse와 구성할 수 있으며, 이는 애플리케이션을 쉽게 배포하고 실행하는 데 도움이 됩니다. Eclipse 기본 설정으로 가서 서버 런타임 환경을 선택하고 Tomcat 서버 버전을 선택합니다. 제 버전은 Tomcat 7입니다. Apache Tomcat 디렉터리 위치와 JRE 정보를 제공하여 런타임 환경을 추가합니다. 이제 서버 보기로 이동하여 위에서 추가한 런타임 환경을 가리키는 새 서버를 생성합니다. 아래 이미지와 같이 생성하십시오. 참고: 서버 탭이 표시되지 않는 경우, Window > Show View > Servers를 선택하여 Eclipse 창에 표시되도록 설정할 수 있습니다. 서버가 정상적으로 작동하는지 확인하기 위해 서버를 중지하고 시작해 보십시오. 이미 터미널에서 서버를 시작했다면 터미널에서 중지한 후 Eclipse에서 시작해야만 완벽하게 작동합니다. 이제 첫 번째 서블릿을 생성하고 Tomcat 서버에서 실행하기 위해 설정이 완료되었습니다. 파일 > 새로 만들기 > 동적 웹 프로젝트를 선택하고 마지막 단계에서 추가한 서버를 런타임으로 제공하고 모듈 버전을 3.0으로 설정하여 Servlet 3.0 사양을 사용하여 서블릿을 생성하십시오. 아래 이미지를 사용하십시오. 프로젝트를 생성하려면 직접 완료 버튼을 클릭하거나 다른 옵션을 확인하기 위해 다음 버튼을 클릭할 수도 있습니다. 이제 파일 > 새로 만들기 > 서블릿을 선택하고 아래 이미지를 사용하여 첫 번째 서블릿을 생성하십시오. 다시 한 번 완료를 클릭하거나 다음 버튼을 통해 다른 옵션을 확인할 수 있습니다. 완료 버튼을 클릭하면 서블릿의 기본 코드가 생성되므로 모든 다른 메서드와 가져오기를 입력할 필요가 없어 시간을 절약할 수 있습니다. 이제 doGet() 메서드에 동적 데이터 코드와 HTML을 추가하겠습니다. 첫 번째 서블릿은 다음과 같습니다.

package com.journaldev.first;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

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

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet(description = "My First Servlet", urlPatterns = { "/FirstServlet" , "/FirstServlet.do"}, initParams = {@WebInitParam(name="id",value="1"),@WebInitParam(name="name",value="pankaj")})
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public static final String HTML_START="";
	public static final String HTML_END="";
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FirstServlet() {
        super();
        // 할 일 자동 생성된 생성자 스텁
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		Date date = new Date();
		out.println(HTML_START + "

Hi There!


Date="+date +"

"+HTML_END); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 할 일 자동 생성된 메서드 스텁 } }

서블릿 3 이전에는 웹 애플리케이션 배포 설명자에 URL 패턴 정보를 제공해야 했지만 서블릿 3.0은 이해하기 쉽고 오류 가능성이 적은 자바 어노테이션을(를) 사용합니다. 이제 서블릿 편집기 창에서 실행 및 서버 실행 옵션을 선택하고 아래 이미지를 사용하십시오. 완료를 클릭한 후에는 브라우저가 Eclipse에서 열리고 다음 HTML 페이지가 표시됩니다. 날짜가 동적으로 변경되는지 확인하려면 새로 고칠 수 있으며, Eclipse 외부에서도 다른 브라우저에서 열 수 있습니다. 따라서 서블릿은 HTML을 생성하고 응답으로 보내는 데 사용됩니다. doGet() 구현을 살펴보면 PrintWriter 객체에 쓰여진 HTML 문서를 실제로 생성하고 필요한 곳에 동적 정보를 추가하고 있습니다. 이것은 시작하기에 좋지만 응답이 많은 동적 데이터로 인해 큰 경우 오류가 발생할 수 있으며 읽기 어렵고 유지 관리하기 어렵습니다. 이것이 JSP 도입의 주된 이유입니다. JSP도 서버 측 기술이며 필요한 곳에 동적 콘텐츠를 추가할 수 있는 추가 기능이 있는 HTML과 같습니다. JSP는 HTML과 유사하여 쓰기 쉽기 때문에 표현용으로 좋습니다. 여기 위의 서블릿과 동일한 작업을 수행하는 첫 번째 JSP 프로그램이 있습니다.

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=<%= new Date() %>
</h3>
</body>
</html>

만약 위의 JSP를 실행하면 아래 이미지와 같은 결과가 나옵니다. 최종 프로젝트 계층 구조는 Eclipse에서 아래 이미지와 같이 보입니다.

FirstServlet 프로젝트 다운로드

Hello World 예제 프로젝트 서블릿 다운로드

향후 게시물에서 서블릿과 JSP에 대해 더 자세히 살펴보겠지만, 이 게시물을 마치기 전에 Java 웹 애플리케이션의 몇 가지 측면에 대해 잘 이해해야 합니다.

웹 컨테이너

Tomcat은 웹 컨테이너입니다. 클라이언트에서 웹 서버로 요청이 전송되면, 웹 컨테이너가 요청을 받아들이고 올바른 자원(servlet 또는 JSP)을 찾아 요청을 처리하는 것이 웹 컨테이너의 역할입니다. 그런 다음, 자원에서 받은 응답을 사용하여 응답을 생성하고 웹 서버에 제공합니다. 그런 다음, 웹 서버가 응답을 클라이언트에게 다시 보냅니다. 웹 컨테이너가 요청을 받으면, servlet에 대한 것이고 servlet의 경우 컨테이너가 두 개의 객체 HTTPServletRequest와 HTTPServletResponse를 생성합니다. 그런 다음 URL을 기반으로 올바른 servlet을 찾고 요청에 대한 스레드를 생성합니다. 그런 다음 servlet의 service() 메서드를 호출하고 HTTP 메서드에 따라 doGet() 또는 doPost() 메서드를 호출합니다. Servlet 메서드는 동적 페이지를 생성하고 응답에 쓰게 됩니다. servlet 스레드가 완료되면, 컨테이너가 응답을 HTTP 응답으로 변환하여 클라이언트에게 다시 전송합니다. 웹 컨테이너가 수행하는 중요한 작업 중 일부는 다음과 같습니다:

  • 통신 지원 – 컨테이너는 웹 서버와 servlet 및 JSP 간의 통신을 쉽게 지원합니다. 컨테이너 덕분에 웹 서버에서 요청을 수신하고 요청을 파싱하고 응답을 생성하기 위해 서버 소켓을 구축할 필요가 없습니다. 이러한 중요하고 복잡한 작업은 모두 컨테이너에 의해 수행되며, 우리가 해야 할 일은 응용 프로그램의 비즈니스 로직에만 집중하는 것입니다.
  • 생명주기 및 리소스 관리 – 컨테이너는 servlet의 생명주기를 관리합니다. 컨테이너는 servlet을 메모리에 로드하고, servlet을 초기화하고, servlet 메서드를 호출하고, servlet을 파괴하는 것을 처리합니다. 컨테이너는 리소스 풀링 및 관리를 위해 JNDI와 같은 유틸리티도 제공합니다.
  • 다중 스레딩 지원 – 컨테이너는 서블릿에 대한 각 요청마다 새 스레드를 생성하고 처리가 완료되면 해당 스레드가 종료됩니다. 따라서 서블릿은 각 요청마다 초기화되지 않으며 시간과 메모리를 절약할 수 있습니다.
  • JSP 지원 – JSP는 일반적인 자바 클래스와 같지 않으며 웹 컨테이너가 JSP에 대한 지원을 제공합니다. 응용 프로그램의 각 JSP는 컨테이너에 의해 컴파일되어 서블릿으로 변환되고 그런 다음 컨테이너가 다른 서블릿과 마찬가지로 관리합니다.
  • 기타 작업 – 웹 컨테이너는 리소스 풀을 관리하고 메모리 최적화, 가비지 수집기 실행, 보안 구성, 다중 애플리케이션 지원, 핫 배포 및 여러 가지 다른 작업을 백그라운드에서 수행하여 우리의 삶을 더 쉽게 만듭니다.

웹 애플리케이션 디렉토리 구조

자바 웹 애플리케이션은 Web Archive (WAR)로 패키징되며 정의된 구조를 가지고 있습니다. 위의 동적 웹 프로젝트를 WAR 파일로 내보내고 계층 구조를 확인하기 위해 압축 해제할 수 있습니다. 아래 이미지와 유사한 모양일 것입니다.

배포 설명자

web.xml 파일은 웹 애플리케이션의 배포 설명자로서 서블릿 (3.0 이전), 환영 페이지, 보안 구성, 세션 타임아웃 설정 등에 대한 매핑을 포함합니다. 이것으로 자바 웹 애플리케이션 시작 튜토리얼을 마칩니다. 앞으로의 게시물에서는 서블릿과 JSP를 더 탐구할 것입니다. 업데이트: 이 시리즈의 다음 튜토리얼은 자바 서블릿 튜토리얼입니다.

Source:
https://www.digitalocean.com/community/tutorials/java-web-application-tutorial-for-beginners