설정을 상황에 맞게 다르게 해야 할 필요가 있다. 예를 들면, 개발환경과 운영환경의 설정 정보가 다를 경우이다.
profile을 적용하여 상황에 맞게 설정을 변화시킬 수 있다.

1. properties

  • application.properties을 가장 먼저 로드하고 profile이 있다면 겹치는 부분은 덮어 씌여진다
  • 파일명 : application-{profile명}.properties

  • application.properties
    spring.profiles.active=dev       # dev로 설정
    

    → 이와 같이 설정하면 application-dev properties가 실행된다

  • application-dev.properties
    server.port=8080
    
  • application-prod.properties
    server.port=9090
    

2. yml(yaml)

  • properties처럼 파일을 분리하는 것이 가능하다.
    • application.yml, application-dev.yml, application-prod.yml
  • 또한, 하나의 설정파일에서 --- 구분자를 사용하여 하나의 파일에 여러 설정을 입력할 수 있다
  • 파일명 : application.yml

1. Spring Boot 2.4 이전 : spring.profiles

# 공통설정
spring:
  profiles:
    active: dev         # dev로 설정
  
  devtools:
    livereload:
      enabled: true

---
spring:
  profiles: dev

server:
  port: 8080
  
---
spring:
  profiles: prod

server:
  port: 9090

2. Spring Boot 2.4 부터 : spring.config.activate.on-profile

spring:
  profiles:
    active: dev         # dev로 설정

  devtools:
    livereload:
      enabled: true

---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8080

---
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 9090
  • spring.profiles.active부분을 jar 실행시 커맨트로 설정/변경 할 수도 있다
    $ java -jar debrainsApi-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
    


그룹핑

  • spring.profiles.group을 통해 여러 Profile을 그룹으로 묶는다.
  • spring.profiles.active로 그룹을 선택해 실행
spring:
  profiles:
    active: dev         # dev 그룹으로 설정
    group:
      "dev": "common, dev"
      "prod": "common, prod"

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

  devtools:
    livereload:
      enabled: true

---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8080

---
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 9090

gradle 빌드시 Profile 선택

  • gradle로 빌드할 때 원하는 profile을 선택해서 실핼시킬 수 있다.
  • 예를 들면, build시 테스트가 진행되는데 이때 테스트 DB를 사용하도록 설정할 수 있다.

-application.yml

# 공통설정
spring:
  profiles:
    active: dev

  devtools:
    livereload:
      enabled: true
    restart:
      enabled: true
  thymeleaf:
    cache: false

  jpa:
    open-in-view: false
---

spring:
  config:
    activate:
      on-profile: dev

  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:tcp://localhost/~/myapp
    username: sa
    password:
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  h2:
    console:
      enabled: true
  ---

spring:
  config:
    activate:
      on-profile: test

  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://211.245.165.55:3306/myapp_test
    username: myapp_test
    password: 1234

  jpa:
    database-platform: org.hibernate.dialect.MariaDB103Dialect
    hibernate:
      ddl-auto: update

---

spring:
  config:
    activate:
      on-profile: prod

  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://211.245.165.55:3306/myapp
    username: myapp
    password: 1234

  jpa:
    database-platform: org.hibernate.dialect.MariaDB103Dialect
    hibernate:
      ddl-auto: validate

-build.gradle

plugins {
	id 'org.springframework.boot' version '2.5.8'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	...
}

// Test시 Profile 변수설정
ext.profile = (!project.hasProperty('profile') || !profile) ? 'dev' : profile

test {
	...
	systemProperty 'spring.profiles.active', "${profile}"   // profile 변수사용
}
  • 빌드
$ ./gradlew clean build -Pprofile=test

→ 커맨드의 프로퍼티 옵션으로 들어온 profile의 값인 test를 profile이라는 변수에 담는다.
→ 옵션으로 들어온 값을 profile변수에 설정, 아무것도 입력 되지 않으면 디폴트값으로 dev를 설정
spring.profiles.active에 profile 변수 사용해서 profile을 설정

Spring Docs about Profile