

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Java 앱 배포
<a name="layers-java-deploy"></a>

**중요**  
이 AWS OpsWorks Stacks 서비스는 2024년 5월 26일에 수명이 종료되었으며 신규 및 기존 고객 모두에서 비활성화되었습니다. 가능한 한 빨리 워크로드를 다른 솔루션으로 마이그레이션하는 것이 좋습니다. 마이그레이션에 대한 질문이 있는 경우 [AWS re:Post](https://repost.aws/) 또는 [AWS Premium Support](https://aws.amazon.com/support)를 통해 AWS Support 팀에 문의하세요.

다음 주제에서는 Java 앱 서버 계층의 인스턴스에 앱을 배포하는 방법을 설명합니다. 예제는 JSP 앱용이지만 다른 유형의 Java 앱 설치에도 기본적으로 동일한 절차를 사용할 수 있습니다.

지원되는 모든 리포지토리에서 JSP 페이지를 배포할 수 있습니다. WAR 파일을 배포하려는 경우 OpsWorks Stacks는 Git 또는 Subversion 리포지토리가 아닌 Amazon S3 또는 HTTP 아카이브에서 배포된 WAR 파일을 자동으로 추출합니다. WAR 파일에 Git 또는 하위 버전을 사용하려면 다음 중 하나를 수행할 수 있습니다.
+ 추출된 아카이브를 리포지토리에 저장합니다.
+ 리포지토리에 WAR 파일을 저장하고 다음 예제의 설명처럼 Chef 배포 후크를 사용하여 아카이브를 추출합니다.

Chef 배포 후크를 사용하여 배포 4단계 중 어느 단계에서나 사용자 제공 Ruby 애플리케이션을 인스턴스에서 실행할 수 있습니다. 애플리케이션 이름이 단계를 결정합니다. 다음은 Git 또는 하위 버전 리포지토리에서 배포된 WAR 파일을 추출하는 `before_migrate.rb`라는 Ruby 애플리케이션의 예제입니다. 이 이름은 애플리케이션을 Checkout 배포 후크에 연결하므로 코드가 검사 후 마이그레이션 전에 배포 작업이 시작될 때 애플리케이션이 실행됩니다. 이 예제를 사용하는 방법에 대한 자세한 정보는 [Chef 배포 후크 사용](workingcookbook-extend-hooks.md)를 참조하세요.

```
::Dir.glob(::File.join(release_path, '*.war')) do |archive_file|
  execute "unzip_#{archive_file}" do
    command "unzip #{archive_file}"
    cwd release_path
  end
end
```

**참고**  
JSP 앱에 업데이트를 배포하면 Tomcat이 업데이트를 인식하지 못하고 기존 앱 버전을 계속 실행할 수 있습니다. 예를 들어 JSP 페이지만 포함된 .zip 파일로 앱을 배포하는 경우, 이런 현상이 생길 수 있습니다. Tomcat이 가장 최근에 배포된 버전을 실행하도록 하려면 `web.xml` 파일이 포함된 WEB-INF 디렉터리가 프로젝트의 루트 디렉터리에 포함되어야 합니다. `web.xml` 파일에는 다양한 콘텐츠가 포함될 수 있지만 Tomcat이 업데이트를 인식하고 현재 배포된 앱 버전을 실행하도록 하는 데는 다음으로 충분합니다. 각 업데이트의 버전을 변경할 필요는 없습니다. Tomcat은 버전이 변경되지 않은 경우에도 업데이트를 인식합니다.  

```
<context-param>
  <param-name>appVersion</param-name>
  <param-value>0.1</param-value>
</context-param>
```

**Topics**
+ [JSP 앱 배포](#layers-java-deploy-jsp)
+ [백엔드 데이터베이스를 사용하여 JSP 앱 배포](#layers-java-deploy-jsp-db)

## JSP 앱 배포
<a name="layers-java-deploy-jsp"></a>

JSP 앱을 배포하려면 이름 및 리포지토리 정보를 지정합니다. 필요한 경우, 도메인 및 SSL 설정도 지정할 수 있습니다. 앱을 생성하는 방법에 대한 자세한 정보는 [앱 추가](workingapps-creating.md) 단원을 참조하세요. 다음 절차에서는 퍼블릭 Amazon S3 아카이브에서 간단한 JSP 페이지를 생성하고 배포하는 방법을 살펴봅니다. 프라이빗 Amazon S3 아카이브 등 다른 리포지토리 유형을 사용하는 방법에 대해서는 [애플리케이션 소스](workingapps-creating.md#workingapps-creating-source) 단원을 참조하세요.

다음 예제는 단순히 일부 시스템 정보를 표시하는 JSP 페이지를 보여 줍니다.

```
<%@ page import="java.net.InetAddress" %>
<html>
<body>
<%
    java.util.Date date = new java.util.Date();
    InetAddress inetAddress = InetAddress.getLocalHost();
%>
The time is 
<%
    out.println( date );
    out.println("<br>Your server's hostname is "+inetAddress.getHostName());
%>
<br>
</body>
</html>
```

**참고**  
다음 절차에서는 스택 생성, 계층에 인스턴스 추가 등등의 기본적 내용에 이미 익숙하다고 가정합니다. OpsWorks Stacks를 처음 사용하는 경우 먼저 단원을 참조하십시오[Chef 11 Linux 스택 시작하기](gettingstarted.md).

**Amazon S3 아카이브에서 JSP 페이지를 배포하려면**

1. Java 앱 서버 계층으로 [스택을 생성하고](workingstacks-creating.md), 해당 계층에 [연중무휴 인스턴스를 추가한](workinginstances-add.md) 다음 [시작하세요](workinginstances-starting.md).

1. 코드를 `simplejsp.jsp` 파일에 복사하고 이 파일을 `simplejsp` 폴더에 저장한 다음 이 폴더의 `.zip` 아카이브를 생성합니다. 이름은 임의적이므로, 원하는 파일 또는 폴더 이름은 어떤 것이든 사용할 수 있습니다. 또한 gzip, bzip2, tarball 또는 Java WAR 파일을 비롯하여 다른 아카이브 유형을 사용할 수도 있습니다. OpsWorks Stacks는 압축되지 않은 tarball을 지원하지 않습니다. 여러 JSP 페이지를 배포하려면 배포하려는 페이지를 동일한 아카이브에 저장합니다.

1. 이 아카이브를 Amazon S3 버킷에 업로드하고 이 파일을 퍼블릭으로 설정합니다. 나중에 사용하기 위해 파일의 URL를 복사해 둡니다. 버킷 생성 및 파일 업로드 방법에 대한 자세한 내용은 [Amazon Simple Storage Service 시작하기](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)를 참조하세요.

1. 스택에 [앱을 추가](workingapps-creating.md#workingapps-creating-general)하고 다음 설정을 지정합니다.
   + **명칭** – `SimpleJSP`
   + **앱 유형** – `Java` 
   + **리포지토리 유형** – `Http Archive`
   + **리포지토리 URL** - 아카이브 파일의 Amazon S3 URL.

   나머지 설정에 대해서는 기본값을 사용하고 [**앱 추가**]를 클릭하여 앱을 생성합니다.

1. [앱을 Java 앱 서버 인스턴스에 배포합니다](workingapps-deploying.md).

이제 앱의 URL로 이동하여 앱을 볼 수 있습니다. 도메인을 지정하지 않았다면 인스턴스의 퍼블릭 IP 주소나 퍼블릭 DNS 이름을 사용하여 URL을 생성할 수 있습니다. 인스턴스의 퍼블릭 IP 주소 또는 퍼블릭 DNS 이름을 가져오려면 OpsWorks Stacks 콘솔로 이동하여 인스턴스 페이지에서 **인스턴스** 이름을 클릭하여 세부 정보 페이지를 엽니다.

나머지 URL은 앱의 짧은 이름, 즉 OpsWorks Stacks가 앱을 생성할 때 지정한 앱 이름에서 생성하는 소문자 이름에 따라 달라집니다. 예를 들어 SimpleJSP의 짧은 이름은 simplejsp입니다. 앱의 짧은 이름은 앱의 세부 정보 페이지에서 가져올 수 있습니다.
+ 짧은 이름이 `root`인 경우, `http://public_DNS/appname.jsp` 또는 `http://public_IP/appname.jsp`을 사용할 수 있습니다.
+ 그렇지 않으면 `http://public_DNS/app_shortname/appname.jsp` 또는 `http://public_IP/app_shortname/appname.jsp`을 사용할 수 있습니다.

앱에 도메인을 지정한 경우, URL은 `http://domain/appname.jsp`입니다.

예제의 URL은 `http://192.0.2.0/simplejsp/simplejsp.jsp`와 비슷합니다.

같은 인스턴스에 여러 앱을 배포하려면 `root`를 짧은 이름으로 사용해선 안 됩니다. 이 경우, URL 충돌로 앱이 정상 작동하지 않습니다. 대신 앱마다 각기 다른 도메인 이름을 할당하세요.

## 백엔드 데이터베이스를 사용하여 JSP 앱 배포
<a name="layers-java-deploy-jsp-db"></a>

JSP 페이지는 JDBC `DataSource` 객체를 사용하여 백엔드 데이터베이스에 연결할 수 있습니다. 이러한 앱은 이전 섹션의 절차와 연결을 설정하는 추가 단계를 사용하여 생성 및 배포할 수 있습니다.

다음 JSP 페이지는 `DataSource` 객체에 연결하는 방법을 보여 줍니다.

```
<html>
  <head>
    <title>DB Access</title>
  </head>
  <body>
    <%@ page language="java" import="java.sql.*,javax.naming.*,javax.sql.*" %>
    <%
      StringBuffer output = new StringBuffer();
      DataSource ds = null;
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      try {
        Context initCtx = new InitialContext();
        ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/mydb");
        con = ds.getConnection();
        output.append("Databases found:<br>");
        stmt = con.createStatement();
        rs = stmt.executeQuery("show databases");
        while (rs.next()) {
          output.append(rs.getString(1));
          output.append("<br>");
        }
      }
      catch (Exception e) {
        output.append("Exception: ");
        output.append(e.getMessage());
        output.append("<br>");
      }
      finally {
        try {
          if (rs != null) {
            rs.close();
          }
          if (stmt != null) {
            stmt.close();
          }
          if (con != null) {
            con.close();
          }
        }
        catch (Exception e) {
          output.append("Exception (during close of connection): ");
          output.append(e.getMessage());
          output.append("<br>");
        }
      }
    %>
    <%= output.toString() %>
  </body>
</html>
```

OpsWorks Stacks는 `DataSource` 객체를 생성 및 초기화하고, 논리적 이름에 바인딩하고, Java 이름 지정 및 디렉터리 인터페이스(JNDI) 이름 지정 서비스에 이름을 등록합니다. 완전한 논리적 이름은 `java:comp/env/user-assigned-name`입니다. 다음에서 설명하는 것처럼 사용자 지정 JSON 속성을 스택 구성 및 배포 속성에 추가함으로써 이름의 사용자 할당 부분을 지정하여 `['opsworks_java']['datasources']` 속성을 정의해야 합니다.

**MySQL 데이터베이스에 연결하는 JSP 페이지를 배포하려면**

1. Java 앱 서버 계층으로 [스택을 만들고](workingstacks-creating.md) 각 계층에 [연중무휴 인스턴스를 추가한](workinginstances-add.md) 다음 [시작합니다](workinginstances-starting.md).

1. 데이터베이스 계층을 스택에 추가합니다. 세부적인 사항은 사용하는 데이터베이스에 따라 달라집니다.

   예를 들어 MySQL 인스턴스를 사용하려면 [스택에 MySQL 계층을 추가하고](workinglayers-db-mysql.md), 이 계층에 [24/7 인스턴스를 추가한](workinginstances-add.md) 다음 [해당 인스턴스를 시작합니다](workinginstances-starting.md#workinginstances-starting-start).

   예를 들어 Amazon RDS(MySQL) 인스턴스를 시작하려면,
   + 인스턴스의 MySQL 데이터베이스 엔진을 지정합니다.
   + **AWS-OpsWorks-DB-Master-Server(*security\$1group\$1id*)** 및 **AWS-OpsWorks-Java-App-Server(*security\$1group\$1id*)** 보안 그룹을 인스턴스에 할당합니다. OpsWorks Stacks는 리전에서 첫 번째 스택을 생성할 때 이러한 보안 그룹을 생성합니다.
   + `simplejspdb`라는 데이터베이스를 생성합니다.
   + 마스터 사용자 이름 및 암호에는 Tomcat 오류를 일으킬 수 있는 `&` 또는 기타 문자가 포함되면 안 됩니다.

     특히, 시작 중에 Tomcat은 마스터 암호 및 사용자 이름이 포함된 XML 파일인 웹 앱 컨텍스트 파일을 구문 분석해야 합니다. 문자열 중 하나에 `&` 문자가 포함되어 있으면 XML 구문 분석기는 이 문자를 형식이 잘못된 XML 엔터티로 취급하여 구문 분석 예외가 발생해 Tomcat이 시작되지 않습니다. 웹 앱 컨텍스트 파일에 대한 자세한 정보는 [tomcat::context](create-custom-configure.md#create-custom-configure-context) 단원을 참조하세요.
   + [MySQL 드라이버를 Java 앱 서버 계층에 추가합니다](workingapps-connectdb.md).
   + 스택에 [RDS 인스턴스를 등록](workinglayers-db-rds.md#workinglayers-db-rds-register)합니다.

    OpsWorks Stacks에서 Amazon RDS 인스턴스를 사용하는 방법에 대한 자세한 내용은 섹션을 참조하세요[Amazon RDS 서비스 계층](workinglayers-db-rds.md).

1. 예제 코드를 `simplejspdb.jsp` 파일에 복사하고 이 파일을 `simplejspdb` 폴더에 저장한 다음 이 폴더의 `.zip` 아카이브를 생성합니다. 이름은 임의적이므로, 원하는 파일 또는 폴더 이름은 어떤 것이든 사용할 수 있습니다. 또한 gzip, bzip2 또는 tarball을 비롯하여 다른 아카이브 유형을 사용할 수도 있습니다. 여러 JSP 페이지를 배포하려면 배포하려는 페이지를 동일한 아카이브에 저장합니다. 다른 리포지토리 유형에서 앱을 배포하는 방법은 [애플리케이션 소스](workingapps-creating.md#workingapps-creating-source) 단원을 참조하세요.

1. 이 아카이브를 Amazon S3 버킷에 업로드하고 이 파일을 퍼블릭으로 설정합니다. 나중에 사용하기 위해 파일의 URL를 복사해 둡니다. 버킷 생성 및 파일 업로드 방법에 대한 자세한 내용은 [Amazon Simple Storage Service 시작하기](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)를 참조하세요.

1. 스택에 [앱을 추가](workingapps-creating.md#workingapps-creating-general)하고 다음 설정을 지정합니다.
   + **명칭** – `SimpleJSPDB`
   + **앱 유형** – `Java`
   + **데이터 소스 유형** - **OpsWorks**(MySQL 인스턴스의 경우) 또는 **RDS**(Amazon RDS 인스턴스의 경우).
   + **데이터베이스 인스턴스** - 앞서 생성한 MySQL 인스턴스(이름: **db-master1(mysql)**) 또는 Amazon RDS 인스턴스(이름: ***DB\$1instance\$1name* (mysql)**).
   + **데이터베이스 이름** – `simplejspdb`.
   + **리포지토리 유형** – `Http Archive`
   + **리포지토리 URL** - 아카이브 파일의 Amazon S3 URL.

   나머지 설정에 대해서는 기본값을 사용하고 [**앱 추가**]를 클릭하여 앱을 생성합니다.

1. 스택 구성 속성에 다음 사용자 지정 JSON 속성을 추가합니다. 여기서 simplejspdb는 앱의 짧은 이름입니다.

   ```
   {
     "opsworks_java": {
       "datasources": {
         "simplejspdb": "jdbc/mydb" 
       }
     }
   }
   ```

   OpsWorks Stacks는이 매핑을 사용하여 필요한 데이터베이스 정보가 포함된 컨텍스트 파일을 생성합니다.

   스택 구성 속성에 사용자 지정 JSON 속성을 추가하는 방법은 [사용자 지정 JSON 사용](workingstacks-json.md) 단원을 참조하세요.

1. [앱을 Java 앱 서버 인스턴스에 배포합니다](workingapps-deploying.md).

이제 앱의 URL을 사용하여 앱을 볼 수 있습니다. URL 생성 방법에 대한 설명은 [JSP 앱 배포](#layers-java-deploy-jsp)를 참조하세요.

예제의 URL은 `http://192.0.2.0/simplejspdb/simplejspdb.jsp`와 비슷합니다.

**참고**  
`datasources` 속성에는 여러 속성이 포함될 수 있습니다. 각 속성은 앱의 짧은 이름으로 명명되며, 논리적 이름의 적절한 사용자 할당 부분으로 설정됩니다. 앱이 여러 개인 경우에는 별도의 논리적 이름을 사용할 수 있으며, 다음과 비슷한 사용자 지정 JSON이 필요합니다.  

```
{
  "opsworks_java": {
    "datasources": {
      "myjavaapp": "jdbc/myappdb",
      "simplejsp": "jdbc/myjspdb",
      ...
    }
  }
}
```