티스토리 뷰
반응형
기본적으로 @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;
}
}
반응형
'Server' 카테고리의 다른 글
[IntelliJ] 검색에서 파일 마스크 처리해서 소스 코드 찾기 (2) | 2023.03.14 |
---|---|
[Chat GPT] 코틀린으로 웹 개발 하는 것에 대해서 에세이를 간단하게 써달라고 했다 (0) | 2023.03.03 |
[Gradle] Execution failed for task ':jar'.> Entry application.properties is a duplicate but no duplicate handling strategy has been set. 이슈 해결 (0) | 2023.02.28 |
[Java] String template 사용하기 (0) | 2023.02.11 |
[Jenkins] 배포 자동화 알림 Slack 으로 전송하기 (0) | 2023.02.06 |
[Java] Java 14 Record, Entity Class로 사용 가능할까? (0) | 2023.02.02 |
댓글
공지사항