스프링 profiles 정리

스프링 프로파일?

  • 스프링 프레임워크를 동작할 때, 프로파일에 따라 설정을 달리할 수 있다
  • 간단하게는 dev - prod 등 개발과 운영으로 나눌 수 있고, 필요에 따라 더 복잡하게 구현할 수 있다.
  • 프로파일 설정에 대한 블로그는 매우 많다. 하지만 예전 방식도 존재하고, 아예 동작하지 않는 세팅도 존재하였다. 프로파일 설정 방법을 찾는데 생각보다 많은 시간이 들었다.
  • 실제로 어플리케이션이 동작하는 것을 확인하고, 그것을 간단하게 정리하였다. 도움이 되기를 바랍니다!!
  • 스프링 부트 2.7.1 버전을 사용하였다.

프로파일 설정

  • 프로파일 설정은 두 개로 나눠서 생각해야 한다.
    • application.yml
    • application-XXX.yml

application.yml

  • 프로파일이 설정되지 않거나 공통 설정은 application.yml에 작성한다.
  • 나의 경우 다음과 같은 경우에서 application.yml에 작성하였다.
    • 공통의 설정을 작성한다.
    • 설정이 필요한 설정을 선언하되 공란으로 둔다. 다른 프로파일이 오버라이드 하도록 의도한다.
    • 사용할 프로파일 설정한다. spring.profiles.active
    • 프로파일을 그룹핑한다. spring.profiles.group

spring.profiles.active

  • jar 파일을 읽을 때 프로파일을 설정하지 않을 경우, application.yml 내부에 spring.profiles.active로 설정한 값을 받아드린다.
# application.yml

spring:
  profiles:
    active: dev, mariadb # 프로파일에 대한 설정이 없으면 dev와 mariadb 프로파일이 동작한다. 
  datasource:
    driver-class-name: # 공란으로 남겼다. mariadb 프로파일 설정파일이 오버라이딩 하기를 기대한다. 
    username: 
    password: 
    url: 
  jpa:
    hibernate:
      ddl-auto: 
    properties:
      hibernate:
        format_sql: true # 공통적인 부분은 작성한다.

spring.profiles.group

  • 프로파일을 그룹핑한다. 하나의 프로파일로 여러 개의 프로파일을 동시에 적용한다.
  • 환경에 따른 배포나 테스트에 아주 큰 장점을 발휘한다.
  • 현재 개발하는 서비스가 1) 외부 API와 연동하고 2) mariadb를 사용하고 3) 서버는 리눅스인데 개발은 윈도우라고 가정하자.
  • 이 변수에 따라 다음과 같이 프로파일을 작성하였다.
    • application-linuxMariadbApidev.yml
    • application-windowMariadbApidev.yml
    • application-linuxMemdbApidev.yml
    • application-windowMemdbApidev.yml
    • application-linuxMemdbApiprod.yml
    • application-windowMemdbApiprod.yml
  • java -jar -Dspring.profiles.active=linuxMariadbApidev application.jar -> 나는 리눅스에서 마리아디비를 사용하고 외부 api는 개발용으로 해야지!

  • 그룹핑을 이러한 문제를 아주 편리하게 해소한다.
# application.yml
spring:
  profiles:
    group:
      "test_maria": "window,mariadev,apidev"  # test_maria를 프로파일로 쓰면 window, mariadb, apidev를 동시에 사용한다. 
      "test_mem": "window,mem,apidev"      

spring.config.activate.on-profile 과 —

  • spring.config.activate.on-profile을 사용하여 특정 프로파일에 대한 설정임을 선언한다.
  • spring.config.activate.on-profile=abc는 application-abc.yml에 작성한 것과 동일한 효과를 가진다.
  • ---은 하나의 yml 파일에서 두 개의 파일을 가지는 것과 유사하다. 이를 통해 한 장의 yml에 여러 프로파일에 대한 설정을 할 수 있다.
# application.yml

spring:
  datasource:
    driver-class-name: org.h2.Driver # 프로파일이 설정되지 않으면 h2를 기본적으로 사용한다. 
    username: sa
    password:
    url: jdbc:h2:mem:test
  jpa:
    hibernate:
      ddl-auto: create

--- # 프로파일 설정 페이지가 분리된다. 위와 아래는 나뉘어진 파일과 같다. 

spring:
  config:
    activate:
      on-profile: mariadb 
      # maraidb에 대한 프로파일의 설정을 작성한다. application-mariadb.yml 에 작성한 것과 동일한 효과를 준다. 
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/test
    username: test
    password: test
  jpa:
    hibernate:
      ddl-auto: validation 

application-XXX.yml

  • application-XXX.yml의 형태를 가지면 XXX 프로파일에 대한 설정으로서 동작한다.
  • spring.config.activate.on-profile 를 사용할 필요가 없다.
  • 추가적으로 ${}를 사용하였다.
# application.yml

spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://${my.db.ip}:3306/#{my.db.name}
    username: ${my.db.username}
    password: ${my.db.pwd}

# application-mariadev.yml
my:
  db:
    ip: localhost
    name: dev_db
    username: dev
    pwd: test

# application-mariaprod.yml
my:
  db:
    ip: 123.123.123.123
    name: prod_db
    username: prod
    pwd: w%efj#8WEF45jflk$gv!u8i