작업 환경 분리의 이유 ❓
프로젝트를 업그레이드 시키며 가장 먼저 하고싶은 것이 있었다.
바로 작업 환경 분리하기였다.
특히 DB ... 이전에는 RDS 와 인스턴스에 MySQL을 설치해서 사용하는 것 둘 다 진행했었다. 그리고 개발할 때는 휘발성 메모리인 H2를 사용하여 작업을 했었는데 작업환경이 변경될 때 마다 여간 불편한 것이 아니었다.
이유는 환경이 변경되면서 다른 환경변수들에도 영향을 미쳤기 때문이다.
팀원들에게 의견을 물었을 때 바로 받아 들여주어서 작업 환경 분리를 가장 먼저 진행할 수 있었다.
작업환경 분리
우리는 개발환경과 배포환경 이렇게 두 가지로 나누었고 불편했던 DB 설정과 관련된 부분을 개발환경과 배포환경 따로 나누기로 하였다.
profile 정의하기
스프링부트에서는 다양한 개발 환경에 맞게 설정을 분리하기 위해 'profile'을 사용하는데 파일명을 application-{profile}.yml 로 설정함으로써 이를 정의할 수 있다. 이렇게 설정한 profile을 통해 원하는 환경에서의 작업을 진행할 수 있다.
application.properties나 application.yml 파일 내에서 spring.profiles.active 속성으로 profile을 활성화 시키거나 JVM 옵션에 -Dspring.profiles.active=dev를 추가 해서 원하는 profile의 설정을 활성화시킨다.
우리는 개발, 배포 두 가지의 환경 설정을 하고자 했기에 다음과 같이 설정하였다.
✔️ 개발환경 (application-dev.yml)
- 팀원 개별 로컬 환경에서 사용하는 작업 환경으로 원하는 DB 설정을 통해 개발 진행
- 휘발성 / 비휘발성 상관 없음
- .gitignore 파일에 넣고 팀원들 개개인별로 원하는 DB 환경 사용
✔️ 배포환경 (application-prod.yml)
- 실제 배포 시 사용되는 DB로 RDS, 아우라 등을 통해 개발 진행
- 비휘발성 메모리
개발환경 (application-dev.yml)
개발 환경에서 이루어지는 설정으로 나는 h2를 연결했다.
spring:
h2:
console:
enabled: true
path: /h2
datasource:
url: jdbc:h2:mem:test
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create # DB 초기화 전략 (none, create, create-drop, update, validate)
properties:
hibernate:
dialect: org.hibernate.dialect.H2Dialect
format_sql: true # 쿼리 로그 포맷 (정렬)
show_sql: true # 쿼리 로그 출력
만약 MySQL이라면 아래와 같이 설정될 것이다. (MySQL연결하는 것도 나중에 블로깅 해야겠다.)
spring:
application:
name: dev
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/schema
username: ${DEV_MYSQL_USERNAME}
password: ${DEV_MYSQL_PW}
jpa:
hibernate:
ddl-auto: create # DB 초기화 전략 (none, create, create-drop, update, validate)
naming:
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
generate-ddl: false
show-sql: true
properties:
hibernate:
format_sql: true
배포환경 (application-prod.yml)
배포환경은 로컬에서 사용되는 것이 아닌 배포 시 사용되는 환경으로 팀원들과 공유되는 정보이다. 따라서 .gitignore에 올리지 않았고 우리는 RDS를 연결했다.
spring:
datasource:
url: jdbc:mysql://${RDS_ENDPOINT}/schema
username: ${RDS_USERNAME}
password: ${RDS_PASSWORD}
jpa:
hibernate:
ddl-auto: update # DB 초기화 전략 (none, create, create-drop, update, validate)
naming:
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
generate-ddl: false
show-sql: true
properties:
hibernate:
format_sql: true
이렇게 설정이 다 되고 나면 application.yml 파일에서 실행 시 변경만 시켜주면 된다.
application.yml
application.yml 파일에서 profile을 활성화시키는 곳이다.
# 개발환경 설정
spring:
profiles:
active: dev # dev, prod로 변경해서 run
실행 결과
연결이 잘 되었다면 다음과 같은 결과를 얻을 수 있을 것이다.