‘내 컴퓨터에서는 작동한다’는 말에 작별: Docker를 사용한 Spring Boot와 PostgreSQL
Source: Dev.to
소개
Java 애플리케이션을 컨테이너화 공부를 시작했을 때, 가장 큰 이점은 단순히 애플리케이션을 패키징하는 것이 아니라 전체 환경을 코드로 만드는 것이라는 점이 명확해졌습니다. 이 글에서는 두 개의 파일만으로 Spring Boot + PostgreSQL 애플리케이션을 실행할 수 있는 방법을 보여줍니다. 로컬에 Java, 데이터베이스, 애플리케이션 서버를 설치할 필요가 없습니다.
백엔드 개발에서 흔히 겪는 문제
백엔드 작업을 하다 보면 최소한 다음 상황 중 하나는 경험했을 것입니다:
- “내 컴퓨터에서는 동작해”
- 환경마다 다른 Java 버전
- 수동으로 설정된 데이터베이스
- 새로운 팀원이 합류할 때 긴 설정 과정
컨테이너화는 바로 이 문제들을 해결합니다: 환경이 재현 가능하고 버전 관리될 수 있게 됩니다.
Dockerfile
# Dockerfile
FROM eclipse-temurin:17-jdk
WORKDIR /app
COPY target/app.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
Dockerfile이 정의하는 내용:
- 사용할 Java 버전 (
eclipse-temurin:17-jdk); - 컨테이너 안에서 애플리케이션이 위치할 경로 (
/app); - 애플리케이션을 시작하는 방법 (
java -jar app.jar).
docker‑compose.yml
# docker-compose.yml
version: "3.8"
services:
db:
image: postgres:15
environment:
POSTGRES_DB: appdb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
ports:
- "5432:5432"
app:
build: .
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/appdb
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: pass
depends_on:
- db
이 파일에서 정의하는 내용:
- PostgreSQL용 컨테이너 하나;
- Spring Boot 애플리케이션용 컨테이너 하나;
- 연결에 필요한 환경 변수;
- 서비스 간 통신 (
app이db에 의존).
모든 것을 한 번에 실행하려면 다음 명령을 사용합니다:
docker compose up
장점
- 환경 설정 문제가 사라집니다.
- 새로운 개발자 온보딩이 간단해집니다.
- CI/CD 파이프라인이 예측 가능해집니다.
- 인프라가 버전 관리되는 코드가 됩니다.
컨테이너화는 단순히 Docker에 국한되지 않습니다; 신뢰성, 이식성, 표준화에 관한 것입니다. 프로젝트 전체를 파일로 기술할 수 있게 되면 개발 수준이 한 단계 올라갑니다. 이 모델은 다음과 같은 기반이 됩니다:
- 마이크로서비스
- Kubernetes
- 클라우드 기반 최신 아키텍처
- 지속적 배포
그리고 모든 것은 Dockerfile과 docker-compose.yml 하나로 시작됩니다.