본문 바로가기
BackEnd/Project

[PharmNav] Ch04. 개발 및 운영 환경 분리와 Docker를 이용한 다중 환경 구성

by 개발 Blog 2024. 9. 2.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

이번 장에서는 Spring Profile을 이용해 개발 및 운영 환경을 분리하고, Docker와 Docker Compose를 사용하여 여러 환경에서의 설정을 효율적으로 구성하는 방법을 설명한다.

 

개발환경과 운영환경 profile 나누기

 

Spring Profile: Spring Profile은 특정 환경(local, develop, production 등)에서만 적용되는 설정을 관리할 수 있게 해 준다. 이를 통해 환경별로 다른 설정을 적용할 수 있으며, Spring Boot는 애플리케이션 실행 시 자동으로 application-{profile}.yml 파일을 탐색하여 적용한다.

 

프로파일 그룹 설정

application.yml 파일에서 profiles.active 설정을 통해 기본으로 활성화할 프로파일을 지정하고, 프로파일 그룹을 설정하여 로컬 환경에서는 local과 common 프로파일이 활성화되도록 구성할 수 있다.

 

spring:
  profiles:
    active: local # default
    group:
      local:
        - common
      prod:
        - common

---
spring:
  config:
    activate:
      on-profile: common

# ...

---
spring:
  config:
    activate:
      on-profile: local
---
spring:
  config:
    activate:
      on-profile: prod

 

실행 시 확인

서버 실행 시 콘솔 로그에 활성화된 프로파일이 출력되며, 이 정보를 통해 올바르게 설정되었는지 확인할 수 있다.

 

도커를 이용한 다중 환경 구성하기

도커 컴포즈 파일 작성(docker-compose.yml)

Docker 및 Docker Compose 설정: Docker Compose를 사용하여 로컬에서 MariaDB와 Redis를 함께 실행할 수 있는 환경을 구성한다. 이를 통해 데이터베이스와 캐시 서버를 로컬 개발 환경에서도 동일한 설정으로 실행할 수 있다.

 

Dockerfile 작성

각각의 서비스(database, redis)에 대해 Dockerfile을 작성하고, 최신 버전의 이미지(MariaDB 10.11, Redis 7.4)를 사용하여 컨테이너를 빌드한다.

 

database > Dockerfile

FROM mariadb:10.11 

ENV TZ=Asia/Seoul

 

redis > Dockerfile

FROM redis:7.4

ENV TZ=Asia/Seoul

 

Docker Compose 파일 작성

docker-compose-local.yml 파일을 작성하여, 두 개의 서비스(MariaDB, Redis)를 함께 실행할 수 있도록 설정했다. 각 서비스에 필요한 환경 변수와 포트를 설정하고, 이미지 이름을 명시하여 쉽게 관리할 수 있도록 했다.

services:
  pharmacy-recommendation-redis:
    container_name: pharmacy-recommendation-redis
    build:
      dockerfile: Dockerfile
      context: ./redis
    image: eunhan97/pharmacy-recommendation-redis
    ports:
      - "6379:6379"

  pharmacy-recommendation-database:
    container_name: pharmacy-recommendation-database
    build:
      dockerfile: Dockerfile
      context: ./database
    image: eunhan97/pharmacy-recommendation-database
    environment:
      - MARIADB_DATABASE=pharmacy-recommendation
      - MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
    volumes:
      - ./database/config:/etc/mysql/conf.d
    ports:
      - "3306:3306"

 

Docker Compose 환경변수 설정 방법

경 변수 정보들은 .env 파일로 분리해 관리하고, 이 파일은 .gitignore에 추가하여 외부에 노출되지 않도록 했다. 이를 통해 Docker Compose 실행 시 환경 변수가 자동으로 반영되도록 했다.

 

.env

SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=1234

 

.gitignore

###
.env

 

docker mariaDB 설정

MariaDB의 한글 깨짐 현상을 방지하기 위해 추가적인 설정을 my.cnf 파일에 작성하고, 이를 Dockerfile에서 참조하도록 구성한다.

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

[mysqldump]
default-character-set=utf8mb4

 

도커 컴포즈 실행 및 확인

Docker Compose 파일을 실행시켜 정상적으로 DB와 Redis가 컨테이너에 의해 실행되는지 확인했다. 터미널에서도 이 실행 상태를 확인할 수 있었다.

 

JPA와 MariaDB 설정 주석 해제

이전에 주석 처리했던 JPA와 MariaDB 관련 의존성을 다시 활성화하고, application.yml 파일에서 데이터베이스와 Redis 연결 설정을 추가하여 애플리케이션이 정상적으로 작동하도록 한다.

 

build.gradle

//주석 해제
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

 

IntelliJ에서 데이터베이스와 Redis 연결

스프링 부트 애플리케이션에서 데이터베이스와 Redis와의 커넥션을 확인한다.

우선, 인텔리제이에서의 환경 변수 설정 방법을 알아보자. 로컬 환경에서 도커 컴포즈 파일이 참조하는 .env 파일의 환경 변수는 클라우드 배포 시 사용되지만, 로컬에서 스프링 부트를 실행할 때는 인텔리제이에서 별도로 환경 변수를 설정해줘야 한다. 이 환경 변수 설정은 인텔리제이의 Edit Configuration에서 추가할 수 있다.

 

설정한 환경 변수는 아래와 같이 정의한다.

이 설정을 통해 로컬 개발 환경에서도 데이터베이스와 Redis와의 연결을 관리할 수 있다.

또한, application.yml 파일에서 데이터베이스와 Redis를 설정한다. 로컬 프로파일에서는 ddl-auto를 create로 설정하여 기존 테이블이 있으면 이를 삭제하고 새로 생성되도록 해야 한다. 다만, 이 설정은 로컬에서만 사용해야 하며, 운영 환경에서는 주의가 필요하다.

 

DB  Redis 설정 추가(application.yml 로컬 환경)

application.yml

...
spring:
  config:
    activate:
      on-profile: local
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/pharmacy-recommendation
    username: ${SPRING_DATASOURCE_USERNAME}
    password: ${SPRING_DATASOURCE_PASSWORD}
  data:
    redis:
      host: localhost
      port: 6379
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

...

 

테스트 및 실행

모든 설정이 완료되면 Spring Boot 애플리케이션을 실행하여, 로컬 환경에서 데이터베이스와 Redis가 정상적으로 작동하는지 테스트한다.

스프링 부트와 도커를 활용하여 로컬 환경에서 데이터베이스와 Redis를 연동하는 방법을 학습했다. 환경 변수 설정과 application.yml 파일 설정을 통해 로컬 개발 환경에서도 운영 환경과 유사한 조건을 구성할 수 있었다. 이를 통해 일관된 개발 환경을 유지하며 효율적인 애플리케이션 개발을 할 수 있다.