@Value로 application.yml의 값 가져오기

지니·2021년 7월 21일
8

대학생의 일기

목록 보기
7/17

@Value

@Value란?

생성자 주입 시 자동으로 주입되지 않는 기본 자료형과 문자열의 값을 설정한다.


@Value로 application.yml의 값 가져오는 방법

@ConfigurationProperties 어노테이션을 달고있는 클래스의 필드에 값을 저장하고 그 값을 사용하는 방법도 여기에 있다. 하지만, 현재 진행하는 프로젝트에서 application.yml에 있는 값 딱 하나만 가져다 쓸건데 그거에 대한 클래스를 하나 만들어서 사용하자니 낭비고, 어노테이션 하나로 해결이 가능하다는 사실을 알게 되었다. 그 어노테이션이 바로 @Value다.

사용 방법은 다음과 같다.


application.yml

my:
  name: duck
  age: 23

이 파일에 있는 값들을 가져와 필드에 저장하고 싶다면 아래와 같이 어노테이션을 달아주면 끝이다.


xxx.java의 일부

@Value("${my.name}")
String name;

@Value("${my.age}")
String age;

@Value로 설정한 값을 생성자에서 사용하기

근데... 본인은 @Value로 받아온 값을 생성자(정확히는 @Service를 달고있는 클래스의 생성자) 사용하고 싶었고 일단 코드를 아래와 같은 형태로 작성했었다.

@Service
public class Service {
	@Value("${value.test}")
	private String test;
    
    public Service() {
    	// 대충 test를 사용하는 코드
        
        // test 값을 확인하기 위한 출력
        System.out.println(test);
    }
}

아니 근데... test를 출력하는데 null이 나오더라...


찾아보니까 @Value는 Bean 간의 주입을 모두 마친 후에 작업을 시작한다고 한다. 따라서, Service가 주입되는 과정에서는 @Value가 작업을 하지 않아 null이 출력되는 것이다.
(+ 필드를 static으로 선언하면 Bean보다 빨리 생성되는 글도 보긴 했는데 저 상태에서 static만 붙인다고 해결되지는 않는다. 아마 생성만 빨리 되지 Bean 간 주입이 완료될 때까지 @Value가 작업을 시작하지 않아서 그렇다는 생각이 든다.)


그래서, 본인은 아예 @Value를 갖는 변수를 생성자의 인자로 받는 방향으로 해결하였다.
@Service
public class Service {
	public Service(@Value("${value.test}") String test) {
    	// 대충 test를 사용하는 코드
        
        // test 값을 확인하기 위한 출력
        System.out.println(test);
    }
}

이렇게 말이다. 실행시켜보면 test에 정상적으로 값이 출력되는 것을 확인할 수 있다.


클래스의 필드냐 생성자의 인자느냐에 따라 @Value가 작동하는 순서가 다른 것으로 추정되는데, 정확한 내용은 좀 더 공부해봐야 알 것 같다.

profile
Coding Duck

1개의 댓글

comment-user-thumbnail
2021년 10월 13일

도움 되었어요. 감사합니다.

답글 달기