생성자 주입 시 자동으로 주입되지 않는 기본 자료형과 문자열의 값을 설정한다.
@ConfigurationProperties 어노테이션을 달고있는 클래스의 필드에 값을 저장하고 그 값을 사용하는 방법도 여기에 있다. 하지만, 현재 진행하는 프로젝트에서 application.yml에 있는 값 딱 하나만 가져다 쓸건데 그거에 대한 클래스를 하나 만들어서 사용하자니 낭비고, 어노테이션 하나로 해결이 가능하다는 사실을 알게 되었다. 그 어노테이션이 바로 @Value다.
사용 방법은 다음과 같다.
application.yml
my:
name: duck
age: 23
이 파일에 있는 값들을 가져와 필드에 저장하고 싶다면 아래와 같이 어노테이션을 달아주면 끝이다.
xxx.java의 일부
@Value("${my.name}")
String name;
@Value("${my.age}")
String age;
근데... 본인은 @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가 작업을 시작하지 않아서 그렇다는 생각이 든다.)
@Service
public class Service {
public Service(@Value("${value.test}") String test) {
// 대충 test를 사용하는 코드
// test 값을 확인하기 위한 출력
System.out.println(test);
}
}
이렇게 말이다. 실행시켜보면 test에 정상적으로 값이 출력되는 것을 확인할 수 있다.
클래스의 필드냐 생성자의 인자느냐에 따라 @Value가 작동하는 순서가 다른 것으로 추정되는데, 정확한 내용은 좀 더 공부해봐야 알 것 같다.
도움 되었어요. 감사합니다.