Search

개발 환경 분리

Created
2022/10/16 01:17

1. 개요

스프링 부트 2.4 버전 이후로는 application.properties / application.yml 에서 환경 분리가 조금 더 편리하게 바뀌었다.
yml 기준으로 이전에는 아래와 같이 profiles의 active를 어떤 것으로 할지 명시해야 했다.
spring: profiles: active: ?
YAML
복사
하지만 스프링 부트 2.4 이후로는 단순힌 yml 파일 이름의 형식을 통해 어떤 프로필에서 사용하는 설정 파일인지 구분할 수 있다.
예를 들어 application-test.yml 이라는 이름을 사용하면 profile을 자동으로 test로 인식하게 된다.
내 경우엔 src.main.resources에서는 local, dev, prod를 이용하기 때문에, 각각 application-local.yml, application-dev.yml, application-prod.yml을 생성했다.
또한 테스트 환경에서 사용할 설정이 필요하기 때문에 src.test.resources에서는 test라는 값을 이용하도록 application-test.yml을 생성했다.
초기에 프로젝트 세팅을 위해 local에서 이용할 application-local.yml의 예시는 아래와 같다.
spring: datasource: url: jdbc:h2:mem:test username: sa password: driver-class-name: org.h2.Driver h2: console: enabled: true jpa: hibernate: ddl-auto: create-drop use-new-id-generator-mappings: true properties: hibernate: format_sql: true use_sql_comments: true globally_quoted_identifiers: true database-platform: org.hibernate.dialect.H2Dialect open-in-view: false server: port: 80
YAML
복사
** JPA에서의 PK 생성을 위한 옵션인 use-new-id-generator-mappings 관련 내용은 아래 링크를 참고하자. 그 외의 옵션들은 필요하다면 따로 찾아보도록 하자.
** 아래에 인용된 김영한님의 말씀에 따르면, use-new-id-generator-mappings는 가급적이면 true로 설정하는 것이 낫다고 한다.
하이버네이트는 더 효과적이고 JPA 규격에 맞는 새로운 키 생성 전략을 개발했는데 과거 버전과의 호환성을 유치하려고 기본값을 false로 두었다. 기존 하이버 네이트 시스템을 유지보수하는 것이 아니라면 반드시 true로 설정하자. - 자바 ORM 표준 JPA 프로그래밍 132 쪽

2. 실행

profile에 해당하는 설정 파일로 실행할 수 있도록 만들기 위해선 build.gradle의 최하단에 (순서가 중요) 아래 코드를 추가해야 한다.
bootRun { String activeProfile = System.properties['spring.profiles.active'] systemProperty "spring.profiles.active", activeProfile }
Java
복사
빌드된 프로젝트를 아래와 같이 실행하게 되면, 명시된 값을 통해 적절한 profile의 설정 파일을 이용하게 된다.
// 빌드 ./gradlew clean build // 디렉토리 변경 cd build/libs // 실행 java -jar -Dspring.profiles.active=${PROFILE_NAME} ${SNAPHOT_NAME}
그리고 개발 시 기본 profile을 지정하도록 만들려면, 아래 그림처럼 Run → Edit Configurations… 에서 실행할 어플리케이션의 Active Profile을 지정하면 된다.

3. 코드 활용

각 환경에 맞는 객체를 이용할지 말지는 @Profile 어노테이션을 이용하여 분리해낼 수 있다.
또한 yml에 설정해둔 값을 읽기 위해서 @Value 어노테이션을 이용할 수 있다.