스프링 부트 앱은 war과 jar을 제공하며, 보통 jar로 출력하ㄴ다.
스프링 부트의 실행 가능한 jar을 빌드할 떄도 다양한 요구사항과 사용사례를 충독하는 배포 옵션이 많다는 거다.
스프링 부트 애플리케이션을 완전히 실행 가능한 JAR 파일로 패키징하는 것은 가장 일반적인 배포 방법이다.
JAR 파일에는 애플리케이션의 모든 종속성이 포함되어 있어, 단일 파일로 배포하고 실행할 수 있다.
pom.xml
spring-boot-maven-plugin을 사용하면 실행 가능한 JAR 파일을 생성할 수 있다.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myapp</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<dependencies>
<!-- 스프링 부트 스타터 종속성 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 기타 종속성 추가 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring-boot-maven-plugin은 Maven을 사용하여 스프링 부트 애플리케이션을 빌드할 때 필요한 플러그인다.
이 플러그인은 애플리케이션의 종속성을 포함하는 실행 가능한 JAR 파일을 생성한다.
JAR 파일을 빌드한 후, 다음 명령어를 사용하여 실행할 수 있다.
mvn clean package
java -jar target/myapp-1.0.0.jar
mvn clean package 명령어는 프로젝트를 빌드하여 target 디렉토리에 JAR 파일을 생성한다.
실행 가능한 JAR 파일에 다양한 설정을 추가하거나 확장할 수 있다.
이를 통해 특정 환경이나 요구 사항에 맞게 조정할 수 있다.
예를 들어, 애플리케이션의 런타임 구성을 설정하려면 application.properties 또는 application.yml 파일을 사용하면 된다.
application.properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
erver.port는 애플리케이션이 수신할 포트를 설정한다.
spring.datasource.url은 데이터베이스 연결 URL을 설정한다.
애플리케이션을 실행할 때 외부 설정 파일을 지정하여 환경에 따라 다르게 설정할 수 있다.
java -jar target/myapp-1.0.0.jar --spring.config.location=file:/path/to/config/
–spring.config.location 옵션을 사용하여 외부 설정 파일의 경로를 지정한다.
스프링 부트 애플리케이션을 컨테이너화하면 애플리케이션을 다양한 환경에서 일관되게 실행할 수 있다.
Docker를 사용하여 애플리케이션을 컨테이너로 패키징하고 배포하는 방법을 살펴보자.
애플리케이션을 Docker 컨테이너로 패키징하려면 Dockerfile을 작성하면 된다.
Dockerfile 예제
# 1. OpenJDK 이미지를 기반으로 설정
FROM openjdk:17-jdk-alpine
# 2. 애플리케이션 JAR 파일을 컨테이너에 복사
COPY target/myapp-1.0.0.jar /app/myapp.jar
# 3. 컨테이너 시작 시 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
FROM openjdk:17-jdk-alpine: JDK 17이 포함된 알파인 리눅스 이미지를 기반으로 한다.
COPY target/myapp-1.0.0.jar /app/myapp.jar: 애플리케이션 JAR 파일을 컨테이너의 /app 디렉토리로 복사한다.
ENTRYPOINT [“java”, “-jar”, “/app/myapp.jar”]: 컨테이너가 시작될 때 JAR 파일을 실행한다.
Docker 이미지를 빌드하고 실행하는 방법은 다음과 같다.
docker build -t myapp .
docker run -p 8080:8080 myapp
docker build -t myapp .: 현재 디렉토리의 Dockerfile을 사용하여 myapp이라는 이름의 Docker 이미지를 생성.
docker run -p 8080:8080 myapp: 생성된 Docker 이미지를 실행하며, 컨테이너의 8080 포트를 호스트의 8080 포트에 매핑.
애플리케이션의 실행에 필요한 모든 것을 포함하는 파일 시스템 스냅샷
여기에는 애플리케이션 코드, 라이브러리, 종속성, 환경 변수, 설정 파일, 그리고 애플리케이션 실행을 위한 실행 파일이 포함된다.
이러한 이미지는 컨테이너 런타임(예: Docker)이 실행 가능한 컨테이너를 생성하는 데 사용된다.
구성 요소
이미지의 장점
일관성 환경의 일관성: 동일한 컨테이너 이미지를 사용하여 개발, 테스트, 그리고 프로덕션 환경에서 일관된 실행 환경을 보장.
격리 애플리케이션 격리: 컨테이너는 애플리케이션을 다른 컨테이너와 격리하여 실행하므로, 애플리케이션 간의 충돌을 방지.
통합 개발 환경(IDE)에서 Docker 이미지를 생성하고 관리하면 개발 과정에서 편리하게 사용할 수 있다.
IntelliJ IDEA에서 Docker 설정
Docker 플러그인 설치: IntelliJ IDEA에서 Docker 플러그인을 설치. Settings -> Plugins에서 “Docker”를 검색하여 설치하면 됨.
Docker 서버 설정: Docker 서버에 연결하려면 Settings -> Build, Execution, Deployment -> Docker에서 Docker 서버를 추가합니다.
Dockerfile 생성 및 빌드
프로젝트의 루트 디렉토리에 Dockerfile을 추가.
IntelliJ IDEA에서 Docker 탭을 열고, + 버튼을 클릭하여 새로운 Docker 이미지 빌드를 설정.
이미지 실행: 빌드된 이미지를 IntelliJ IDEA의 Docker 탭에서 직접 실행할 수 있다.
IDE 내에서 Docker를 설정하면, 개발 중에도 실시간으로 컨테이너화된 애플리케이션을 테스트할 수 있습니다.
애플리케이션의 검증 및 테스트를 위해 유틸리티 컨테이너 이미지를 사용할 수 있다.
이러한 도구들은 애플리케이션의 품질과 성능을 보장하는 데 도움을 준다.
검사 도구에는 다음과 같은 것이 있다.
Docker-compose를 통한 테스트 환경 설정
docker-compose를 사용하여 복잡한 테스트 환경을 설정할 수 있다.
docker-compose.yml 예제
version: '3'
services:
web:
image: myapp:latest
ports:
- "8080:8080"
selenium:
image: selenium/standalone-chrome
ports:
- "4444:4444"
jmeter:
image: justbrittany/jmeter
volumes:
- ./tests:/tests
entrypoint: jmeter -n -t /tests/testplan.jmx -l /tests/results.jtl
web 서비스는 애플리케이션 컨테이너를 정의
selenium 서비스는 Selenium을 실행하여 웹 애플리케이션의 UI 테스트를 지원
jmeter 서비스는 JMeter를 사용하여 성능 테스트를 수행합니다. tests 디렉토리에서 테스트 계획 파일과 결과 파일을 다룬다.
팩(Pack)은 애플리케이션을 컨테이너화하는 간단하고 표준화된 방법을 제공한다.
Cloud Native Buildpacks를 사용하여 애플리케이션을 컨테이너 이미지로 변환할 수 있다.
다이브(Dive)는 Docker 이미지를 분석하고 최적화하는 도구이다.
이미지를 시각적으로 분석하고 불필요한 레이어를 식별하는 데 도움을준다.
이 글을 마지막으로, 스프링부트는 마치겠다.