-
[스프링 인 액션] Chapter 5 - 구성 속성 사용하기 :: 프로파일 사용해서 구성하기개발서적읽기/Spring in Action 제 5판 2020. 7. 31. 01:22
애플리케이션이 서로 다른 런타임 환경에 배포, 설치될 때는
대개 구성 명세가 달라진다.
이때 각 환경의 속성들을 application.yml에도 설정할 수 있고
또한 운영체제의 환경 변수를 사용해서 설정할 수도 있다.
하지만 하나 이상의 구성 속성을 환경 변수로 지정하는 것은 번거롭다.
게다가 환경 변수의 변경을 추적 관리하거나 오류가 있을 경우에
변경 전으로 바로 되돌릴 수 있는 방법이 마땅치 않다.
따라서 스프링 프로파일을 이용하는 것이 선호된다.
런타임 시에 활성화되는 프로파일에 따라 서로 다른 빈, 구성 클래스, 구성 속성들이
적용 또는 무시되도록 하는 것이 프로파일이다.
예를 들어, 개발과 디버깅 목적으로 내장 H2 DB를 사용하고
타코 클라우드 코드의 로깅 수준을 DEBUG로 설정한다고 해보자.
이 경우 개발 시에는 데이터 소스 속성을 따로 설정하지 않아도
자동-구성된 H2 DB를 충분히 사용할 수 있다.
그리고 로깅 수준은 tacos 기본 패키지의 logging.level.tacos 속성을
application.yml에 DEBUG로 설정하면 된다.
logging:
level:
tacos: DEBUG그러나 프로덕션 환경에서는 외부의 MySQL DB를 사용하고
로깅 수준은 WARN으로 설정하고자 한다.
이 때에는 환경별로 적합한 속성들을 설정하는 프로파일을 정의해야 한다.
■프로파일 특정 속성 정의하기
프로파일에 특정한 속성을 정의하는 한 가지 방법은 프로덕션 환경의 속성들만
포함하는 또 다른 .yml을 생성하는 것이다. 이때 파일 이름은 다음 규칙을 따라야 한다.
application-[프로파일 이름].yml
그러면 해당 프로파일에 적합한 구성 속성들을 각 파일에 지정할 수 있다.
또한 YAML 구성에서만 사용할 수 있는 다른 방법이 있다.
이때는 프로파일에 특정되지 않고 공통으로 적용되는 기본 속성과 함께
프로파일 특정 속성을 application.yml에 지정할 수 있다.
logging:
level:
tacos: DEBUG
---
spring:
profiles: prod
datasource:
url: jdbc:mysql://localhost/tacocloud
username: tacouser
password: tacopassword
logging:
level:
tacos: WARNspring.profiles를 지정하지 않은 DEBUG 속성은 모든 프로파일에 기본 공통으로 적용된다.
■프로파일 활성화하기
프로파일 특정 속성들의 설정은 해당 프로파일이 활성화되어야 유효하다.
그렇다면 어떻게 프로파일을 활성화할 수 있을까?
spring.profiles.active 속성에 지정하면 된다.
spring:
profiles:
active:
- prod하지만 이것은 여러 활성화 방법 중 가장 좋지 않은 방법이다.
활성화를 하드코딩하게 되기 때문에 특정 속성을 개발 속성과 분리시킬 수 없다.
이 방법 대신 환경 변수를 사용해서 활성화 프로파일을 설정하는 것이 더 나은 방법이다.
export SPRING_PROFILES_ACTIVE=prod
하지만 이렇게 해도 해당 컴퓨터에 배포되는 모든 애플리케이션에
prod 프로파일이 활성화된다는 단점이 있다.
실행 가능한 JAR 파일로 애플리케이션을 실행한다면
다음과 같이 명령행 인자로 활성화 프로파일을 설정하면 애플리케이션별로
활성화를 설정할 수 있다.
java -jar taco-cloud.jar --spring.profiles.active=prod
spring.profiles.active 속성에는 여러 개의 프로파일이 포함될 수 있다.
java -jar taco-cloud.jar --spring.profiles.active=prod,audit,ha
YAML에서는 다음과 같이 지정하면 된다.
spring:
profiles:
active:
- prod
- audit
- ha한편, 스프링 애플리케이션에서 조건별로 구성 속성을 설정할 때만
프로파일이 유용한 것은 아니다.
지금부터는 활성화 프로파일을 빈에 적용하는 방법을 알아보자.
■프로파일을 사용해서 조건별로 빈 생성하기
서로 다른 프로파일 각각에 적합한 빈들을 제공하는 것이 유용할 때가 있다.
일반적으로 자바 구성 클래스에 선언된 빈은 활성화되는 프로파일과는 무관하게 생성된다.
그러나 특정 프로파일이 활성화될 때만 생성되어야 하는 빈들이 있다고 가정해보자.
이때 @Profile 애노테이션을 사용하면 지정된 프로파일에만 적합한 빈들을 생성할 수 있다.
예를 들어, TacoCloudApplication에는 CommandLineRunner 빈이 선언되어 있다.
그리고 애플리케이션이 시작될 때마다 식자재 데이터를 내장 DB에 로드하기 위해
CommandLineRunner 빈이 사용된다. 프로덕션 환경에서는 비활성화하는 것이 나을 것이다.
이때 CommandLineRunner 빈 메서드에 @Profile을 지정하면
프로덕션 환경에서 식자재 데이터가 로드되는 것을 방지할 수 있다.
@Bean
@Profile("dev")
public CommandLineRunner dataLoader(IngredientRepository repo) {
return new CommandLineRunner() {
@Override
public void run(String... args) throws Exception {
repo.save(new Ingredient("FLTO", "Flour Tortilla", Ingredient.Type.WRAP));
repo.save(new Ingredient("COTO", "Corn Tortilla", Ingredient.Type.WRAP));
repo.save(new Ingredient("GRBF", "Ground Beef", Ingredient.Type.PROTEIN));
repo.save(new Ingredient("CARN", "Carnitas", Ingredient.Type.PROTEIN));
repo.save(new Ingredient("TMTO", "Diced Tomatoes", Ingredient.Type.VEGGIES));
repo.save(new Ingredient("LETC", "Lettuce", Ingredient.Type.VEGGIES));
repo.save(new Ingredient("CHED", "Cheddar", Ingredient.Type.CHEESE));
repo.save(new Ingredient("JACK", "Monterrey Jack", Ingredient.Type.CHEESE));
}
};
}또는 dev 프로파일이나 qa 프로파일 중 하나가 활성화될 때에는
원하는 프로파일을 추가하면 된다.
@Profile({"dev", "qa"})
혹은 이렇게 지정할 수도 있다.
@Profile("!prod")
@Profile은 @Configuration이 지정된 클래스 전체에 대해 사용할 수도 있다.
예를 들어, DevelopmentConfig라는 이름의 구성 클래스로
CommandLineRunner 빈을 주입할 때 다음과 같이 @Profile을 지정할 수 있다.
package tacos;
/*
* @USER JungHyun
* @DATE 2020-07-31
* @DESCRIPTION
*/
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.security.crypto.password.PasswordEncoder;
import tacos.data.IngredientRepository;
import tacos.data.UserRepository;
@Profile({"!prod", "!qa"})
public class DevelopmentConfig {
@Bean
public CommandLineRunner dataLoader(IngredientRepository repo, UserRepository userRepo, PasswordEncoder encoder) {
...
}
}이 경우는 prod 프로파일과 qa 프로파일 모두 활성화되지 않을 때만
CommandLineRunner 빈이 생성된다.
'개발서적읽기 > Spring in Action 제 5판' 카테고리의 다른 글
[스프링 인 액션] Chapter 6 - REST 서비스 생성하기 :: 하이퍼미디어 사용하기 (2) 2020.08.18 [스프링 인 액션] Chapter 6 - REST 서비스 생성하기 :: REST 컨트롤러 작성하기 (0) 2020.08.11 [스프링 인 액션] Chapter 5 - 구성 속성 사용하기 :: 우리의 구성 속성 생성하기 (0) 2020.07.31 [스프링 인 액션] Chapter 5 - 구성 속성 사용하기 :: 자동-구성 세부 조정하기 (0) 2020.07.31 [스프링 인 액션] Chapter 4 - 스프링 시큐리티 :: 각 폼에 로그아웃 버튼 추가하고 사용자 정보 보여주기 (0) 2020.07.30 댓글