Java / / 2022. 7. 28. 16:55

[Spring] @Profile, @ActiveProfiles

반응형

 

@Profile

  • 빈이나, 컴포넌트에게 프로필을 구분하여 빈을 로드할 수 있음

 

@ActiveProfiles

  • 테스트 수행 시 특정 빈만 로드하면서 테스트를 수행할 수 있음

서론

서버를 실행할 때는 아래와 같이 모두 몇 가지의 목적 있고 각기 다른 설정을 주고 싶을 수가 있다.

  1. 로컬로 애플리케이션을 구동한다. (인 메모리 DB 연결 및 요청에 맞는 파라미터 값)
  2. 테스트를 구동한다. (인 메모리 DB 연결 및 요청에 맞는 파라미터 값)
  3. 실제 운영을 하기 위한 배포를 한다. (실제 실무에 사용하는 DB 연결 및 요청에 맞는 파라미터 값)

 

이런 경우 사용하는 것이 @Profile이다.

해당 어노테이션을 알아보기 이전에 properties/yml 설정 파일을 살펴보며 profiles가 무엇인지 간략히 보자.

spring:
  profiles:
    active: local

---

spring:
  profiles: local
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:

---

spring:
  profiles: prod
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:8080/db_name?serverTimezone=UTC&characterEncoding=UTF-8
    username: sa
    password:

위의 코드를 보면 하나의 파일에 여러개의 profiles에 대한 설정을 해준 것을 알 수 있다.

현재 설정은 맨 위의 local을 active 하고있다.(profile:local의 설정이 세팅되어 실행될 것이다.)

이런 것에 profiles이다.


@ActiveProfiles

테스트 수행 시에 어떤 profile을 사용할 것인지 정해주는 어노테이션이다.

@SpringBootTest
@ActiveProfiles("local")
class TestConfiguration {

    @Autowired
    Test test;

    @Test
    void testGetPlaceNo() {
		System.out.println('test');
    }
}

위와 같이 @ActiveProfiles("local")라고 붙였기 때문에, local profiles로 세팅되어 실행하게 된다.

 

처음에 살펴본 것을 보면 yml 파일에서는 한 파일에 여러 profiles들을 선언해 주었다.

이것은 다음과 같이 나눌 수가 있다.

이렇게 application-{profiles}.properties로 파일명을 붙여서 구분 가능하다.(yml도 가능)

사실 이 상태로 그냥 실행하게 되면 어떤  profiles를 사용해야 할지 모르기 때문에 runtime Error가 발생할 수 있다.

그래서 application.properties를 추가한 후에 spring.profiles.active=local을 추가해서 지정해줘야 한다.

테스트 코드에서 @ActiveProfiles를 사용한 경우에는 상관없다.

 

 

application.properties (profile이 없는 상태 = default)

아무런 profile을 작성하지 않을 경우 Spring boot는 default라는 기본 값을 사용한다.

그렇다고 하여 application-default.properties가 존재해야 한다는 것은 아니다.

profile이 없다면 application.properties를 가져온다.

 

스프링 부트 설정 = build.gradle 수정

  • gradle bootRun 일 때 스프링 부트가 제공하는 spring.profiles.active를 적용받기 위해 아래와 같은 설정을 추가해 준다.
bootRun {
    String activeProfile = System.properties['spring.profiles.active']
    if (activeProfile == null) {
        activeProfile = "local"
    }
    systemProperty "spring.profiles.active", activeProfile
}

 

gradle CLI

  • cli 환경에서 세팅할 경우
gradle bootRun -Dspring.profiles.active=prod
# -Dspring.profiles.active=prod
# -Dspring.profiles.active=dev
# -Dspring.profiles.active=stage

 


참고 

빌드할 때

(테스트 코드 실행 시 프로필 설정이 필요한 경우에만)

gradle build -Dspring.profiles.active=local 

Jar 실행할 때

java -jar -Dspring.profiles.active=local [jar_name].jar

Jar 실행할 때 참고 예시

nohup java -jar -Dspring.profiles.active=prd Test-batch.jar > /dev/null 2>&1 &
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유