Spring에서 @Value 애노테이션은 설정 파일(yml, properties)에 있는 정보를 가져오는데 주로 사용됩니다.
@Value로 설정 파일 값을 가져오는 변수가 null인 경우 점검해보아야 하는 부분을 정리하였습니다.
1. 어느 @Value 애노테이션을 사용했는지 import 확인
lombok이 아닌 spring 애노테이션을 사용하자
import org.springframework.beans.factory.annotation.Value;
2. static 변수에는 값을 넣을 수 없다.
예시는 application.properties 파일에서 active.root 값을 Config class에서 path 변수에 저장해서 사용하고 있습니다.
path 변수를 클래스 변수(static 변수)로 지정해서 테스트 해보도록 하겠습니다.
Config.java
@Component
public class Config {
@Value("${active.root}")
private static String path;
public String getPath() {
return path;
}
}
application.properties
active.root=home
Test Code
@SpringBootTest
class ConfigServiceTest {
@Autowired
Config config;
@Test
void findActiveRootTest() {
String root = "home";
Assertions.assertEquals(config.getPath(), root);
}
}
Test Code 결과
org.opentest4j.AssertionFailedError:
Expected :null
Actual :home
null 이 출력되는 것을 확인할 수 있습니다.
Config class에서 static 변수를 일반 전역 변수로 수정하면 문제를 해결됩니다.
3. Spring Bean으로 생성된 객체가 아닌 경우
Spring은 애플리케이션 로딩 시점에 스프링 컨테이너 내부에서 모든 빈들을 등록하면서 @Value 애노테이션 안의 값들을 설정 파일에서 읽어들여 변수에 저장합니다.
그 결과 Spring에서 싱글톤으로 관리되는 빈이 아닌 새로운 객체로 생성하게 되면 @Value 애노테이션으로 설정 파일을 읽어들이는 변수는 null로 값이 저장되지 않습니다.
Test Code
- @Autowired를 제거하고 new를 이용해서 Config 인스턴스를 생성하였습니다.
@SpringBootTest
class ConfigServiceTest {
@Test
void findActiveRootTest() {
Config config = new Config();
String root = "home";
Assertions.assertEquals(config.getPath(), root);
}
}
Test Code 결과
org.opentest4j.AssertionFailedError:
Expected :null
Actual :home
Test Code
- 정상으로 값이 저장되는 경우
- new 연산자를 이용해서 인스턴스를 생성해서 사용하고 있는 것은 아닌지 확인해 보자!
@SpringBootTest
class ConfigServiceTest {
@Autowired
Config config;
@Test
void findActiveRootTest() {
String root = "home";
Assertions.assertEquals(config.getPath(), root);
}
}
'Spring' 카테고리의 다른 글
토이 프로젝트_ STEP 05(AWS Route53) (0) | 2022.11.20 |
---|---|
토이 프로젝트_STEP 04(Jenkins pipeline 배포) (0) | 2022.11.20 |
[Spring] 동시성 해결(ThreadLocal) (0) | 2022.09.06 |
토이 프로젝트 _ STEP 03(Web Application 개발) (0) | 2022.08.15 |
[SpringBoot] Interceptor 적용하기 (0) | 2022.06.23 |