본문 바로가기

Web Sever 개발과 CS 기초/스프링

SpringBoot 설정 파일 기능 활용하기(Profile나누기, 환경 변수 설정, 설정 파일 분리, group하기)

개요 목적

SpringBoot 설정 파일의 다야한 기능을 활용해서 개발 친화적인 프로젝트 만드는 방법을 알아본다.

알아볼 설정 파일 기능으로는

  • Profiles 나누기
    • profile별로 나누는 서비스 개발 환경 종류
    • gradle bootrun으로 profile별 실행 방법
  • 설정 파일 환경 변수 가져오기
  • 설정 파일 자체를 분리하기
  • spring.profiles.group을 통해 profile 그룹 분리하기

Profile 나누기

로컬 환경 실제 배포 환경에 따라 사용할 설정이 다를 때 Profile을 통해서 설정 정보를 편리하게 나눌 수 있다. 실행 시점에만 어떤 profile을 설정하는 지 선택하면 해당 설정 정보를 사용할 수 있다.

Profile을 나누는 방법은 spring.config.activate.on-profile 설정을 통해서 원하는 profile 이름을 작성을 적고 그 아래 해당 설정 정보를 적으면 된다. 그리고 —- 을 통해 profile간 구분을 명시하면 된다.

#profile이 설정되지 않은 맨 위에 부분은 모든 Profile에 공통 설정 부분이다
spring:
  jpa:
    open-in-view: false

#이런식으로 ---를 통해 profile별 구분을 나누고 원하는 profile 이름과 설정 정보를 아래에 작성한다.
---
spring:
  config:
    activate:
      on-profile: local
server:
  port: 1111

---
spring:
  config:
    activate:
      on-profile: server
server:
  port: 9999

profile별로 나누는 서비스 개발 환경 종류

profile별로 설정하는 서비스 각 개발 단계 종류와 특징에 대해서 알아본다.

  • Local

Local은 각자 개발자 PC에서 개발 및 테스트를 하는 것이다. 여기서 주의할 점은 프로젝트에 참여하는 개발자들은 같은 환경을 설정해야 하는 것이다. Jdk 버전 같은.

  • Develope

나의 Local에서는 개발을 완료했고, 다른 사람들이 내 프로젝트를 사용할 때, 설정해 놓는 설정이다. 개발자들이 만든 코드를 합쳐서 서버 환경에서 테스트 해볼 수 있는 환경이다.

  • Beta

테스트 환경을 위한 설정이다. Develope와 같이 사용하기도 한다.

  • RC

실제 서비스를 배포 하기 전에, 최종적 테스트를 해볼 수 있는 환경을 설정한다.

  • Production(실제 서비스 환경)
    1. Canary (테스트 계정이나 몇 명의 유저에게만 서비스를 적용해본다)
    2. Stage(일부 유저에게만 공개 하면서 상황 지켜보기)
    3. Real (모든 유저에게 배포한다)

gradle bootrun에 profile별 적용하기

  • 먼저 build.gradle 파일을 수정을 해준다.
bootRun {
    String activeProfile = System.properties['spring.profiles.active']
    systemProperty "spring.profiles.active", activeProfile
}

아래의 설정을 최하단에 넣어준다.

  • gradle bootRun -Dspring.profiles.active=db-mysql

cli를 작동 시켜서 원하는 profile을 선택하여 gradle bootrun을 실행할 수 있다.

설정 파일 환경 변수 가져오기

profile별로 다른 환경 변수를 스프링 부트 설정 파일에 넣고 사용하면 개발의 편리성이 올라간다.

코드 예시를 통해서 환경 변수 값을 저장, 가져오는 방법을 알아보자.

<환경 변수 저장>

spring:
  config:
    activate:
      on-profile: local
server:
  name: local-server

---
spring:
  config:
    activate:
      on-profile: development
server:
  name: development-server

<실제 코드에서 환경 변수 사용>

이런 식으로 @Value를 사용하여 원하는 설정 정보를 작성하여 환경 변수를 가져올 수 있다.

: default-server 작성을 통해 값이 존재하지 않을 때 기본 값을 설정할 수 있다.

@Service
public class Service {
	
	@Value("${value.test: default-server}")
	private String test;
    
    public Service() {
        System.out.println(test);
    }
}

설정 파일 자체를 분리

Kafak같은 외부 서버와 통신할 때 설정 정보가 굉장히 복잡하다. 이런 설정 정보를 하나의 파일에 넣게 되면 한눈에 설정 파일 정보를 확인하기가 어렵다 그래서 설정 파일 자체를 분리하고 첨부하는 식으로 이 문제를 해결할 수 있다.

실제 설정 파일 코드를 보면서 방법을 알아보자.

#application.yml 
#파일 config.import에 추가하고 싶은 설정 파일을 추가하면 된다.
spring:
  config:
    import: kafka.yml
#kafka.yml 파일
#분리된 kafka 파일을 첨부하여 하나의 설정 파일에 적용할 수 있다.
spring:
  config:
    activate:
      on-profile: local
  kafka:
    producer:
      bootstrap-servers: 127.0.0.7:9093
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

---
spring:
  config:
    activate:
      on-profile: server
  kafka:
    producer:
      bootstrap-servers: 10.0.2.7:9092
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

spring.profiles.group을 통해 profile 그룹 설정

spring.profiles.group을 통해 분리된 설정 파일의 profile들을 하나의 group으로 지정하여 사용할 수 있다.

db와 kafka 설정 파일 내부에 있는 여러 profile들을 하나의 그룹으로 설정하기

#application.yml
spring:
  profiles:
    active:
      - local
    group:
      local:
        - db-local
        - kafka-local
      dev:
        - db-dev
        - kafka-dev
    include:
      - db
      - kafaka
  • spring-profiles-active  : 기본적으로 활성화할 profile을 local로 설정한다.
  • spring-profiles-group profile group 을 정의한다.
    • local : profile이 local일 경우 db-local, kafka-local 의 profile과 그룹을 정의
    • dev : profile이 local일 경우 db-dev, kafka-dev 의 profile과 그룹을 정의
  • spring-profiles-include  설정을 통해 어플리케이션을 실행할 때 profile을 포함한다.

Reference

https://zzang9ha.tistory.com/415

https://velog.io/@beenz/Spring-Boot에서-application.properties-값을-객체에-저장하는-2가지-방법

https://lejewk.github.io/springboot-gradle-spring-profiles-active/

https://bcho.tistory.com/759

https://zzang9ha.tistory.com/415