Skip to content

WAR

Ktor 애플리케이션은 Tomcat 및 Jetty를 포함한 서블릿 컨테이너 내에서 실행하고 배포할 수 있습니다. 서블릿 컨테이너 내에 배포하려면 WAR 아카이브를 생성한 다음, WAR을 지원하는 서버 또는 클라우드 서비스에 배포해야 합니다.

이 토픽에서는 다음 방법을 보여드립니다:

  • 서블릿 애플리케이션에서 Ktor를 사용하도록 구성하는 방법;
  • WAR 애플리케이션 실행 및 패키징을 위한 Gretty 및 War 플러그인을 적용하는 방법;
  • Ktor 서블릿 애플리케이션을 실행하는 방법;
  • WAR 아카이브를 생성하고 배포하는 방법.

서블릿 애플리케이션에서 Ktor 구성

Ktor를 사용하면 애플리케이션 내에서 바로 원하는 엔진(Netty, Jetty 또는 Tomcat 등)으로 서버를 생성하고 시작할 수 있습니다. 이 경우 애플리케이션은 엔진 설정, 연결 및 SSL 옵션을 제어할 수 있습니다.

위 접근 방식과 달리, 서블릿 컨테이너는 애플리케이션 라이프사이클 및 연결 설정을 제어해야 합니다. Ktor는 애플리케이션에 대한 제어 권한을 서블릿 컨테이너에 위임하는 특별한 ServletApplicationEngine 엔진을 제공합니다.

참고: Ktor 애플리케이션이 서블릿 컨테이너 내에 배포될 때는 연결 및 SSL 설정이 적용되지 않습니다. tomcat-war-ssl 샘플은 Tomcat에서 SSL을 구성하는 방법을 보여줍니다.

의존성 추가

서블릿 애플리케이션에서 Ktor를 사용하려면 빌드 스크립트에 ktor-server-servlet-jakarta 아티팩트를 포함해야 합니다:

Kotlin
Groovy
XML

Tomcat/Jetty 9.x 또는 이전 버전을 사용하는 경우, 대신 ktor-server-servlet 아티팩트를 추가하세요.

참고: Ktor 애플리케이션이 서블릿 컨테이너 내에 배포될 때는 별도의 Jetty 또는 Tomcat 아티팩트가 필요하지 않습니다.

서블릿 구성

애플리케이션에 Ktor 서블릿을 등록하려면 WEB-INF/web.xml 파일을 열고 servlet-class 속성에 ServletApplicationEngine를 할당합니다:

xml
<servlet>
    <display-name>KtorServlet</display-name>
    <servlet-name>KtorServlet</servlet-name>
    <servlet-class>io.ktor.server.servlet.jakarta.ServletApplicationEngine</servlet-class>
    <init-param>
        <param-name>io.ktor.ktor.config</param-name>
        <param-value>application.conf</param-value>
    </init-param>
    <async-supported>true</async-supported>
</servlet>
XML

그 다음, 이 서블릿의 URL 패턴을 구성합니다:

xml
<servlet-mapping>
    <servlet-name>KtorServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Gretty 구성

Ktor 3.3.0은 Gretty에서 아직 지원되지 않는 Jetty 12를 필요로 합니다. 개발 또는 배포에 Gretty를 사용하는 경우, Gretty가 Jetty 12 지원을 추가할 때까지 Ktor 3.2.3을 대신 사용하세요.

Gretty 플러그인을 사용하면 Jetty 및 Tomcat에서 서블릿 애플리케이션을 실행할 수 있습니다. 이 플러그인을 설치하려면 build.gradle.kts 파일을 열고 plugins 블록에 다음 코드를 추가하세요:

groovy
plugins {
    id("org.gretty") version "4.1.7"
}

그런 다음, 다음과 같이 gretty 블록에서 이를 구성할 수 있습니다:

groovy
gretty {
    servletContainer = "jetty11"
    contextPath = "/"
    logbackConfigFile = "src/main/resources/logback.xml"
}
groovy
gretty {
    servletContainer = "tomcat10"
    contextPath = "/"
    logbackConfigFile = "src/main/resources/logback.xml"
}

마지막으로, run 태스크를 구성합니다:

groovy
afterEvaluate {
    tasks.getByName("run") {
        dependsOn("appRun")
    }
}

War 구성

War 플러그인을 사용하면 WAR 아카이브를 생성할 수 있습니다. build.gradle.kts 파일의 plugins 블록에 다음 줄을 추가하여 설치할 수 있습니다:

groovy
plugins {
    id("war")
}

애플리케이션 실행

구성된 Gretty 플러그인을 사용하여 run 태스크를 통해 서블릿 애플리케이션을 실행할 수 있습니다. 예를 들어, 다음 명령은 jetty-war 예시를 실행합니다:

Bash
./gradlew :jetty-war:run

WAR 아카이브 생성 및 배포

War 플러그인을 사용하여 애플리케이션으로 WAR 파일을 생성하려면 war 태스크를 실행합니다. jetty-war 예시의 경우, 명령은 다음과 같습니다:

Bash
./gradlew :jetty-war:war

jetty-war.war 파일은 build/libs 디렉토리에 생성됩니다. 생성된 아카이브를 jetty/webapps 디렉토리로 복사하여 서블릿 컨테이너 내에 배포할 수 있습니다. 예를 들어, 아래 Dockerfile은 생성된 WAR을 Jetty 또는 Tomcat 서블릿 컨테이너 내에서 실행하는 방법을 보여줍니다:

Docker
FROM jetty:11.0.25
EXPOSE 8080:8080
COPY ./build/libs/jetty-war.war/ /var/lib/jetty/webapps
WORKDIR /var/lib/jetty
CMD ["java","-jar","/usr/local/jetty/start.jar"]
Docker
FROM tomcat:10.1.41
EXPOSE 8080:8080
COPY ./build/libs/tomcat-war.war/ /usr/local/tomcat/webapps
WORKDIR /usr/local/tomcat
CMD ["catalina.sh", "run"]

전체 예시는 다음에서 찾을 수 있습니다: jetty-wartomcat-war.