Docker를 이용한 로컬 배포 진행해보기
실제 사람들에게 배포할 때는, 도커 허브나, AWS 사용한다고 함...
배포
01. 배포란 무엇인가?
배포(Deployment)란 개발자가 작성한 코드를 실제 사용자가 접근할 수 있도록 서버에 올리는 과정입니다. 마치 여러분이 작성한 편지를 우체통에 넣어 상대방이 받을 수 있게 하는 것과 같습니다.
02. 간단한 배포 방법
a. 빌드 방법
빌드란 작성한 코드를 실행 가능한 파일로 변환하는 과정입니다. 마치 레시피(코드)를 실제 요리(실행 파일)로 만드는 것과 같습니다.
./gradlew build
위 명령어를 실행하면, /build/libs 폴더에 빌드된 파일이 생성됩니다.
i. 빌드파일 종류
파일 종류 설명 사용 예시
SNAPSHOT.jar | 배포용 파일. 실제 서비스를 실행할 때 사용합니다. | java -jar 파일명.jar |
SNAPSHOT-plain.jar | 라이브러리용 파일. 다른 프로젝트에서 이 코드를 불러와 사용할 때 활용합니다. | implementation files('SNAPSHOT-plain.jar') |
b. 빌드 파일 실행
빌드된 파일은 다음과 같이 실행할 수 있습니다:
java -jar 빌드파일이름
예시:
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar
03. 환경별 설정 파일 - Profiles
각 환경마다 다른 설정이 필요합니다. 예를 들어, 개발할 때는 로컬 데이터베이스를 사용하지만, 실제 운영 시에는 클라우드 데이터베이스를 사용해야 합니다.
a. 프로파일(Profile)이란?
프로파일은 Spring에서 서로 다른 환경에 맞게 설정을 분리하는 기능입니다. 로컬, 개발, 스테이지, 운영 등 각 환경에 맞는 설정을 별도로 관리할 수 있습니다.
b. application.properties 파일 구성하기
프로젝트의 src/main/resources 폴더에 다음 파일들을 생성합니다:
- application.properties (공통 설정)
- application-local.properties (로컬 환경 설정)
- application-dev.properties (개발 환경 설정)
- application-prod.properties (운영 환경 설정)
c. 공용 설정 파일: application.properties
기본 설정을 정의합니다:
# 기본 설정
spring.profiles.active=local
spring.application.name=basic-application
# 로깅 설정
logging.level.org.springframework=INFO
logging.level.com.example=DEBUG
d. Local 설정 파일: application-local.properties
로컬 개발 환경에서 사용할 설정:
# 데이터베이스 설정
spring.datasource.url=jdbc:mysql://localhost:3306/basic_db
spring.datasource.username=root
spring.datasource.password=Test1234!
# JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# 서버 포트 설정
server.port=8080
# 환경 표시용 커스텀 속성
app.environment=local
e. Prod 환경 설정 파일: application-prod.properties
실제 운영 환경에서 사용할 설정:
# 데이터베이스 설정
spring.datasource.url=jdbc:mysql://production-db-server:3306/prod_db
spring.datasource.username=prod_user
spring.datasource.password=ProdSecurePassword123!
# JPA 설정
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=false
# 서버 포트 설정
server.port=8000
# 환경 표시용 커스텀 속성
app.environment=production
f. 설정 적용 우선순위
설정이 중복될 경우, 다음 순서로 적용됩니다:
- 명령어(환경변수)
- application-{환경}.properties
- application.properties
g. build.gradle 구성하기
프로젝트 루트 디렉토리에 다음과 같이 build.gradle 파일을 작성합니다:
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
h. HomeController.java 작성하기
다음 코드를 작성하여 현재 실행 중인 환경을 웹 페이지에 표시해봅시다:
package com.example.basic.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
// application.properties에서 정의한 커스텀 속성 주입
@Value("${app.environment}")
private String environment;
@Value("${app.message}")
private String message;
@GetMapping("/")
public String home() {
return "<h1>Spring Boot 환경 테스트</h1>" +
"<p>현재 환경: <strong>" + environment + "</strong></p>" +
"<p>메시지: " + message + "</p>";
}
}
04. 프로파일을 활용한 배포 방법
a. IDE에서 로컬 환경으로 실행하기
IntelliJ IDEA에서 실행 구성을 설정하여 로컬 환경으로 실행할 수 있습니다
- 상단 메뉴에서 Run > Edit Configurations 선택
- Spring Boot 구성에서 Active profiles 필드에 local 입력
- Apply 후 OK 클릭
- 실행 버튼 클릭
b. 명령줄에서 환경 지정하여 실행하기
# 로컬 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=local
# 개발 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
# 스테이지 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=stage
# 운영 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
c. Docker를 사용한 운영 환경 배포
Docker를 사용하면 어떤 컴퓨터에서든 동일한 환경으로 애플리케이션을 실행할 수 있습니다.
Dockerfile 작성
프로젝트 루트 디렉토리에 Dockerfile을 생성합니다:
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/basic-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8000
# 기본값으로 prod 프로파일 사용
ENV SPRING_PROFILES_ACTIVE=prod
ENTRYPOINT ["java", "-jar", "app.jar"]
Docker 이미지 빌드
# 애플리케이션 빌드
./gradlew build
# Docker 이미지 빌드
docker build -t basic-app:latest .
Docker 컨테이너 실행
docker run -p 8000:8000 basic-app:latest
이제 브라우저에서 http://localhost:8000에 접속하면 "이 서버는 PRODUCTION 환경에서 실행 중입니다!" 메시지가 표시됩니다.
05. 프로파일을 활용한 배포 방법
a. IDE에서 로컬 환경으로 실행하기
IntelliJ IDEA에서 실행 구성을 설정하여 로컬 환경으로 실행할 수 있습니다:
- 상단 메뉴에서 Run > Edit Configurations 선택
- Spring Boot 구성에서 Active profiles 필드에 local 입력
- Apply 후 OK 클릭
- 실행 버튼 클릭
이렇게 실행하면 브라우저에서 http://localhost:8080에 접속했을 때 "이 서버는 LOCAL 환경에서 실행 중입니다!" 메시지가 표시됩니다.
b. 명령줄에서 환경 지정하여 실행하기
# 로컬 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=local
# 개발 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
# 스테이지 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=stage
# 운영 환경
java -jar build/libs/basic-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
c. Docker를 사용한 운영 환경 배포
Docker를 사용하면 어떤 컴퓨터에서든 동일한 환경으로 애플리케이션을 실행할 수 있습니다.
Dockerfile 작성
프로젝트 루트 디렉토리에 Dockerfile을 생성합니다:
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/basic-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8000
# 기본값으로 prod 프로파일 사용
ENV SPRING_PROFILES_ACTIVE=prod
ENTRYPOINT ["java", "-jar", "app.jar"]
Docker 이미지 빌드
# 애플리케이션 빌드
./gradlew build
# Docker 이미지 빌드
docker build -t basic-app:latest .
Docker 컨테이너 실행
docker run -p 8000:8000 basic-app:latest
이제 브라우저에서 http://localhost:8000에 접속하면 "이 서버는 PRODUCTION 환경에서 실행 중입니다!" 메시지가 표시됩니다.
06. 실습 - 환경별 배포 및 접속 테스트
이제 서로 다른 환경에서 애플리케이션을 실행하고 그 차이점을 확인해봅시다.
1. IDE에서 로컬 환경으로 실행
- IntelliJ IDEA에서 프로젝트를 열기
- Run > Edit Configurations 선택
- Active profiles에 local 입력
- 실행 버튼 클릭
- 브라우저에서 http://localhost:8080 접속
- "이 서버는 LOCAL 환경에서 실행 중입니다!" 메시지 확인
2. Docker로 운영 환경 배포
- 터미널에서 다음 명령어 실행:
# 애플리케이션 빌드
./gradlew build
# Docker 이미지 빌드
docker build -t basic-app:latest .
# Docker 컨테이너 실행
docker run -p 8000:8000 basic-app:latest
- 브라우저에서 http://localhost:8000 접속
- "이 서버는 PRODUCTION 환경에서 실행 중입니다!" 메시지 확인
7. 주요 차이점 정리
항목 로컬 환경 (IDE) 운영 환경 (Docker)
접속 URL | http://localhost:8080 | http://localhost:8000 |
데이터베이스 | 로컬 DB (basic_db) | 운영 DB (prod_db) |
메시지 | "LOCAL 환경에서 실행 중" | "PRODUCTION 환경에서 실행 중" |
JPA 설정 | ddl-auto: update (자동 스키마 업데이트) | ddl-auto: none (스키마 변경 없음) |