Profiles
。어플리케이션의 다양한환경(Environments) 별설정(Configuration)을 제공하는 기법.
▶ 각환경에 대한 별도의profile을 생성하여profile별 다른Configuration을 제공
。application-환경명.yml의환경을 사용하도록 설정 시 기존application.yml의 환경과 병합해서 환경이 구성
▶application-환경명.yml의 우선순위가 더 높다.
。어플리케이션은 여러개의yml 파일을 생성하여환경별Profile을 정의할 수 있음.
▶profile양식 :application-환경명.yml
▶Spring은bootstrap.yml -> application.yml -> application-프로필.yml순으로설정파일을 읽는다.
。Spring Boot는 활성화된Profile(application-{profile}.yml)을 다음 위치에서 찾음
▶src/main/resources,src/test/resources
ex)
。Dev Environments는Dev DB와 통신하며 ,Test Environments는Test DB와 통신
▶Profile을 통해 각개 다른환경에 대해 다른Configuration을 제공
프로필로 설정하는환경( Environment ) 종류
local:로컬 서버
。현재개발자의로컬컴퓨터환경
dev:개발서버
。개발자간운영서버로배포전테스트목적으로 활용
qa:품질검증서버
。실제운영환경과 동일한 환경에서 최종 테스트를 수행
prod:운영서버
。실제클라이언트들이 사용하는서버
test:테스트서버
。테스트를 수행하는 환경
실습 :
dev 환경의로깅수준을trace,prod 환경의로깅수준을info수준으로 설정해보기
。profile 양식 :application-환경명.yml
▶src/main/resources에 각환경에 맞는프로필을 각각 생성하여 property을 명기하여 각환경별Configuration을 설정.# application.yml spring: profiles: active: dev logging: level: org: springframework: debug# application-dev.yml logging: level: org: springframework: trace# application-prod.yml logging: level: org: springframework: info。 각
profile의로깅수준을 설정.
▶dev 환경의프로필을 활성화하여configuration으로 구성하도록 설정
▶dev 환경의프로필에 정의된TRACE수준으로로깅
특정
환경의프로필을활성화하는 방법
spring:profiles:active: 환경명:spring: profiles: active: dev。
application.yml 파일에서 특정환경의profile(application-prod.yml)을active상태로 설정하여configuration을 사용하도록 설정.
▶profile을 설정하지 않으면application.yml에 정의된configuration을 사용.
。 특정환경의profile( =prod)을active하도록 설정 시application.yml과application-prod.yml의configuration이 병합
▶ 이때application-prod.yml의 우선순위가 더 높다.
Intellij:
edit configurations - > Active profiles
。해당Active profiles부분에환경명을 입력 시 해당환경의프로필이 활성화
환경변수로 제어
。운영서버로배포하기위해JAR 빌드시환경변수를 통해환경을prod로 설정하여빌드
ex )java -jar -Dspring.profiles.active=prod -Ddb.url=~~~~ -Ddb.schema=~~~ xxx.jar
@Profile
。특정환경(dev,qa등 )의프로필이활성화된 경우에만 선언된Spring Bean을 등록하도록 조건을 설정하는어노테이션
▶Spring Bean으로 등록할클래스에 선언@Component @Profile({"test", "qa"}) class Runner implements CommandLineRunner { private MappedByConfig mc; public Runner(MappedByConfig mc) { this.mc = mc; } public void run(String[] args) { System.out.println(mc.toString()); // id=1, name=lee, age=28 } }▶
qa,test환경의프로필인 경우에만Spring Bean으로 등록하여CommanLineRunner실행
- 선언방법
@Profile("환경명"):
。해당환경의프로필이활성화된 경우Spring Bean으로 등록
@Profile({"환경명1", "환경명2", ... }):
。정의된환경의프로필이활성화된 경우Spring Bean으로 등록
@Profile("!환경명")
。해당환경의프로필이활성화되지 않은 경우Spring Bean으로 등록
동일한
인터페이스를 갖는구현체가Spring Bean에 등록된 경우 특정활성화된프로필에 따라서 특정구현체가Spring Bean으로 등록되도록 설정하여의존성주입이 되도록 설정interface ProfileService { void printProfile(); } @Profile("dev") @Service class DevProfileService implements ProfileService { @Override public void printProfile() { System.out.println("dev Profile Service Active."); } } @Profile("local") @Service public class LocalProfileService implements ProfileService { @Override public void printProfile() { System.out.println("local Profile Service Active."); } }▶ 다음처럼
활성화한프로필에 따라 특정Service Class를Spring Bean으로 등록하도록 하여 동일구현체간의존성 주입의 충돌발생을 방지
@ActiveProfiles("환경명")
。Spring에서Test를 수행 시 활성화할Profile을 지정하는어노테이션
▶ 주로Test를 수행 시Test 환경에서 사용할Datasource등DB 환경설정을 정의하는Profile로 전환하는 용도로 사용
。src/test의Test Class에클래스레벨에 선언@DataJpaTest @ActiveProfiles("test") class ProductRepositoryTest { }。 다음
Test Class의Test method실행 시application-test.yml에 정의된DB 환경설정을 기반으로 해당DB에서JPA를 통해Transaction Test를 수행
Environment:org.springframework.core.env
。어플리케이션구동 시의 현재프로필에 대한 정보를 제공하는클래스
。Spring Bean으로서Spring Context에 사전에 등록되어있으므로필드에객체선언 및의존성 주입하여 사용
Environment객체.getActiveProfiles()
。현재활성화된프로필들의 명칭을String[]로 반환