스프링 외부설정 2

justindevcode·2024년 5월 31일
0

스프링부트

목록 보기
5/39
post-thumbnail

스프링 외부설정 2

Environment

이전의 Environment가 통합으로 관리해준다는것 다시 확인

  • 정보받고싶은 클레스예시
@Slf4j
 @Data
 public class MyDataSource {
 private String url;
 private String username;
 private String password;
 private int maxConnection;
 private Duration timeout;
 private List<String> options;
 public MyDataSource(String url, String username, String password, int 
maxConnection, Duration timeout, List<String> options) {
 this.url = url;
 this.username = username;
 this.password = password;
this.maxConnection = maxConnection;
 this.timeout = timeout;
 this.options = options;
    }
    @PostConstruct
 public void init() {
        log.info("url={}", url);
        log.info("username={}", username);
        log.info("password={}", password);
        log.info("maxConnection={}", maxConnection);
        log.info("timeout={}", timeout);
        log.info("options={}", options);
    }
 }
  • appliation.properties
my.datasource.url=local.db.com
my.datasource.username=local_user
my.datasource.password=local_pw
my.datasource.etc.max-connection=1
my.datasource.etc.timeout=3500ms
my.datasource.etc.options=CACHE,ADMIN
  • bean으로 위 클레스에 값받기
@Slf4j
 @Configuration
 public class MyDataSourceEnvConfig {
 private final Environment env;
 public MyDataSourceEnvConfig(Environment env) {
 	this.env = env;
    }
    @Bean
public MyDataSource myDataSource() {
 String url = env.getProperty("my.datasource.url");
 String username = env.getProperty("my.datasource.username");
 String password = env.getProperty("my.datasource.password");
 int maxConnection = env.getProperty("my.datasource.etc.max-connection", Integer.class);
 Duration timeout = env.getProperty("my.datasource.etc.timeout", Duration.class);
 List<String> options = env.getProperty("my.datasource.etc.options", List.class);
 return new MyDataSource(url, username, password, maxConnection, timeout, options);
    }
 }

Integer.class이런식으로 두번째 매개변수에 변환될 객체형 넣어주면 그 자료형으로 변환해줌

이방법은 Environment를 사용하긴 했지만 결국 Duration timeout = env.getProperty("my.datasource.etc.timeout", Duration.class);이런 변환 코드 다 적어줘야해서 불편함

@Value

  • 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:2}") // 이런식으로 :2 라고 뒤에 적어주면 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
 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);
    }
 }

두가지 방법 사용가능 설정클레스에서 변수에 @Value("${my.datasource.etc.timeout}")위에 적어주면 들어감
또는 bean 함수 매개변수에 @Value("${my.datasource.url}") String url로 받음
@Value("${my.datasource.etc.max-connection:2}")이런식으로 :2 라고 뒤에 적어주면 my.datasource.etc.max-connection값이 설정파일에없을때 기본값 2로들어감

이 방법도 아까보다는 편하지만 결국 my.datasource.etc.options다 써줘야하는 불편함 있음
결국 my.datasource로 묶이는 값들인데 한번에 어떤 클래스 vo같은 거로 만들어주면 좋지않을까? 해서 나온것이 @ConfigurationProperties 이건 다음에

profile
("Hello World!");

0개의 댓글