스프링 부트(핵심 원리와 활용)

Ch06. 외부설정과 프로필(2) - 외부 설정 사용(@Value)

webmaster 2023. 3. 15. 01:27
728x90

@Value를 사용하면 외부 설정값을 편리하게 주입받을 수 있다.
참고로 @Value 도 내부에서는 Environment를 사용한다.

MyDataSourceValueConfig

@Slf4j
@Configuration
public class MyDataSourceValueConfig {

  @Value("${my.datasource.url}")
  private String url;
  @Value("${my.datasource.username}")
  private String username;
  @Value("${my.datasource.password}")
  private String password;
  @Value("${my.datasource.etc.max-connection}") 
  private int maxConnection;
  @Value("${my.datasource.etc.timeout}")
  private Duration timeout;
  @Value("${my.datasource.etc.options}")
  private List<String> options;


  @Bean
  public MyDataSource myDataSource1() {
    return new MyDataSource(url, username, password, maxConnection, timeout, options);
  }

  @Bean //파라미터 주입 //알아서 converting 해준다
  public MyDataSource myDataSource2(
      @Value("${my.datasource.url}") String url,
      @Value("${my.datasource.username}") String username,
      @Value("${my.datasource.password}") String password,
      @Value("${my.datasource.etc.max-connection}") int maxConnection,
      @Value("${my.datasource.etc.timeout}") Duration timeout,
      @Value("${my.datasource.etc.options}") List<String> options
  ) {
    return new MyDataSource(url, username, password, maxConnection, timeout, options);
  }
}
  • @Value에 ${}를 사용해서 외부 설정의 키 값을 주면 원하는 값을 주입 받을 수 있다.
  • @Value 는 필드에 사용할 수도 있고, 파라미터에 사용할 수도 있다.
    • myDataSource1() 은 필드에 주입 받은 설정값을 사용한다.
    • myDataSource2() 는 파라미터를 통해서 설정 값을 주입 받는다.

기본값

만약키를 찾지 못할 경우 코드에서 기본값을 사용하려면 다음과 같이 ":" 뒤에 기본값을 적어주면 된다.
) @Value("${my.datasource.etc.max-connection:1}") : key 가 없는 경우 1을 사용한다.

@Slf4j
@Configuration
public class MyDataSourceValueConfig {

  @Value("${my.datasource.url}")
  private String url;
  @Value("${my.datasource.username}")
  private String username;
  @Value("${my.datasource.password}")
  private String password;
  @Value("${my.datasource.etc.max-connection:2}") //디폴트 값 적용 가능
  private int maxConnection;
  @Value("${my.datasource.etc.timeout}")
  private Duration timeout;
  @Value("${my.datasource.etc.options}")
  private List<String> options;


  @Bean
  public MyDataSource myDataSource1() {
    return new MyDataSource(url, username, password, maxConnection, timeout, options);
  }

  @Bean //파라미터 주입 //알아서 converting 해준다
  public MyDataSource myDataSource2(
      @Value("${my.datasource.url}") String url,
      @Value("${my.datasource.username}") String username,
      @Value("${my.datasource.password}") String password,
      @Value("${my.datasource.etc.max-connection:2}") int maxConnection,
      @Value("${my.datasource.etc.timeout}") Duration timeout,
      @Value("${my.datasource.etc.options}") List<String> options
  ) {
    return new MyDataSource(url, username, password, maxConnection, timeout, options);
  }
}
  • max-connection 같은 경우 기본값이 적용이 된다.

 application.properties

my.datasource.url=local.db.com
my.datasource.username=username
my.datasource.password=password
#my.datasource.etc.max-connection=1
my.datasource.etc.timeout=3500ms
my.datasource.etc.options=CACHE,ADMIN

실행하기

ExternalReadApplication - 수정

//@Import(MyDataSourceEnvConfig.class)
@Import(MyDataSourceValueConfig.class)
@SpringBootApplication(scanBasePackages = "hello.datasource")
public class ExternalReadApplication {

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

}
  • @Import(MyDataSourceEnvConfig.class) 를 주석처리 한다.
  • @Import(MyDataSourceValueConfig.class) 를 추가 한다.

단점

@Value를 사용하는 방식도 좋지만, @Value로 하나하나 외부 설정 정보의 키 값을 입력받고, 주입받아와야 하는 부분이 번거롭다.
그리고 설정 데이터를 보면 하나하나 분리되어 있는 것이 아니라 정보의 묶음으로 되어 있다.
여기서는 my.datasource 부분으로 묶여있다. 이런 부분을 객체로 변환해서 사용할 수 있다면 더 편리하고 더 좋을 것이다.

728x90