본문 바로가기
Programming/Spring Boot

[Spring Boot] Gradle을 이용한 Profile(개발/운영) 구분 설정

by 주리니e 2022. 12. 2.
728x90

[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의 프로퍼티값 둘다 사용할 수 있으며, 만약 프로필과 디폴트 파일에 중복된 프로퍼티 값이 있을 경우 프로필에 기술된 프로퍼티값이 적용이 된다.

728x90

댓글