토이프로젝트를 진행하던 중 프론트엔드 개발자 분들에게 테스트 API를 제공해줘야 하는 일이 발생한다. 프론트엔드 개발자 분들은 JVM이 설치되어 있지 않기 때문에 Docker를 이용하여 환경을 제공해준다.
프로젝트 크기가 작을 경우에는 단순하게 Spring Boot 프로젝트를 빌드해서 빌드된 파일들을 Github으로 같이 관리를 하였지만 규모가 커질수록 용량에 제한이 있었다.
이는 잘못된 판단이었고 도커 파일을 이용하여 자체적으로 빌드를 한 다음 docker-compose 명령어를 이용하여 실행하는게 맞는 방법이라 생각이 들었다.
spring:
profiles:
active: test
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: create
show-sql: true
h2:
console:
enabled: true
path: /h2
---
spring:
profiles: dev
datasource:
url: jdbc:postgresql://localhost:5432/dev_db
username: root
password: root
---
spring:
profiles: test
datasource:
url: jdbc:h2:mem:code-review;MODE=PostgreSQL
DB는 PostgreSQL을 사용하였다. 그리고 properties를 ---
를 이용하여 분할한다음 active로 test properties를 바라보게끔 세팅하였다. 이때 중요한 것은 test profiles에 datasource에 바로 PostgreSQL을 바라보는게 아닌 H2로 바라보게 끔 세팅한다. 이는 이후에 docker-compose에서 ENV로 세팅해준다.
FROM openjdk:11 AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootJAR
FROM openjdk:11
COPY --from=builder build/libs/*.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/app.jar"]
JAVA 11 버전을 기준으로 Dockerfile을 작성하였다. gradle 기반 프로젝트 이기 때문에 gradle과 빌드에 관련된 파일들을 컨테이너 내의 환경에 복사해두고 FROM
명령문을 이용하여 Docker 이미지를 중첩시켜서 빌드된 베이스 이미지를 기반으로 Spring Boot를 실행시킨다. 이때 port는 8081을 바라보게 한다. 이는 개발환경과 겹치지 않게 하기 위함이다.
version: "3"
services:
postgresql:
image: postgres
restart: always
container_name: postgres_test
environment:
POSTGRES_DB: test_db
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5433:5432"
networks:
- test_env
expose:
- 5433
backend:
container_name: backend
build: .
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://postgresql:5432/test_db
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: postgres
ports:
- "8081:8080"
depends_on:
- postgresql
networks:
- test_env
restart: unless-stopped
networks:
test_env:
driver: bridge
여기서 중요한 부분은 backend의 environment이다. docker-compose 내에 작성한 컨테이너 중 postgresql를 먼저 기억하자. application.yml에서 postgresql을 연결할 때 jdbc:postgresql://localhost:5432~
이런 식으로 연결을 하지만 컨테이너끼리 연결을 하기 때문에 jdbc:postgresql://postgresql:5432~
로 작성해야한다.
또한 이때 컨테이너의 외부 포트를 바라보게 하는게 아닌 내부 포트를 바라보게 해야한다.