저번 글에 이어서 Spring boot에 Docker-Compose를 적용하기로 했다.
1. spring boot에 docker를 적용하게된 계기
1. 팀원들과 작업시간이 겹치면 작업 충돌이 일어나 데이터 무결성을 위반한다.
2. Spring boot MySQL Connector 설정에 따라 database가 초기화될 수 있다. 물론 백업은 해두었지만 매번 해주는 것은 번거롭다.
3. 집 컴퓨터를 종료하면 팀원들이 개발할 수 없다. 이를 위해 24시간 컴퓨터를 켜두긴 했지만, 가끔씩은 꺼주어야하기 때문에 개발하기엔 부적절한 환경이다.
이전글: Spring boot 프로젝트를 위한 mysql 서버에 테스트 데이터 로드
2. Docker를 선택한 이유
- 일관된 개발 환경 제공:
Docker는 애플리케이션과 그 의존성을 컨테이너화하여 개발, 테스트, 프로덕션 환경 간의 차이를 최소화한다. Docker 컨테이너는 모든 환경에서 동일하게 실행되므로, "내 로컬에서는 잘 되는데 서버에서는 안 된다"와 같은 문제가 줄어든다.
- 의존성 격리:
Docker 컨테이너는 각자 고유한 파일 시스템을 가지고 있어, 시스템 전역의 라이브러리나 설정에 영향을 받지 않고 독립적으로 실행된다. 따라서 여러 프로젝트가 서로 다른 버전의 라이브러리를 요구하는 경우에도 충돌 없이 사용할 수 있다.
- 이동성과 배포의 용이성:
Docker 이미지는 특정 환경에 종속되지 않으며, 어디서든 동일하게 실행될 수 있다. 이를 통해 로컬 개발 환경에서의 작업 결과를 쉽게 다른 팀원에게 공유하거나, 테스트 환경 또는 프로덕션 환경에 배포할 수 있다.
Docker 이미지를 기반으로 CI/CD 파이프라인을 설정하면, 애플리케이션을 자동으로 빌드하고 배포하는 과정을 쉽게 자동화할 수 있다.
- 빠른 설정 및 확장성:
개발자는 복잡한 설정 없이 Docker 이미지를 통해 필요한 개발 환경을 즉시 설정할 수 있다. 이것은 새로운 팀원이 프로젝트에 합류할 때 특히 유용하다.
Docker Compose와 같은 도구를 사용하면 다중 컨테이너 애플리케이션을 정의하고, 로컬에서 복잡한 분산 시스템 환경을 쉽게 설정할 수 있다.
- 자원 효율성:
Docker는 가상 머신보다 경량이며, 동일한 호스트에서 여러 컨테이너를 동시에 실행할 수 있다. 이는 리소스의 효율적인 사용을 가능하게 하며, 개발 환경에서 여러 가지 테스트를 동시에 수행할 수 있다.
- 개발 및 프로덕션 간의 격리:
개발 환경에서의 실험적 작업이나 테스트가 프로덕션 환경에 영향을 미치지 않도록 격리할 수 있다. 이는 안정성을 유지하면서도 빠른 개발을 가능하게 한다.
2. spring boot docker-compose 종속성
developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
개발할 때만 실행할 것이기 때문에 developmentOnly 예약어 사용
3. docker-compose-dev.yml 파일 작성
services:
mysql:
image: mysql:8.3
container_name: mysql-container
ports:
- 43305:3306
volumes:
- ../mysql/data:/var/lib/mysql
- ../mysql/init:/docker-entrypoint-initdb.d
command:
- '--character-set-server=utf8mb4'
- '--collation-server=utf8mb4_unicode_ci'
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
설정은 본인이 원하는대로 변경하면 된다.
4. application-dev.properties
# docker-compose
spring.docker.compose.file=./docker/docker-compose-dev.yml
spring.docker.compose.lifecycle-management=start-and-stop
docker-compose.yml 파일의 경로와 lifecycle을 설정할 수 있다. 이 외에도 몇가지 더 있지만 두 개만 설정해도 충분했다.
5. Spring boot 실행
Spring boot 서버를 실행하면 자동으로 docker-compose-dev.yml 파일 설정대로 docker가 실행되고 종료하면 같이 종료된다.
6. 마침
Spring Framework는 사용하면 사용할수록 정말 잘 만든 프레임워크라는 것을 몸소 느낄 수 있다. docker 관련 종속성이 있을거라곤 생각 못했는데 아주 당연하다는 듯이 존재하고 있어서 감탄했다.