지난 포스팅에서는 Enviroment를 사용하여 외부설정을 읽어보았다.
이번 포스팅에서는 @Value로 외부설정을 읽어보겠다. 어노테이션을 활용하면 좋은 이유는 개발자가 만들어야 할 코드가 줄어든다는 점이다.
Enviroment의 경우, 외부설정을 가져오는 코드를 개발자가 직접 작성해야 한다.
@Slf4j
@Component
public class EnviromentCheck {
private final Environment env; //Enviroment와 연관관계
public EnviromentCheck(Environment env) { //Bean 생성시, Enviroment 객체 주입
this.env = env;
}
@PostConstruct //의존성 주입이 이루어진 후, 수행되는 메소드 지정하는 어노테이션
public void init(){
String url = env.getProperty("url"); // VM옵션에서 가져오기
String name = env.getProperty("name"); // 커맨드라인에서 가져오기
log.info("url = {}",url);
log.info("name = {}",name);
}
}
이와 같이,
생성자로 Enviroment를 주입받는 코드와 getProperty() 메소드로 설정을 가져오는 코드를 개발자가 직접 작성해야 한다.
@Value를 사용하면
EnviromentCheck 같은 추가적인 코드 작성을 최소화 할 수 있다.
먼저 설정파일부터 만들어보자.
application.properties
my.datasource.url=my.db.com
my.datasource.username =my_user
my.datasource.password=my_pw
your.datasource.url=your.db.com
your.datasource.username=your_user
your.datasource.password=your_pw
설정은 my.datasource 설정과 your.datasource 설정 2가지이다.
DataSource.java
@Slf4j
@Data
@RequiredArgsConstructor
public class DataSource {
private final String url;
private final String username;
private final String password;
@PostConstruct
public void init(){
log.info("url = {}", url);
log.info("username = {}", username);
log.info("password = {} " , password);
}
}
설정값이 담길 클래스 하나를 생성한다.
@PostConstruct 어노테이션은 설정값이 주입되면 로그를 찍는 메소드를 실행한다.
DataSourceConfig.java
@Slf4j
@Configuration
public class DataSourceConfig {
@Value("${my.datasource.url}")
private String url;
@Value("${my.datasource.username}")
private String username;
@Value("${my.datasource.password}")
private String password;
//멤버변수로 설정 주입받기 ( my.datasource )
@Bean
public DataSource myDataSource(){
return new DataSource(url,username,password);
}
//매개변수로 설정 주입받기 ( your.datasource )
@Bean DataSource yourDataSource(@Value("${your.datasource.url}")String url ,@Value("${your.datasource.username}")String name, @Value("${your.datasource.password}")String password){
return new DataSource(url,name,password);
}
}
DataSourceConfig 설정클래스를 만들어보았다. DataSource 객체를 Bean으로 생성하여 IOC컨테이너에 등록할 것이다. 이때 하나는 my.datasource 설정을, 다른 하나는 your.datasource 설정을 주입한다.
형식 : @Value("${my.datasource.url}")
설정값은
멤버변수에 주입하거나
매개변수에 주입해야한다. (로컬변수 주입X)
my.datasource는 멤버변수로 your.datasource는 매개변수로 설정을 넣었다.
그럼 SpringBoot를 실행해보자.
DataSource 객체가 Bean으로 등록되면서 로그를 찍었다.
@Value 또한 내부적으로는 Enviroment 객체를 사용하지만 @Value를 사용하면 개발자가 직접 Enviroment 관련 코드를 작성하지 않아도 설정을 주입할 수 있어 편리하다.
@Value에는 두 가지 문제가 있다.
1) 변수마다 @Value를 선언해야한다.
설정이 필요한 모든 변수에 @Value를 선언하니 번거롭다.
2) @Value는 변수에 값을 주입하다보니 보안 및 가공이 어렵다.
외부설정을 바로 변수에 주입하지 않고
외부설정을 '객체화'하면 다양한 작업이 가능해진다.
application.properties의 설정을 객체로 만드는 어노테이션이 존재한다. 이는 다음 포스팅에서 다루어보겠다.
참고자료
'SPRING > Spring Boot' 카테고리의 다른 글
[SpringBoot] 엑츄에이터(Actuator)(1) - Actuator란? (0) | 2023.05.11 |
---|---|
[SpringBoot] 외부설정 가져오기(3) - @ConfigurationProperties (1) | 2023.05.07 |
[SpringBoot] Profile 사용하기 (0) | 2023.05.07 |
[SpringBoot] 설정파일(application.properties) (0) | 2023.05.05 |
[SpringBoot] 외부설정 가져오기(1) - Enviroment (0) | 2023.05.05 |