JavaRush /Java Blog /Random-KO /6부: 서블릿 컨테이너

6부: 서블릿 컨테이너

Random-KO 그룹에 게시되었습니다
이 자료는 "엔터프라이즈 개발 소개" 시리즈의 일부입니다. 이전 기사: 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-jmx - JMX 및 상태 페이지에 액세스합니다.
    • 관리자 상태 - 상태 페이지에만 액세스합니다.

    <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_HOME - Tomcat을 참조하거나 없어야 합니다(다른 버전의 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는 우리를 위해 더러운 작업을 수행하고 프로젝트를 전쟁 기록 보관소에 개별적으로 포장할 수 있습니다. 이렇게 하려면 프로젝트 구조를 열어야 합니다(Ctrl + Shift + Alt + S) -> 아티팩트 -> 원하는 양조 선택 -> "프로젝트 빌드에 포함" 옆의 확인란 선택 -> "확인"을 클릭합니다. 6부: 서블릿 컨테이너 - 4Ctrl + F9 조합을 사용하여 프로젝트를 빌드합니다. 이제 war 아카이브가 대상 디렉터리에 있습니다. 6부: 서블릿 컨테이너 - 5파일 이름을 더 간단한 이름(예: servlet.war)으로 바꾸고 더 편리한 위치(C:\my\)로 이동할 수 있습니다. 맥주를 사용할 준비가 되면 용기에 넣으세요 . 이는 두 가지 방법으로 수행할 수 있습니다.
  1. GUI를 통해

    이렇게 하려면 http://localhost:8080/manager/html 링크를 따르십시오 . Tomcat은 로그인과 비밀번호를 묻는 메시지를 표시합니다.

    나 이후의 모든 단계를 반복했다면 로그인은 user 이고 비밀번호는 비밀번호 입니다 .

    인증이 성공적으로 완료되면 Tomcat Web Application Manager가 표시됩니다. 애플리케이션 섹션에는 이미 5개의 애플리케이션이 포함되어 있습니다. 이는 작업을 단순화하는 데 필요한 Tomcat 유틸리티 애플리케이션입니다. 나중에 제거할 수 있습니다.

    6부: 서블릿 컨테이너 - 6

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

    6부. 서블릿 컨테이너 - 7

    “배포”를 클릭하면 애플리케이션 섹션에 애플리케이션이 나타나는 것을 볼 수 있습니다.

    6부: 서블릿 컨테이너 - 8 Tomcat GUI를 사용하여 이를 중지하고 다시 시작하고 세션 길이를 설정하고 삭제할 수 있습니다. 배포할 때 컨텍스트 /demo를 지정했습니다. 이는 http://localhost:8080/demo 링크를 통해 애플리케이션에 액세스해야 함을 의미합니다 . 확인하세요. 모든 것이 제대로 작동할 것입니다.

  2. 파일 시스템을 통해

    이런 방식으로 애플리케이션을 배포하려면 Tomcat의 압축이 풀린 디렉터리를 열고 webapps로 이동해야 합니다. 다음은 우리에게 익숙한 유틸리티 애플리케이션입니다.

    6부: 서블릿 컨테이너 - 9

    우리가 해야 할 일은 servlet.war을 여기로 옮기는 것뿐입니다.

    몇 초 정도 기다리면 새 서블릿 폴더가 나타나는 것을 볼 수 있습니다. 이는 애플리케이션이 배포되었음을 의미합니다. 익숙한 Application Manager 인터페이스( http://localhost:8080/manager/ ) 로 이동해 보겠습니다 . 여기서는 애플리케이션이 /servlet 컨텍스트에 배포된 것을 볼 수 있습니다.

    6부: 서블릿 컨테이너 - 10

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

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

HTTP 대신 HTTPS 프로토콜 사용

기억하신다면 별도의 기사에서 HTTP와 HTTPS의 차이점에 대해 논의한 적이 있습니다 . HTTPS는 HTTP와 동일한 프로토콜이지만 전송되는 데이터의 암호화를 사용합니다. 클라이언트 측에서는 브라우저가 암호화를 처리하므로 서버 측에서는 암호화를 제공해야 합니다. HTTP 요청은 Tomcat에 의해 승인되고 라우팅되므로 암호화를 Tomcat에 위임하는 것이 논리적입니다. 이렇게 하려면 다음이 필요합니다.
  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 및 start.bat 파일을 사용하여 Tomcat을 저장하고 다시 시작합니다. 이제 서버는 변경된 주소( https://localhost:8443/demo/hello ) 에서 https 요청을 처리할 준비가 되었습니다 . 링크를 클릭하면 인증서에 문제가 있다는 경고가 표시되는데 이는 놀라운 일이 아닙니다. 앞서 설명한 것처럼 일반 인증서를 얻으려면 인증 서비스 중 하나의 서비스를 사용해야 합니다. 그러나 지금까지 우리는 목표를 달성했습니다. 애플리케이션은 HTTPS 프로토콜을 사용하여 작동하며 이것이 가장 중요합니다!

HTML 페이지의 동적 생성

이제 서블릿 컨테이너의 다른 기능인 HTML 페이지의 동적 생성에 대한 검토를 계속하겠습니다. 지루한 정적 HTML 코드 대신 변수, 루프, 배열 및 기타 언어 구성을 사용하여 JAVA 코드를 작성할 수 있는 이상적인 세상을 상상해 보십시오. 상상하셨나요? 좋은 소식은 비슷한 것이 존재한다는 것이고, 나쁜 소식은 그것이 완전히 존재하지 않는다는 것입니다. 짐작하지 못했다면 JSP(Java Server Pages) 기술에 대해 이야기하고 있는 것입니다. 간단히 말해서 이는 HTML 페이지에 JAVA 코드 조각을 삽입할 수 있는 기술입니다. 사실, 이 코드는 클라이언트에 전송되기 전에 여전히 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는 그것과 무슨 관련이 있습니까? 간단합니다. 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 패턴(모델-뷰-컨트롤러) 소개 8부. spring-boot에서 작은 애플리케이션 작성
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION