티스토리 뷰

반응형

기본적으로 @Value 어노테이션은 Spring boot에서 제공하는 환경 프로퍼티 값에서 데이터를 가져오는 방법중에 하나로 사용됩니다. 사용법은 아래에 예시로 표현해보았습니다. 

 

application.yml

domain:
  url: "https://abbo.tistory.com"

 

Annotation class

@org.lombok.Data
public class AnnotationClass {
    @Value("${domain.url}")
    private String domainUrl;
}


public class MainClass {
    public static void main(String[] args) {
        AnnotationClass clazz = new AnnotationClass();
        System.out.print(clazz.getDomainUrl()); // https://abbo.tistory.com
    }
}

 

하지만 static 의 경우 컴파일 에러가 발생하지는 않지만, 그리고 정상적으로 수행되는 것 같지만 아래와 같은 차이가 있습니다.

@org.lombok.Data
public class AnnotationClass {
    @Value("${domain.url}")
    private static String domainUrl;
}


public class MainClass {
    public static void main(String[] args) {
        AnnotationClass clazz = new AnnotationClass();
        System.out.print(clazz.getDomainUrl()); // null
    }
}

 

왜 null 이라는 것으로 표현되는 것일까요? 이유는 간단합니다. 바로 Annotation 이 저장되는 heap 영역과 static 영역은 공간이 분리되어 있어 다르기 때문입니다. JVM 자체에서 Static, Stack, Heap 영역이 기본적으로 나뉘는 것이 핵심입니다. 

  • heap: IoC 가 되어 어노테이션이 저장되는 공간, Spring boot 에서 사용합니다.
  • static: 전역 변수, 정적 멤버 변수 메모리 영역, 클래스나 변수 정보, 메서드 정보등을 저장합니다.

 

그렇기 때문에 static의 데이터를 set하는 것은 기본적으로 어려운 부분이 있고, @Value 만으로는 데이터를 set 하여 get 할 수 없습니다. 

 

@Value 를 set 하는 방법

public class AnnotationClass {
    public static String domainUrl;
    
    @Value("${domain.url}")
    public void setKey(String value) {
        domainUrl = value;
    }
}

 

반응형
댓글
공지사항