Spring Boot - Profile ( @Profiles, @ActiveProfiles )

이정수·2025년 10월 18일

Spring Boot

목록 보기
13/25

Profiles
어플리케이션의 다양한 환경(Environments) 별 설정(Configuration)을 제공하는 기법.
▶ 각 환경에 대한 별도의 profile을 생성하여 profile 별 다른 Configuration을 제공

application-환경명.yml환경을 사용하도록 설정 시 기존 application.yml의 환경과 병합해서 환경이 구성
application-환경명.yml의 우선순위가 더 높다.

어플리케이션은 여러개의 yml 파일을 생성하여 환경Profile을 정의할 수 있음.
profile 양식 : application-환경명.yml
Springbootstrap.yml -> application.yml -> application-프로필.yml순으로 설정파일을 읽는다.

Spring Boot 는 활성화된 Profile(application-{profile}.yml)을 다음 위치에서 찾음
src/main/resources, src/test/resources
ex)
Dev EnvironmentsDev DB와 통신하며 , Test EnvironmentsTest 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.ymlapplication-prod.ymlconfiguration이 병합
▶ 이때 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 ClassSpring Bean으로 등록하도록 하여 동일 구현체의존성 주입의 충돌발생을 방지

@ActiveProfiles("환경명")
Spring에서 Test를 수행 시 활성화할 Profile을 지정하는 어노테이션
▶ 주로 Test를 수행 시 Test 환경에서 사용할 DatasourceDB 환경설정을 정의하는 Profile로 전환하는 용도로 사용

src/testTest Class클래스레벨에 선언

@DataJpaTest
@ActiveProfiles("test")
class ProductRepositoryTest {
}

。 다음 Test ClassTest method 실행 시 application-test.yml에 정의된 DB 환경설정을 기반으로 해당 DB에서 JPA를 통해 Transaction Test를 수행

Environment : org.springframework.core.env
어플리케이션 구동 시의 현재 프로필에 대한 정보를 제공하는 클래스

Spring Bean으로서 Spring Context에 사전에 등록되어있으므로 필드객체 선언 및 의존성 주입하여 사용

  • Environment객체.getActiveProfiles()
    。현재 활성화프로필들의 명칭을 String[]로 반환
profile
공부기록 블로그

0개의 댓글