SPRING/Spring Boot

[SpringBoot] 외부설정 가져오기(2) - @Value

IT록흐 2023. 5. 7. 17:31
반응형
 

[SpringBoot] 외부설정 통합 - Enviroment

Application은 외부에서 설정을 가져올 수 있다. 외부설정을 가져 오는 방법은 다양한데, SpringBoot는 최대한 통합하고 추상화하여, 외부설정을 간단히 조작할 수 있도록 기능을 제공한다. 그럼 SpringB

lordofkangs.tistory.com

 

 

지난 포스팅에서는 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의 설정을 객체로 만드는 어노테이션이 존재한다. 이는 다음 포스팅에서 다루어보겠다.

 

 


 

참고자료

 

스프링 부트 - 핵심 원리와 활용 - 인프런 | 강의

실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., - 강의 소개 | 인프런

www.inflearn.com

 

반응형