| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 정규식
- Java
- math
- list
- 자바스크립트
- 인텔리제이
- 스프링부트
- java테스트
- 단위테스트
- Array
- string
- 배열
- junit5
- CSS
- vscode
- Visual Studio Code
- SpringBoot
- HashMap
- 테스트자동화
- Eclipse
- 문자열
- IntelliJ
- html
- js
- javascript
- 자바문법
- input
- 자바
- junit
- ArrayList
- Today
- Total
어제 오늘 내일
[Spring Boot] "내 컴퓨터에선 되는데..." 지옥 탈출! Docker로 개발 환경 3분 만에 통일하기 본문
[Spring Boot] "내 컴퓨터에선 되는데..." 지옥 탈출! Docker로 개발 환경 3분 만에 통일하기
hi.anna 2026. 3. 23. 01:28
프로젝트를 시작할 때 가장 귀찮은 게 뭘까요? 바로 로컬 환경 세팅입니다.
MySQL 깔고, Redis 깔고, RabbitMQ 깔고... 버전 맞추고 포트 충돌 해결하다 보면 하루가 다 갑니다.
게다가 팀원 A는 윈도우, 팀원 B는 맥(Mac)을 쓴다면? "제 컴퓨터에선 되는데요?"라는 핑계가 난무하게 되죠.
오늘은 이 모든 문제를 Docker(도커)와 Docker Compose(도커 컴포즈)로 한 방에 해결하는 법을 알아보겠습니다.
1. 도커(Docker)가 뭔가요? (도시락 비유)
도커는 프로그램을 컨테이너(Container)라는 격리된 상자에 담는 기술입니다.
- 기존 방식: 내 컴퓨터에 MySQL 설치 (내 OS 설정에 영향받음)
- 도커 방식: MySQL이 완벽하게 세팅된 '도시락(Image)'을 다운받아서 뚜껑만 엶. (내 OS와 상관없이 항상 똑같이 동작)
즉, "서버를 파일(Code)로 관리한다"는 혁명적인 개념입니다.
2. 내 코드를 도시락으로 싸기:
먼저 우리가 만든 스프링 부트 프로젝트를 도커 이미지로 만들어야 합니다. 프로젝트 루트에 Dockerfile이라는 이름으로 파일을 만드세요.
# 1. 베이스 이미지 (자바 17이 깔린 리눅스를 쓰겠다)
FROM openjdk:17-jdk-slim
# 2. 작업 폴더 생성
WORKDIR /app
# 3. 빌드된 Jar 파일을 컨테이너 안으로 복사
# (미리 ./gradlew build로 빌드해둬야 함)
COPY build/libs/*.jar app.jar
# 4. 컨테이너가 시작될 때 실행할 명령어
ENTRYPOINT ["java", "-jar", "app.jar"]
이제 docker build -t my-server . 명령어를 치면, 내 스프링 서버가 하나의 이미지(파일)로 구워집니다.
3. 오케스트라 지휘자:
하지만 서버만 띄우면 되나요? DB도 필요하고 Redis도 필요하죠.
이 여러 개의 컨테이너를 한 번에 실행하고 관리해 주는 도구가 바로 Docker Compose입니다.
프로젝트 루트에 docker-compose.yml을 만듭니다.
version: '3.8'
services:
# 1. 우리 스프링 서버
app:
build: . # 현재 폴더의 Dockerfile로 빌드해라
ports:
- "8080:8080"
environment:
# ★ 중요! localhost가 아니라 서비스 이름(db)을 씀
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb
SPRING_REDIS_HOST: redis
depends_on:
- db
- redis
# 2. MySQL 데이터베이스
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- ./db_data:/var/lib/mysql # 데이터가 날아가지 않게 로컬에 저장
# 3. Redis 캐시 서버
redis:
image: redis:alpine
ports:
- "6379:6379"
4. 마법의 명령어:
이제 터미널을 열고 딱 한 줄만 입력하세요.
$ docker-compose up -d
결과:
- MySQL과 Redis 이미지를 다운로드받습니다.
- 스프링 부트를 빌드해서 이미지로 만듭니다.
- 세 개의 컨테이너를 동시에 실행하고, 서로 네트워크를 연결해 줍니다.
이제 신규 입사자가 오면 이렇게 말하면 됩니다.
"Git Clone 받으시고, 도커 깐 다음 docker-compose up 치세요. 끝입니다." (커피 한 잔 마시고 오면 완료되어 있음) ☕️
5. 주의사항: 대신 서비스 이름!
도커 컴포즈 안에서는 서로가 독립된 컴퓨터처럼 동작합니다.
그래서 스프링 설정(application.yml)에서 DB 주소를 적을 때 localhost라고 적으면 안 됩니다. (컨테이너 안에서의 localhost는 자기 자신을 의미하니까요.)
대신 docker-compose.yml에 적은 서비스 이름(db, redis)이 호스트 이름이 됩니다.
# application.yml 예시
spring:
datasource:
url: jdbc:mysql://db:3306/mydb # localhost (X) -> db (O)
data:
redis:
host: redis # localhost (X) -> redis (O)
마치며
오늘의 결론입니다.
- Docker는 실행 환경을 파일로 정의해서 "어디서든 똑같이" 실행되게 한다.
- Docker Compose를 쓰면 DB, Redis 등 여러 인프라를 한 번에 띄울 수 있다.
- 로컬 개발 환경 구축 시간을 3일에서 3분으로 단축할 수 있다.
이제 환경 설정 때문에 스트레스받지 마세요. 개발자는 비즈니스 로직에만 집중해야 합니다.
다음 포스팅에서는 "자바가 이렇게 편해졌다고?" Java 17/21의 신기능(Record, Switch Expression 등)을 다루며 모던 자바 개발자로 거듭나 보겠습니다.
도움이 되셨다면 좋아요와 댓글 부탁드립니다! 😊
