> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ale.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Spring Boot(JVM)

> Java / Kotlin 언어로 작성된 Spring Boot 애플리케이션 배포 가이드입니다.

***

## 준비 및 확인사항

<AccordionGroup>
  <Accordion title="지원 JDK 버전">
    | Spring Boot 버전  | 지원하는 JDK 버전 |
    | --------------- | ----------- |
    | Spring Boot 3.x | JDK 17 이상   |
    | Spring Boot 2.x | JDK 8 이상    |
  </Accordion>
</AccordionGroup>

<Warning>
  프로젝트 설정 파일(pom.xml, build.gradle 등)에 명시된 JDK 버전과 배포 설정 시 선택한 JDK 버전이 일치하지 않으면 빌드 오류가 발생할 수 있습니다.
</Warning>

<Tip>
  기본적으로 JAR 형태의 빌드 산출물 및 스크립트를 지원하며, WAR의 경우 Executable WAR에 한하여 지원합니다.
</Tip>

## 템플릿과 저장소 선택

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/springboot_02.png" />
</Frame>

> 대시보드의 <Icon icon="circle-plus" iconType="solid" size={15} color="2396F1" /> 또는 `⌘ + K` 로 생성되는 배포창에서 Java 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하거나 [Git URL 탭에서 Git 저장소 URL을 입력하세요.](/ko/developers/private-repo)

## 배포 설정값 입력

> 다음의 각 항목에 서비스를 배포하기 위한 설정값을 입력하세요.

<AccordionGroup>
  <Accordion title="기본 항목">
    * **버전**
    * [환경 변수](/ko/developers/env)
    * [포트번호](/ko/developers/port)
    * **Start Command**
    * [Health Check](/ko/developers/zero-downtime-deployment)
  </Accordion>

  <Accordion title="더 많은 옵션">
    * **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
    * **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
    * **Pre-built jar file path**: 사전에 빌드되어 저장소에 반영되어 있는 jar 파일 경로
    * **Build Command**: gradle/maven 빌드 명령어
    * **Include files in build**: 빌드 시 추가할 파일 혹은 디렉토리
    * **Update strategy**
      * **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
      * **Recreate**: 모든 서비스 종료 후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
  </Accordion>
</AccordionGroup>

## 성능(리소스) 설정 및 배포

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/08_04.png" />
</Frame>

* **리소스 유형** : [온디맨드 리소스와 스팟 리소스](/ko/developers/resource#on-demand-spot) 중 선택

* **CPU** : 서비스가 사용할 수 있는 vCPU 리소스의 최대값으로, '최소' 선택 시 0.1 vCPU로 설정됩니다.

* **메모리** : 서비스가 사용할 수 있는 메모리 리소스의 최대값

* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보

* **배포** : `배포하기` 클릭

<Info>
  배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
</Info>

<Tip>
  리소스 제한으로 배포할 수 없는 경우 [스페이스 및 리소스 관리 페이지](/ko/operations/spaces#%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%B6%80%EC%97%AC%ED%95%98%EA%B8%B0)를 참고해 스페이스에 리소스를 추가하세요.
</Tip>

## 고급 설정 기능

### 저장소 내 Jar 파일 배포

* Spring Boot Jar 파일을 저장소에 반영하고 배포하는 경우, 배포 설정창의 **Pre-built jar file path** 필드에 각 빌드도구에 맞는 jar파일의 경로를 입력하고 배포를 진행합니다.
  * **Gradle**: `build/libs/[프로젝트명].jar`
  * **Maven**: `target/[프로젝트명].jar`

### 빌드 시 특정 리소스 경로 포함

* `ale` 에서 Spring Boot 프로젝트를 배포하는 경우, 정적 리소스 위치로 `WebProperties.Resources`에 정의된 `/static` 등을 제외한 `src` 디렉토리의 파일은 빌드 시 포함되지 않습니다. <br />
  프로젝트에서 특정 경로의 리소를 참조하는 경우 배포 설정창의 **Include files in build** 필드에 해당 디렉토리 경로를 작성하고 배포하면 됩니다.
  구분자 쉼표(`,`)를 사용하여 복수의 디렉토리를 포함시킬 수 있습니다.

### 멀티모듈 어플리케이션 배포

* 여러 개의 모듈로 이루어진 Spring Boot 어플리케이션을 배포하는 경우 몇 가지의 작업이 필요합니다.
  간단한 예시를 통해 배포 방법을 안내드립니다.

  ```plain theme={null}
  project-root/
    ├── build.gradle.kts
    ├── settings.gradle.kts
    ├── api/
    │   ├── build.gradle.kts
    │   └── src/
    │       └── main/
    │           ├── kotlin/
    │           └── resources/
    ├── core/
    │   ├── build.gradle.kts
    │   └── src/
    │       └── main/
    │           ├── kotlin/
    │           └── resources/
    └── gradle/
        └── wrapper/
            ├── gradle-wrapper.jar
            └── gradle-wrapper.properties
  ```

  * `api`, `core` 모듈로 구성하고 `api`를 main class로 지정

  <Figure className="mt-5 mb-4" src="https://files.cloudtype.io/ale-docs/quickstart/springboot/deployment-3.png" size="3xl" />

  <Figure className="mt-5 mb-12" src="https://files.cloudtype.io/ale-docs/quickstart/springboot/deployment-4.png" size="3xl" />

  * Spring Boot 템플릿 선택 후 다음의 설정 적용
    * **Start command**: `java -jar api/build/libs/api-0.0.1-SNAPSHOT.jar`
      * `java -jar`의 인수로 `<main 모듈명>/build/libs/<main 모듈명>-0.0.1-SNAPSHOT.jar`
    * **Include files in build**: `core,api`
      * 모듈의 디렉토리명을 쉼표로 구분하여 입력

***

[Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/html/index.html)
