프로필
프로필이란 무엇일까요? 시스템을 개발하다보면 config파일을 마주하게 됩니다.
DB연결에 필요한 정보들을 담아둘 수 있죠.
그리고 dev에서는 xxx_dev db연결하고 prod에서는 xxx_prod로 연결할 필요가 있습니다.
즉, 개발 환경에 맞는 config파일을 불러와야 합니다.
이를 어떻게 구현할 수 있을까요?
이는 각 환경에 맞는 프로필을 설정해서 프로필 정보에 따라 각기 다른 config파일을 호출하도록 구현합니다.
spring 에서 프로필을 설정하는 방법은 3가지가 있습니다.
- setActiveProfiles()
- 자바 시스템 프로퍼티
- 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);
}
}위 코드를 살펴보면
- 컨테이너 초기화
- getEnvironment()를 통해 env값 조회
- 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 모두 설정되어있다면 프로필은 다음과 같은 우선순위를 가지게 됩니다.
- setActiveProfiles()
- 자바 시스템 프로퍼티
- 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문서로 작성할 수 있습니다.
사용법은 동일합니다.
위에서 설명하였던 프로필과 프로퍼티를 사용하여 환경에 맞는 설정값을 불러오도록 구현하면 됩니다.