CodeGym /Java Blog /무작위의 /파트 6. 서블릿 컨테이너
John Squirrels
레벨 41
San Francisco

파트 6. 서블릿 컨테이너

무작위의 그룹에 게시되었습니다
이 자료는 "엔터프라이즈 개발 소개" 시리즈의 일부입니다. 이전 기사: 파트 6. 서블릿 컨테이너 - 1지난 기사에서 우리는 서블릿에 대해 알아보고 이를 사용하여 웹 애플리케이션을 만드는 방법을 배웠습니다. 이 재미의 필수 부분인 서블릿 컨테이너를 자세히 살펴볼 시간입니다.

목차:

서블릿 컨테이너란?

서버에서 실행되고 우리가 만든 서블릿과 상호 작용할 수 있는 프로그램입니다. 즉, 웹 애플리케이션을 서버에서 실행하려면 먼저 서블릿 컨테이너를 배포한 다음 그 안에 서블릿을 배치합니다. 작업 흐름은 간단합니다. 클라이언트가 서버에 액세스하면 컨테이너가 요청을 처리하고 어떤 서블릿이 이를 처리해야 하는지 결정한 다음 요청을 전달합니다. 파트 6. 서블릿 컨테이너 - 2

서블릿 컨테이너는 어떻게 사용됩니까?

라우팅 요청 외에도 서블릿 컨테이너는 다음과 같은 다른 기능을 수행합니다.
  1. JSP 파일에서 HTML 페이지를 동적으로 생성합니다.
  2. HTTPS 메시지를 암호화/해독합니다.
  3. 서블릿 관리를 위해 제한된 액세스를 제공합니다.
일반적으로 이것은 모두 좋게 들립니다. 이제 우리는 이 모든 것을 어떻게 실천에 옮길지 알아내야 합니다. 글쎄요, 어떤 것을 사용하는 방법을 배우려면 그냥 뛰어들어 사용해 보세요 :) 그래서 오늘은 연습을 해보겠습니다! 가장 널리 사용되는 서블릿 컨테이너는 Apache Tomcat 입니다 . 오픈 소스이며 무료로 사용할 수 있습니다. 여기에서 운영 체제용 Tomcat을 다운로드하면 "실행 중인" 컨테이너 작업을 살펴보겠습니다.

Tomcat 설치 및 시작

  1. Tomcat을 설치하려면 다운로드한 아카이브를 원하는 디렉토리에 압축 해제하기만 하면 됩니다.

  2. Tomcat을 시작하고 실행하려면 Java 버전 8 이상이 필요합니다. JAVA_HOME 환경 변수가 JDK의 현재 버전을 참조하는지 확인하십시오.

  3. 다음으로 Tomcat에 대한 사용자 액세스를 구성해야 합니다 . 이것은 conf 폴더에 있는 tomcat-users.xml 파일에서 수행됩니다.

    Tomcat에는 다음 네 가지 사전 설정 역할이 있습니다.

    • manager-gui — 그래픽 인터페이스 및 상태 페이지에 대한 액세스
    • manager-script — 텍스트 인터페이스 및 상태 페이지에 대한 액세스
    • manager-jmx — JMX 및 상태 페이지에 대한 액세스
    • manager-status — 상태 페이지에만 액세스

    <tomcat-users> 태그 내에서 이러한 역할을 명시적으로 지정하고 사용자에게 할당합니다.

    
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user username="user" password="password"
        roles="manager-gui, manager-script, manager-jmx, manager-status"/>
    

    이제 모든 준비가 완료되었습니다!

  4. bin 폴더에서 startup.bat 파일(Linux의 경우 startup.sh)을 실행합니다.

  5. 몇 초 후에 브라우저에서 http://localhost:8080/ 링크를 엽니다 . 그래픽 대시보드가 ​​표시됩니다.

    파트 6. 서블릿 컨테이너 - 3

    이와 같은 메뉴가 보이면 Tomcat이 실행 중인 것입니다.

  6. 실행되고 있지 않으면 JAVA_HOME 및 CATALINA_HOME 환경 변수를 수동으로 확인하십시오.

    • JAVA_HOME — 현재 Java 8+ 버전을 참조해야 합니다.
    • CATALINA_BASE — Tomcat을 참조하거나 없어야 합니다(다른 버전의 Tomcat을 참조해서는 안 됨).

Tomcat에서 애플리케이션 배포

Tomcat을 시작했으므로 이제 일부 프로젝트를 배포할 차례입니다. 이전 기사 의 서블릿을 사용해 봅시다 . 메인서블릿:

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "
"); } else { printWriter.write("Hello, " + username + "
"); } printWriter.write("Page was visited " + visitCounter + " times."); printWriter.close(); } }
인덱스서블릿:

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}
배포하기 전에 서블릿을 WAR 파일로 패키징해야 합니다. Maven은 일반적으로 이를 수행하는 데 사용되지만 WAR 파일을 생성하려면 모든 서블릿에 대한 매핑이 있는 web.xml 파일이 필요합니다. 새로운 @WebServlet 주석을 사용하여 서블릿을 작성했으므로 web.xml 파일이 없습니다. 다행스럽게도 IDEA는 우리 프로젝트를 WAR 파일에 래핑하여 더러운 작업을 대신해 줄 수 있습니다. 이렇게 하려면 프로젝트 구조 열기(Ctrl+Shift+Alt+S) -> 아티팩트 -> 원하는 WAR 파일 선택 -> "프로젝트 빌드에 포함" 옆의 확인란 선택 -> "확인"을 클릭합니다. 파트 6. 서블릿 컨테이너 - 4Ctrl+F9 키 조합을 사용하여 프로젝트를 빌드해 보겠습니다. 이제 우리의 WAR 파일은 대상 디렉토리에 있습니다. 파트 6. 서블릿 컨테이너 - 5파일 이름은 servlet.war와 같이 더 간단한 이름으로 변경하고 C:\\my\\와 같이 보다 편리한 위치로 이동할 수 있습니다.우리는 그것을 컨테이너에 넣을 것입니다 . 두 가지 방법이 있습니다.
  1. 그래픽 인터페이스 사용

    이렇게 하려면 http://localhost:8080/manager/html 링크를 따르십시오 . Tomcat은 사용자 이름과 암호를 요청해야 합니다.

    여기까지 저를 따라오셨다면 사용자 이름은 "user"이고 비밀번호는 "password"입니다 .

    성공적으로 로그인하면 Tomcat 웹 응용 프로그램 관리자가 표시됩니다. "응용 프로그램" 섹션에는 이미 5개의 응용 프로그램이 포함되어 있습니다. 이러한 응용 프로그램은 Tomcat을 보다 쉽게 ​​사용할 수 있도록 해주는 Tomcat 유틸리티입니다. 나중에 삭제할 수 있습니다.

    파트 6. 서블릿 컨테이너 - 6

    아래는 "배포" 섹션입니다. 여기서 배포할 WAR 아카이브를 선택할 수 있습니다. 경로와 컨텍스트를 수동으로 입력해 보겠습니다.

    파트 6. 서블릿 컨테이너 - 7

    "배포"를 클릭하면 "응용 프로그램" 섹션에 응용 프로그램이 나타나는 것을 볼 수 있습니다.

    파트 6. 서블릿 컨테이너 - 8Tomcat의 그래픽 인터페이스를 사용하여 세션을 중지, 다시 시작 및 삭제할 수 있을 뿐만 아니라 세션 길이를 설정할 수 있습니다. 배포할 때 /demo 컨텍스트를 지정했습니다. 이는 애플리케이션이 http://localhost:8080/demo 를 사용하여 액세스됨을 의미합니다 . 확인해 봐. 모든 것이 작동해야 합니다.

  2. 파일 시스템을 통해

    이런 방식으로 애플리케이션을 배포하려면 Tomcat의 압축을 푼 디렉터리를 열어야 합니다. 그런 다음 "webapps" 폴더로 이동합니다. 여기에서 우리가 이미 접한 유틸리티를 찾을 수 있습니다.

    파트 6. 서블릿 컨테이너 - 9

    필요한 것은 servlet.war 파일을 여기로 옮기는 것뿐입니다.

    몇 초간 기다리면 새로운 "servlet" 폴더가 나타나는 것을 볼 수 있습니다. 이는 애플리케이션이 배포되었음을 의미합니다. http://localhost:8080/manager/ 에서 애플리케이션 관리자 인터페이스로 이동합니다 . 여기에서 애플리케이션이 /servlet 컨텍스트에 배포된 것을 볼 수 있습니다.

    파트 6. 서블릿 컨테이너 - 10

    이러한 방식으로 배포되면 배포된 WAR 파일의 이름을 기반으로 컨텍스트가 자동으로 할당됩니다. 컨텍스트를 변경하려면 응용 프로그램이 포함된 새로 생성된 폴더의 이름을 바꿀 수 있지만 그 전에 WAR 파일을 제거해야 합니다. 그렇지 않으면 Tomcat이 아카이브 이름으로 애플리케이션을 재배포합니다.

    보시다시피 Tomcat에서 애플리케이션을 배포하는 것은 생각보다 훨씬 쉽습니다. 그러나 다른 기능도 사용하기 쉽습니다. 점검 해보자.

HTTP 대신 HTTPS 사용

기억하신다면 별도의 기사에서 HTTP와 HTTPS의 차이점을 살펴보았습니다 . HTTPS는 HTTP와 동일한 프로토콜이지만 전송되는 데이터를 암호화합니다. 클라이언트 측에서는 브라우저가 암호화를 담당하지만 서버 측에서는 암호화를 제공해야 합니다. Tomcat은 HTTP 요청을 수락하고 라우팅하므로 암호화를 위임하는 것이 좋습니다. 이렇게 하려면 다음을 수행해야 합니다.
  1. 자체 서명된 인증서 생성
  2. 추가 서버 설정
이렇게 연습해 봅시다.

인증서 생성

버전에 관계없이 JDK에는 많은 유틸리티가 포함되어 있습니다. 그 중 하나가 keytool 입니다 . 이것은 암호화 키를 생성하고 사용하기 위한 도구입니다. 이를 사용하려면 명령줄에서 C:\\Program Files\\Java\\jdk1.8.0_181\\bin 디렉토리로 이동하여 keytool -genkey -alias tomcat -keyalg RSA 명령을 실행합니다 .
  • keytool — 명령줄 옵션으로 실행 중인 유틸리티의 이름
  • -genkey — 새 키 생성을 원함을 나타냅니다.
  • -alias tomcat — 키 별칭 생성
  • -keyalg RSA — RSA를 키 생성 알고리즘으로 선택
명령을 실행하면 유틸리티가 대화를 시작합니다. 파트 6. 서블릿 컨테이너 - 11필요한 정보를 입력하십시오. 이제 홈 디렉터리(Windows의 경우 C:\\Users\\{username}\\.keystore)에 키 저장소를 만들고 그 안에 tomcat 키를 만들었습니다. 우리는 대부분의 브라우저가 불평할 간단한 인증서를 생성했습니다. 이러한 인증서는 상업용 애플리케이션에 적합하지 않으며 테스트 목적으로만 사용할 수 있습니다. 프로덕션 서버에서는 인증 기관(예: https://letsencrypt.org/ ) 의 인증서를 사용해야 합니다 .

서버 구성

이제 인증서가 준비되었으므로 서버 설정, 즉 SSL 커넥터를 조정해야 합니다. 이것은 apache-tomcat-9.0.30/conf/ 에 있는 server.xml 파일에서 수행됩니다 . 그 안에 다음과 같은 블록이 있습니다.

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
 </Connector>
그 옆에 구성을 배치합니다.

    <Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="C:\Users\user\.keystore" keystorePass="mypass"
           clientAuth="false" sslProtocol="TLS"/>
keystoreFile 및 keystorePass 매개 변수에 최신 값을 할당하고 파일을 저장한 다음 shutdown.bat 및 startup.bat 파일을 사용하여 Tomcat을 다시 시작합니다. 이제 서버는 HTTPS 요청을 처리할 준비가 되었습니다. 주소가 약간 변경되었습니다: https://localhost:8443/demo/hello . 링크를 클릭하면 인증서의 신뢰성에 대한 경고가 표시되며 이는 놀라운 일이 아닙니다. 조금 전에 말했듯이 일반 인증서를 받으려면 인증 기관 중 하나의 서비스를 사용해야합니다. 그러나 지금은 목표를 달성했습니다. 응용 프로그램이 HTTPS 프로토콜을 사용하여 실행되며 이것이 중요합니다!

HTML 페이지를 동적으로 생성

이제 HTML 페이지의 동적 생성이라는 또 다른 기능을 고려하여 서블릿 컨테이너에 대한 개요를 계속하겠습니다. 지루한 정적 HTML 코드 대신 변수, 루프, 배열 및 기타 언어 구성을 사용하여 Java 코드를 작성할 수 있는 완벽한 세상을 상상해 보십시오. 당신은 그것을 상상할 수 있었습니까? 좋은 소식은 비슷한 것이 존재한다는 것입니다. 나쁜 소식은 이 환상을 완전히 달성하지 못한다는 것입니다. JSP(JavaServer Pages)에 대해 이야기하고 있는 것입니다. 즉, HTML 페이지에 Java 코드 조각을 삽입할 수 있는 기술입니다. 사실, 이 Java 코드는 클라이언트로 전송되기 전에 여전히 HTML로 변환되지만 HTML은 다양한 요인을 고려하여 동적으로 생성됩니다. 예를 들어, 조건문을 사용하고 일부 조건에 따라 다른 콘텐츠를 반환할 수 있습니다. 예제 JSP 페이지:

<%@ page language="java"" %>
<html>
<head>
<title>JSP</title>
</head>

<body>
<%
String firstName="name";
String secondName="surname";
    
    if (firstName.equals("name")){
      out.print("Hello: "+firstName+"<br>");
    }

    if (firstName.equals("name") && secondName.equals("surname"))
    {
      out.print("Hello, my dear friend! <br>");
    }
    else
    {
      out.print("I don't know you. Go away! <br>");
    }
%>
</body>
</html>
여기에서 JSP에 대한 자세한 내용을 읽을 수 있습니다.. 결국 이 기사는 JSP에 관한 것이 아닙니다. 우리는 서블릿 컨테이너에 대해 이야기하려고 합니다! 그렇다면 JSP를 언급한 이유는 무엇입니까? 간단합니다. 서블릿 컨테이너는 Java 코드를 JSP에서 HTML로 변환하는 것입니다. 서블릿이 응답으로 JSP 콘텐츠를 반환하려고 할 때 컨테이너는 이러한 콘텐츠를 클라이언트에 보내기 전에 이를 메모하고 먼저 브라우저 친화적인 HTML 페이지로 변환합니다. 오늘날 Thymeleaf, FreeMarket, Mustache 등 JSP 기술과 유사한 기술이 많이 있습니다. 그들은 모두 비슷한 방식으로 작동합니다. 작업을 위해 선택할 항목은 취향의 문제입니다. 이는 서블릿 컨테이너 선택에도 적용됩니다. 이 예제에서는 가장 일반적인 컨테이너인 Tomcat을 사용했지만 일부 프로젝트에서는 다른 컨테이너를 사용합니다. 가장 인기 있는 항목을 간략하게 검토하고 Tomcat과 어떻게 다른지 고려하는 것이 좋습니다.

톰캣의 대안

  1. GlassFish 는 Oracle에서 개발을 지원하는 오픈 소스 컨테이너입니다.

    Tomcat과 달리 서블릿 외에도 JavaEE 프레임워크의 다른 구성 요소와 함께 작동할 수 있는 본격적인 웹 서버입니다. 즉, 훨씬 더 많은 RAM을 사용합니다. 서버를 미세 조정할 때 더 큰 유연성이 있어 사용이 복잡해집니다. JavaEE 프레임워크에서 애플리케이션을 개발할 때 사용해야 합니다.

  2. WildFly는 이전에 JBoss 로 알려졌습니다 . 또한 오픈 소스입니다. 레드햇에서 개발했습니다. 회사의 다른 제품인 JBoss Enterprise Application Platform과의 혼동을 피하기 위해 이름이 변경되었습니다.

    GlassFish와 마찬가지로 WildFly는 본격적인 웹 서버입니다. 부수적으로 WildFly는 Tomcat을 서블릿 컨테이너로 사용합니다. GlassFish와 달리 WildFly는 더 가볍고 구성하기 쉽습니다.

  3. 이전 버전과 마찬가지로 Jetty는 오픈 소스입니다. 이클립스에서 개발했습니다.

    Tomcat과 마찬가지로 JavaEE 프레임워크의 모든 구성 요소를 지원하지 않는 단순한 서블릿 컨테이너입니다. 동시에 더 가볍고 휴대폰에서도 실행할 수 있습니다. 빠르게 시작하고 중지하며 잘 확장됩니다. Tomcat과 달리 커뮤니티와 지식 기반이 더 작습니다.

  4. WebLogic은 사용하기 전에 구매해야 하는 라이선스 소프트웨어입니다. 오라클에 속합니다.

    Tomcat보다 기능이 약간 더 넓습니다. 그것은 FTP 프로토콜과 함께 작동할 수 있습니다. 그러나 응용 프로그램을 개발하고 테스트할 때는 그렇게 유연하지 않습니다.

  5. WebSphere (정확히 말하면 WebSphere Application Server)는 유료 소프트웨어입니다. IBM에서 개발했습니다. WildFly 및 GlassFish와 마찬가지로 완전한 애플리케이션 서버입니다. 그러나 친숙한 구성 인터페이스와 높은 작동 안정성을 제공합니다.

    단점은 많은 리소스를 사용하고 시작 및 중지에 오랜 시간이 걸린다는 점입니다. 이는 소규모 프로젝트를 개발할 때 그다지 편리하지 않습니다.

올바른 서블릿 컨테이너 또는 애플리케이션 서버의 선택은 특정 프로젝트에 따라 다릅니다. 확실한 약자라도 탁월한 선택이 될 수 있는 프로젝트가 있지만 처음에는 하나의 서블릿 컨테이너에 대해 심층적으로 연구하는 것이 가장 좋습니다. Tomcat은 아마도 이 연구를 위한 완벽한 후보일 것입니다. 그리고 우리는 이미 그것을 연구하는 첫 단계를 밟았지만 여기서부터는 당신에게 달려 있습니다! "엔터프라이즈 개발 소개" 시리즈의 마지막 기사에서는 MVC 패턴에 대해 알아볼 것입니다. 7부. MVC(Model-View-Controller) 패턴 소개
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION