반응형

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);
    }

}
728x90
반응형

+ Recent posts