[Spring][IoC] Environment, 프로파일 및 프로퍼티

2022. 9. 1. 17:22JAVA/Spring

1. 프로파일(Profile)이란 무엇인가?

  • 프로파일은 빈(Bean)들의 그룹을 의미하는데 애플리케이션 실행시 프로파일을 설정하여 특정한 빈들의 그룹을 실행시킬 수도 있고 아니면 프로파일을 설정하지 않아서 런타임시 빈들을 활성화시키지 않을 수 있습니다.
  • 예를 들어 테스트 환경에서는 A라는 빈을 사용하고, 배포환경에서는 A 빈을 사용하지 않고 싶다면 A 빈에 프로파일을 정의하여 배포시 비활성화 시킬 수 있습니다.

 

2. 프로파일 정의하기

프로파일을 정의하는 방법

  • 클래스에 정의
    • @Configuration @Profile("test")
    • @Component @Profile("test")
  • 메서드에 정의
    • @Bean @Profile("test")
@Repository
@Profile("test") // 프로파일 정의 방법 3
public class BookRepository {
}

 

@Configuration
@Profile("test") // 프로파일 정의 방법1
public class TestConfiguration {
    // 이 빈설정은 테스트 프로파일일때만 활성화되는 빈입니다.
    @Bean
//    @Profile("test") // 프로파일 정의 방법 2
    public TestBookRepository testBookRepository(){
        return new TestBookRepository();
    }
}

 

3. 프로파일 설정하기

런타임 실행 환경에서 다음과 같이 프로파일을 설정하고 애플리케이션을 실행하면 특정환 환경에서 빈들을 활성화시킬 수 있습니다.

  • 프로파일 설정 방법  1 : VM 옵션 입력창에 -Dspring.profiles.active="test, A, B, ...", 입력하고 실행
  • 프로파일 설정 방법 2 : 인텔리제이 얼티메이트에서는 활성화된 프로파일 입력창에 활성화할 프로파일을 입력할 수 있습니다. 설정할 프로파일이 여러개라면 쉼표를 통해 구분할 수 있습니다. "test, A, B, ..."

테스트 코드는 다음과 같습니다.

@Repository
@Profile("test") // 프로파일 정의 방법 3
//@Profile("!prod") // 프로파일 설정이 prod가 아닌 경우에 이 빈을 활성화시킴
//@Profile("!prod && test") // 논리식 사용 가능
public class BookRepository {
}

public class TestBookRepository {
}


@Configuration
@Profile("test") // 프로파일 정의 방법1
public class TestConfiguration {
    // 이 빈설정은 테스트 프로파일일때만 활성화되는 빈입니다.
    @Bean
//    @Profile("test") // 프로파일 정의 방법 2
    public TestBookRepository testBookRepository(){
        return new TestBookRepository();
    }
}
@Component
public class AppRunner implements ApplicationRunner {
    @Autowired
    ApplicationContext ctx;

    @Autowired
    TestBookRepository testBookRepository;

    @Autowired
    BookRepository bookRepository;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        //given
        Environment environment = ctx.getEnvironment();
        //when
        String[] activeProfiles  = environment.getActiveProfiles();
        String[] defaultProfiles = environment.getDefaultProfiles();
        //then
        System.out.println(Arrays.toString(activeProfiles)); // [test]
        System.out.println(Arrays.toString(defaultProfiles)); // [default]
    }
}
[test]
[default]

위 실행결과를 통해 활성화된 프로파일이 test인 것을 볼 수 있습니다.

 

4. 프로퍼티(Property)

*.properties 파일과 같은 곳에 설정 값을 저장해두고 Environemnt가 프로퍼티 소스를 설정하거나 가져올 수 있습니다.

 

프로퍼티 우선순위

  • StandardServletEnvironment의 우선순위
    • ServletConfig 매개변수
    • ServletContext 매개변수
    • JNDI(java:comp/env/)
    • JVM 시스템 프로퍼티(-Dkey=”value”)
    • JVM 시스템 환경 변수 (운영체제 환경변수)

 

@PropertySource

@PropertySource 어노테이션을 적용하여 프로퍼티 파일의 값을 가져올 수 있습니다.

@SpringBootApplication
@PropertySource(value = "classpath:/app.properties")
public class ProfileApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProfileApplication.class, args);
    }

}

app.properties

app.name=spring

 

테스트코드

@Component
public class AppRunner implements ApplicationRunner {
	...
    
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment = ctx.getEnvironment();
        System.out.println(environment.getProperty("app.name")); // output : spring
    }

}
spring

 

 

References

source code : https://github.com/yonghwankim-dev/spring_study/tree/master/profile/src/main/java/kr/yh/profile
[인프런] 스프링 프레임워크 핵심기술