본문 바로가기
공부방

[TIL 06/22] Environment, Properties, Profile

by hseong 2023. 6. 22.

1. Environment

  • 스프링은 설정 파일에 대한 접근을 추상화한 Environment를 제공한다.
  • ApplicationContextEnvironmentCapable 인터페이스를 상속받아 Environment에 접근할 수 있는 방법을 제공한다.
  • applicationContext.getEnvironment()Environment 인스턴스를 얻어와 environment.getProperty(key)를 통해서 값을 조회할 수 있다.
  • Environment는 빈으로 등록되어 있기 때문에 스프링 컨테이너로부터 직접 주입받을 수 있다.
  • Environment를 통해 특정 외부 설정에 종속되지 않고, 일관성 있게 key=value 형식의 외부 설정에 접근할 수 있다.
    @Configuration
    public class EnvConfig {
    private final Environment env;
    
    public EnvConfig(Environment env) {
        this.env = env; 
    } 
    }
  • Environment env = applicationContext.getEnvironment(); env.getProperty(key);

2. Properties

  • 스프링은 application.properties라는 이름의 설정 파일을 통해서 실행 환경에 따라 서로 다른 속성을 읽어들이도록 구성할 수 있다.
  • 스프링은 다양한 외부 설정을 입력받기 위한 방법을 추상화하여 인터페이스로 제공한다. 개발자가 application.properties를 자바를 실행하는 위치에 만들어두면 스프링은 해당 파일을 읽어 사용할 수 있는 구현체를 제공한다.
  • 스프링은 다양한 properties를 미리 정의해두었다. 만일 우리가 새로운 설정 정보를 구성하고자 한다면 key=value 형태로 작성할 수 있다.
  • 스프링 프레임워크에서 application.properties를 사용하기 위해서 @PropertySource를 이용해서 application.properties의 위치를 지정해준다.
    @Configuration
    @PropertySource(value = "application.properties")
    public class AppConfig {
    }
  • @PropertySource
  • 이후 Environment 인스턴스를 얻어와 외부 설정을 조회할 수 있다.
  • 스프링 부트는 resource 디렉터리 아래 application.properties 파일을 자동으로 로드하기 때문에 추가적인 properties를 등록하고자 할 때 사용하면 된다.
  • 이러한 설정 파일의 정보를 코드에서 이용하기 위한 다양한 방법이 있다.
  • Environment
  • Environment를 이용하면 외부의 설정의 종류와 관계 없이 코드 안에서 일관성 있게 외부 설정 조회가 가능하다.
  • env.getProperty(key, type)을 통해 호출시 타입 정보를 인수로 전달하면 해당 타입으로 변환해준다.
  • @Configuration public class EnvConfig { private final Environment env; public EnvConfig(Environment env) { this.env = env; } @Bean public EnvProvider envProvider() { String version = env.getProperty("version"); String url = env.getProperty("spring.datasource.url"); return new EnvProvider(version, url); } }

@Value

  • @Value("${key}")를 통해 외부 설정의 키 값을 주어 원하는 값을 주입 받을 수 있다.
  • 필드에도 사용가능하고 파라미터에도 사용할 수 있다.
  • 만일 존재하지 않는 key 값을 전달하면 해당 key 자체를 문자열로 해당 필드에 주입한다.
  • @Value("${key:defaultValue}")와 같이 외부 설정에서 해당하는 키 값을 찾지 못할 경우 :(콜론) 뒤에 기본값을 줄 수 있다.
  • 해당 어노테이션을 이용하여 환경 변수의 값도 가져올 수 있다. 만일 properties의 key 값과 충돌하는 경우 환경 변수 값을 우선해서 가져온다.
  • @Configuration public class EnvConfig { @Value("${version}") private String version; @Value("${spring.datasource.url}") private String url; @Bean public EnvProvider envProvider() { return new EnvProvider(version, url); } //또는 @Bean public EnvProvider envProvider( @Value("${version}") String version, @Value("${spring.datasource.url}") String url) { return new EnvProvider(version, url); } }

@ConfigurationProperties

  • properties를 사용하는 클래스에서 직접 주입받아 사용할 수도 있다.
  • 기본 주입 방식은 자바빈 프로퍼티 방식으로 Getter, Setter가 필요하다. 대신 생성자 주입 방식도 이용할 수 있다.
  • 이 방식을 사용하는 경우 자바 빈 밸리데이션을 통해 검증을 수행할 수도 있다.
  • 외부 설정을 자바 코드로 관리함으로써 타입 안전한 설정 속성을 가진다.
    @ConfigurationProperties("spring.datasource")
    public class DataProperties {
    private String url;
    private String username;
    private String password;
    
    public DataProperties(String url, String username, String password) {
        this.url = url;
        this.username = username;
        this.password = password;
    }
    }
  • @Getter @Settter @ConfigurationProperties("spring.datasource") public class DataProperties { private String url; private String username; private String password; }

3. Profile

  • 스프링은 프로파일을 미리 정의해놓고 원하는 프로파일을 선택하여 애플리케이션을 기동할 수 있는 방법을 제공한다.
  • @Bean 등록 시 프로파일을 지정하거나 @Component로 등록시 @Profile 어노테이션을 이용하여 프로파일을 구분할 수 있다.
    @Configuration
    public class AppConfig {
    @Bean
    @Profile("dev")
    public DevBean devBean() {
        return new DevBean(); 
    }
    
    @Bean
    @Profile({"local", "default"})
    public LocalBean localBean() {
        return new LocalBean(); 
    } 
    }
  • @Repository @Profile("local") public class LocalRepository() { }
  • 또한 properties 설정 파일도 프로파일에 따른 구분이 가능하다.
  • properties의 경우 #--- 또는 !--- yml의 경우 --- 를 이용하여 각 프로파일의 영역을 구분한다.
  • 각 영역은 spring.config.activate.on-profile에 value를 지정하여 프로파일을 지정할 수 있다. 만일 프로파일을 지정하지 않는다면 기본값으로 사용된다.
    url=local.com
    username=local_sa
    password=local_pw
    #---
    spring.config.activate.on-profile=dev
    url=dev.com
    username=dev_sa
    password=dev_pw
  • application.properties
  • 스프링 부트를 사용하는 경우 각 프로파일에 따른 실행을 위해서 인텔리제이에서는 Edit Configuration -> Active profiled로 간단하게 프로필의 변경이 가능하다.
  • jar 파일로 실행하는 경우 spring.profiles.active=profile을 인수로 전달하면 원하는 프로파일로 실행이 가능하다.

4. Resource

  • 스프링은 이미지, 텍스트 파일, 웹 등을 읽어들이기 위한 ResourceResourceLoader 인터페이스를 제공한다.
  • ApplicationContextDefaultResourceLoader를 상속하고 있기 때문에 applicationContext로부터 리소스를 받아올 수 있다.
  • 리소스를 받아오기 위해서는 applicationContext.getResource(location)에 파일의 위치를 전달하여야 한다.
  • 받아온 리소스로부터 resource.getFile()을 통해 실제 파일 객체를 가져올 수 있다.
    Resource resource = ac.getResource("file:src/main/resources/text.txt");
    File file = resource.getFile();
  • 스프링은 원하는 리소스의 경로를 지정할 때 스키마를 전달할 수 있다. 이를 통해 우리는 리소스의 특정 구현체를 알 필요 없이 인터페이스를 통해 가져올 수 있는 일관된 방법을 제공한다.

'공부방' 카테고리의 다른 글

[TIL 06/26] 테스트  (0) 2023.06.29
[TIL 06/23] Logging, Logback  (0) 2023.06.23
[TIL 06/21] 컴포넌트 스캔, 빈 스코프, 빈 라이프사이클  (0) 2023.06.21
[TIL 06/20] IoC, DI, ApplicationContext  (0) 2023.06.20
[TIL 06/19]  (0) 2023.06.19