어제 오늘 내일

[Spring Boot] "내 컴퓨터에선 되는데..." 지옥 탈출! Docker로 개발 환경 3분 만에 통일하기 본문

IT/SpringBoot

[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

결과:

  1. MySQL과 Redis 이미지를 다운로드받습니다.
  2. 스프링 부트를 빌드해서 이미지로 만듭니다.
  3. 세 개의 컨테이너를 동시에 실행하고, 서로 네트워크를 연결해 줍니다.

이제 신규 입사자가 오면 이렇게 말하면 됩니다.
"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)

마치며

오늘의 결론입니다.

  1. Docker는 실행 환경을 파일로 정의해서 "어디서든 똑같이" 실행되게 한다.
  2. Docker Compose를 쓰면 DB, Redis 등 여러 인프라를 한 번에 띄울 수 있다.
  3. 로컬 개발 환경 구축 시간을 3일에서 3분으로 단축할 수 있다.

이제 환경 설정 때문에 스트레스받지 마세요. 개발자는 비즈니스 로직에만 집중해야 합니다.
다음 포스팅에서는 "자바가 이렇게 편해졌다고?" Java 17/21의 신기능(Record, Switch Expression 등)을 다루며 모던 자바 개발자로 거듭나 보겠습니다.
도움이 되셨다면 좋아요와 댓글 부탁드립니다! 😊

반응형
Comments