[Spring Boot] Gradle을 이용한 Profile(개발/운영) 구분 설정
개발환경
- Eclipse IDE 2022-06
- Spring Boot 3.0.0
- Gradle 7.0
- Lombok
- PostgreSQL
프로젝트 개발 시 실제 개발과 운영의 환경은 다를 가능성이 높다. 보다 안전한 개발을 위하여 실제 운영중인 DB로 개발을 진행하지 않고 개발 DB를 이용하곤 한다. 또한 개발환경 또는 운영환경에서 사용하는 정보가 다를 수 있으므로(예를 들어 메일 송/수신자 테스트 정보) 우리는 각각의 환경에 맞는 정보를 불러와야 할 것이다. 이번시간에는 Gradle을 통한 Profile을 설정함으로써 개발과 운영의 설정 정보를 분리해보자.
- Package Explorer
프로젝트 생성 시 기본 패키지이다. 여기에 아래와 같이 'Ctrl + N' 단축키를 이용하여 source folder를 생성해주자.
다음은 만든 소스폴더 아래에 각 환경 별 설정 정보를 세팅할 application-[환경].propertes 파일을 만들어준다.
- application.properties
개발과 운영 상관없이 공통으로 사용할 환경을 설정한다.
## server
server.port=80
- application-dev.properties
개발서버에서 사용할 DB정보를 설정한다.
## database
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://xxx.xxx.xxx.xxx:5432/db_dev
spring.datasource.username=dev
spring.datasource.password=dev
- application-prod.properties
운영서버에서 사용할 DB정보를 설정한다.
## database
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://xxx.xxx.xxx.xxx:5432/db_prod
spring.datasource.username=prod
spring.datasource.password=prod
- build.gradle
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.example.profile'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.postgresql:postgresql'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
# profile 값이 없을 경우 dev 설정
ext.profile = (!project.hasProperty('profile') || !profile) ? 'dev' : profile
# profile 값에 따른 소스파일 변경 설정
sourceSets {
main {
resources {
srcDirs "src/main/resources", "src/main/resources-env/${profile}"
}
}
}
프로젝트 우클릭 > Gradle > Refresh Gradle Project를 클릭해보자. build.gradle 파일이 빌드되면서 프로젝트 구조가 아래 이미지와 같이 application-dev.properties 파일을 인식하도록 바뀌었다. 이 값은 Gradle이 빌드될 때 설정된 profile 값을 불러온다. 설정된 값이 없다면 위에 선언된 'dev'로 기본 설정이 될 것이다.
이번에는 profile 값을 prod로 바꾸고 프로젝트 우클릭 > Gradle > Refresh Gradle Project를 클릭해보자. 프로젝트 구조가 application-prod.properties 파일을 인식하도록 바뀌었다.
ext.profile = (!project.hasProperty('profile') || !profile) ? 'prod' : profile
- Spring Boot App 기동 시 profile 설정
Spring Boot App을 profile에 맞게 기동하려면 환경설정 값을 설정해주어야 한다. 프로젝트 우클릭 > Run As > Run Configuration을 선택한다. Spring Boot 탭의 Profile 또는 Environment 설정 중 한가지를 선택하여 사용하면 된다.
SPRING_PROFILES_ACTIVE : dev
이렇게 설정을 한 후 Spring Boot App을 실행하면 아래와 같이 profile 값을 읽어 정상적으로 서버가 올라간다. 여기서 주의할 점은 build.gradle에서 설정하여 빌드한 값과 Run Configuration에서 설정한 값이 동일해야 한다.
- 외부 톰캣 기동 시 profile 설정
외부 톰캣으로 기동 시에는 해당 서버를 생성해주고 프로젝트 우클릭 > Run As > Run Configuration을 선택한 후 동일하게 Environment에 SPRING_PROFILES_ACTIVE 값을 설정해 준다.
- 리눅스 외부 톰캣 기동 시 profile 설정
$ cd %TOMCAT_HOME%/bin
$ vi setenv.sh
JAVA_OPTS="-Dspring.profiles.active=prod"
리눅스 외부 톰캣 사용 시 setenv.sh 파일을 이용하여 서버가 올라갈 때 환경변수 값을 설정한다.
이렇게 개발환경과 운영환경의 설정 정보를 다르게 세팅을 해보았다. 기본적으로 application.properties에 있는 프로퍼티 값과 application-{profile}.properties의 프로퍼티값 둘다 사용할 수 있으며, 만약 프로필과 디폴트 파일에 중복된 프로퍼티 값이 있을 경우 프로필에 기술된 프로퍼티값이 적용이 된다.
'Programming > Spring Boot' 카테고리의 다른 글
[Spring Boot] multiple DataSource 다중 데이터베이스 연결 구성 (0) | 2023.04.26 |
---|---|
[Spring Boot] No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.X.X was found. (0) | 2023.03.09 |
[Spring Boot] Jasypt를 이용한 암호화 (0) | 2022.11.30 |
[Spring Boot] PostgreSQL 연결을 위한 JPA 설정 (0) | 2022.07.28 |
Spring Boot 기본 설정 Port, ContextPath, Session Timeout (0) | 2022.07.22 |
댓글