Spring Boot 프로필과 프로퍼티
Spring에서 프로필주입과 프로퍼티 사용
  • Spring

프로필

프로필이란 무엇일까요? 시스템을 개발하다보면 config파일을 마주하게 됩니다.

DB연결에 필요한 정보들을 담아둘 수 있죠.
그리고 dev에서는 xxx_dev db연결하고 prod에서는 xxx_prod로 연결할 필요가 있습니다.

즉, 개발 환경에 맞는 config파일을 불러와야 합니다.
이를 어떻게 구현할 수 있을까요?

이는 각 환경에 맞는 프로필을 설정해서 프로필 정보에 따라 각기 다른 config파일을 호출하도록 구현합니다.

spring 에서 프로필을 설정하는 방법은 3가지가 있습니다.

  1. setActiveProfiles()
  2. 자바 시스템 프로퍼티
  3. OS 환경 변수

프로필 설정 1. setActiveProfiles()

java코드에서 프로필을 설정하는 방법입니다. 테스트를 위하여 dev와 prod의 프로필 두개를 만들어보도록 하겠습니다.

// dev
@Configuration
@Profile("dev")
public class HelloDev {
    @Bean
    public String helloEnv () {
        return "Dev";
    }
}
// prod
@Configuration
@Profile("prod")
public class HelloProd {
    @Bean
    public String helloEnv () {
        return "Prod";
    }
}

2개의 클래스를 생성하였습니다. 각 클래스는 환경에 맞게 @Profile을 설정해주고 String을 리턴하는 HelloEnv라는 동일한 이름으로 메서드를 생성하고 각 환경에 맞는 String을 리턴하는 간단한 예제입니다.

설정클래스로 가서 HelloEnv를 호출하는 Bean을 등록해보도록 하겠습니다.

@Configuration
public class AppContext {
    @Autowired
    public String helloEnv;
}

@Autowired 어노테이션은 helloEnv라고 등록되어있는 Bean 을 찾아 자동으로 주입해주는 어노테이션 입니다.

위 코드에서 HelloEnv가 두개가 있기때문에 일반적인 상황이라면 오류가 발생하겠지만, Profle이 설정되어있어 실행에 오류는 없습니다.

main코드로 가서 프로필을 설정해보도록 하겠습니다.

@SpringBootApplication
public class HelloSpringApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloSpringApplication.class, args);

        AnnotaionConfigApplicationContext ctx = new AnnotaionConfigApplicationContext();
        ctx.getEnvironment().setActiveProfiles("dev");
        ctx.register(AppContext.class, HelloDev.class, HelloProd.class);
        ctx.refresh();

        AppContext context = ctx.getBean(AppContext.class);
        System.out.println("env : " + context.helloEnv);
    }
}

위 코드를 살펴보면

  1. 컨테이너 초기화
  2. getEnvironment()를 통해 env값 조회
  3. setActiveProfiles()를 통해 프로필 주입

의 순서로 작성되었습니다.

실행해보면 env : Dev라고 출력되는것을 볼 수 있습니다.
프로필 주입할 때 prod로 주입하면 결과값 역시 Prod로 정상 출력됩니다.

프로필 설정 2. 자바 시스템 프로퍼티

자바 시스템 프로퍼티는 JVM이 실행될 때 key-value로 이루어진 JVM 시스템 속성값 입니다. 여기에 프로필을 주입할 수 있습니다.

java -Dspring.profiles.active=dev main.Main

위 명령어로 주입이 가능합니다.

프로필 설정 3. OS 환경 변수

OS 환경 변수로도 프로필을 주입할 수 있습니다.

export SPRING_PROFILES_ACTIVE=dev

프로필 설정의 우선순위

만약 위 1~3 모두 설정되어있다면 프로필은 다음과 같은 우선순위를 가지게 됩니다.

  1. setActiveProfiles()
  2. 자바 시스템 프로퍼티
  3. OS 환경 변수

그 외 다양한 프로필 설정

프로필 설정은 @Profile("dev, staging")과 같이 두개 이상을 쉼표로 구분하여 설정도 가능합니다.

@Profile("!prod")와 같이 느낌표를 사용하여 해당 프로필이 아닐 때 라고 표현할 수 있습니다.

main코드에서 ctx.getEnvironment().setActiveProfiles("dev", "mysql");와 같이 여러개 주입하는것도 가능합니다.

프로퍼티 설정

프로퍼티는 spring 프로젝트를 생성하면 /resources/application-properties라는 파일이 기본적으로 생성되어 있습니다.

이 곳에 설정값을 입력해두고 코드에서 불러와 사용할 수 있습니다.

db.driver=com.mysql.jdbc.Driver
db.url=jdbc://localhost...
db.user=root
db.password=root

위와 같이 설정했다면

@Value(${db.user})
String user;

코드와 같이 @Value 어노테이션을 이용하여 경로를 설정해주면 Autowired와 같이 자동으로 주입됩니다.

System.out.println(user); // root

그리고 정상 동작하는지 확인해봅니다.

yaml

기본적으로 생성되어있는 application-properties파일보다는 보기가 더욱 편한 yaml문서로 작성할 수 있습니다.

사용법은 동일합니다.

위에서 설명하였던 프로필과 프로퍼티를 사용하여 환경에 맞는 설정값을 불러오도록 구현하면 됩니다.