# Spring Boot

### 1. 개요

***

> Spring Boot는 새로운 Spring 애플리케이션의 부트스트랩과 개발을 간소화하도록 설계된 Spring 에코시스템의 강력한 프레임워크입니다. Spring Boot 프레임워크는 웹 애플리케이션 개발에 필요한 즉시 사용 가능한 기능을 다양하게 제공하여 코딩 시간을 최소화하고 생산성을 높이는 것을 목표로 합니다.

Spring Boot의 경우 현재 Spring Boot 2와 Spring Boot 3을 지원합니다. \
Spring Boot 2는 JDK 11과 JDK17 버전을 선택하여 빌드 및 배포가 가능하며\
Spring Boot 3은 JDK 17 버전만 가능합니다.&#x20;

AppPaaS에서는 Gradle Wrapper와 Maven Wrapper를 기반으로 빌드를 하고 있습니다. \
즉, 소스 내에 Gradle Wrapper 또는 Maven Wrapper가 없는 경우 빌드가 되지 않고 실패합니다.

Spring Initializr 또는 IDE를 사용하여 소스를 생성하는 경우 \
대부분 Wrapper가 포함되어 있는 형태로 생성되지만 별도로 추가가 필요한 경우에는 \
아래 문서를 확인하여 작업합니다.

Gradle Wrapper Doc : <https://docs.gradle.org/current/userguide/gradle_wrapper.html>\
Maven Wrapper Doc : <https://maven.apache.org/wrapper/>

빌드 시 jar 파일은 server.jar로 이름이 변경되며 해당 이름으로 배포되어 실행됩니다.&#x20;

Spring Boot 사용 시 빌드 및 배포 관련 설정은 각각 다음과 같습니다.

### **2. 서비스 환경설정**

***

<figure><img src="https://1281168261-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F69bJtwnfn269Dqzr8gks%2Fuploads%2Fh2tsUaA9mauNc6sf8rR5%2Fimage.png?alt=media&#x26;token=4dd55cce-2598-44d3-aa6c-4b4fb053b638" alt=""><figcaption><p>서비스 생성을 위한 화면</p></figcaption></figure>

* **내부 포트**\
  서비스가 배포된 후 리슨(listen)되는 포트를 의미합니다. \
  일반적으로 Spring 웹 애플리케이션 생성 시 8080 포트가 사용되며 소스 내에서 \
  해당 포트를 변경했을 경우 변경한 값을 입력해 주어야 합니다. \
  AppPaaS 베타에서는 해당 포트를 기반으로 TCP 헬스 체크를 합니다.<br>
* **외부 포트, 외부 포트 공개 여부**\
  서비스를 퍼블릭으로 오픈할지 여부를 결정하는 설정입니다. \
  기본으로 443, 오픈으로 설정되어 있으며 오픈 설정 시 외부 도메인이 할당되어 \
  https\://{할당된 주소}를 통해 외부에서 접근할 수 있습니다. \
  비공개로 설정할 경우 외부에서 접근이 불가능하며 내부 도메인 주소로 서비스 간 통신만 지원됩니다.<br>
* **자동 배포 설정**\
  자동 배포를 설정하면 리포지터리의 선택한 브랜치에 변경이 생길 경우 \
  변경에 대한 훅(hook)을 받아 자동으로 빌드 및 배포가 진행됩니다.&#x20;

### **3. 고급 환경 설정**

***

* **빌드 명령어**\
  리포지터리를 선택하고 빌드 명령어를 오버라이드(override) 하지 않으면 gradlew로 실행됩니다.  \
  &#x20;이 경우 `gradlew clean build` 명령이 수행되며 maven 실행을 원하실 경우 \
  빌드 명령어를 오버라이드해서 `mvnw clean install` 를 기재해주세요. \
  둘 이외의 다른 명령어가 수행되길 원할 경우 해당 값을 직접 기재해서 오버라이드할 수 있습니다.

{% hint style="danger" %}
war 빌드는 지원하지 않습니다.

또한 고급 설정을 활용하여 동일 언어의 다른 프레임워크를 배포하는 것은 권장하지 않습니다.
{% endhint %}

* **시작 명령어**\
  앞서 설명한 것처럼 모든 jar 파일은 server.jar로 이름이 변경되기에\
  `java -jar server.jar` 명령어를 통해 실행됩니다. 해당 값 역시 오버라이드할 수 있습니다.<br>
* **환경 변수**\
  Key/Value 형태로 입력되며 입력된 값은 컨테이너 OS의 환경 변수로 주입됩니다.\
  주입된 환경 변수는 코드 내에서 System.getenv() 또는 System.getProperty()를 통해 \
  가져올 수 있습니다. 또한, 시작 명령어에서도 사용할 수 있습니다.\
  예를 들어 플레인 환경 변수를 KEY : <mark style="color:orange;">ENV</mark>, value : dev라고 정의했다면 \
  아래와 같이 시작 명령어로 사용할 수 있습니다. \
  \
  `java -jar server.jar -Dspring.profiles.active=`<mark style="color:orange;">`$ENV`</mark>
