Server
[Java] @Value Annotation static 변수로 선언하기
니용
2023. 2. 24. 00:41
반응형
기본적으로 @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;
}
}
반응형