스프링 환경 설정은 애플리케이션의 환경 정보를 담고 있는 인터페이스로 주로 스프링 프로파일(Profiles)과 프로퍼티(Properties)를 관리하는 인터페이스이에요.
애플리케이션이 다양한 환경에서 각 환경에 맞는 설정을 적용할 수 있도록 하는 기능이에요. 환경에 따라 빈과 프로퍼티 값 등을 다르게 구성할 수 있게해서 배포 환경에 따라 소스 코드를 수정하지 않아도 돼요.
빈의 경우 @Profile 어노테이션을 통해 빈의 프로파일을 지정해줄 수 있어요. 앞의 Engine 빈에 프로파일을 적용해보면 다음과 같아요.
@Profile("gasoline")
@Component
public class GasolineEngine implements Engine {
@Override
public void start() {
// ...
}
}
@Profile("electric")
@Component
public class ElectricEngine implements Engine {
@Override
public void start() {
// ...
}
}
가솔린(gasoline) 환경인지 전기(electric) 환경 인지에 따라 가솔린 엔진과 전기 엔진을 빈으로 지정할 수 있어요. @Bean 어노테이션을 사용할 경우에도 같은 방식으로 프로파일을 적용할 수 있어요.
일반적으로 주로 사용되는 스프링 프로파일은 로컬, 개발, 운영 환경, 테스트 환경 등으로 구분해요. 스프링 프로파일에는 표현식도 사용할 수 있는데, 사용할 수 있는 표현식은 아래와 같습니다.
- ! (not): 이 프로파일이 아닌 경우
- & (and): 두 가지 프로파일이 모두 활성화 되는 경우
- | (or): 둘 중 하나의 프로파일이 활성화 되는 경우
각각의 조건을 묶을 경우 ()을 사용해요.
프로파일을 활성화 하는 방법은 아래와 같이 Java 옵션을 지정하는 것이에요.
-Dspring.profiles.active=프로파일 이름
예를 들어 Wildfly나 JBoss를 사용한다면 env.sh 파일에 선언해두면 되고 Tomcat 같은 경우는 setenv.sh 파일에 선언해두면 돼요. 여러 개의 프로파일을 활성화하고 싶은 경우는 이후에 설명할 스프링 프로퍼티에서 프로파일 그룹을 설정해주면 돼요.
다른 방식은 @ActiveProfiles 어노테이션을 활용하는 방법으로 테스트 할때 사용돼요.
스프링 부트는 기본적으로 애플리케이션 설정을 지원하는 프로퍼티 소스 파일을 지원해요. 파일명은 각각 application.properties 또는 application.yml이에요. properties와 yml에 따라 설정하는 방식이 조금 달라요
기본 (properties) 방식
app.host=http://localhost.com:8080YAML (Ain't Markup Language) 방식
app: host: http://localhost.com:8080이번 시리즈에서는 읽기 편한 YAML 방식으로 설명하도록 할게요.
스프링 프로퍼티 소스(application.yml) 기준으로 프로파일을 지정하는 방식은 크게 두가지가 있는데 먼저 파일 이름을 통해 프로파일을 지정하는 방식이 있어요.
applicatnion-dev.yml
spring: datasource: url: jdbc:h2:mem:testdb username: sa password:applicatnion-prod.yml
spring: datasource: url: jdbc:mysql://prod-db.example.com:3306/mydb username: produser password: prodpassword
각각 dev와 prod 프로파일의DataSource에 대한 설정이에요. 다른 하나의 방식은 ---를 사용해 하나의 파일에서 프로파일을 지정하는 방법이에요.
application.yml
spring: datasource: url: jdbc:h2:mem:testdb username: sa password: config: activate: on-profile: prod --- spring: datasource: url: jdbc:mysql://prod-db.example.com:3306/mydb username: produser password: prodpassword config: activate: on-profile: prod
동시에 여러 프로파일을 활성화하고 싶을 경우 프로퍼티에 프로파일 그룹을 지정해서 사용할 수 있어요.
spring:
profiles:
group:
prod: prod,common
이 설정은 prod과 common 프로파일에 대한 그룹을 지정한 것이에요. 이후 prod 프로파일을 활성화할 경우 두 프로파일이 모두 적용돼요.