개발하는 자몽

[Spring] @Value과 static 변수 본문

Java & Kotlin/Spring

[Spring] @Value과 static 변수

jaamong 2024. 12. 16. 21:06

일반적으로 Spring 애플리케이션에서 application.yml에 정의된 값을 static 변수에서 사용할 수 없다. 따라서 Spring에서 제공하는 `@Value` 애노테이션으로 설정 파일에 정의된 값을 static 변수에 주입하면 에러가 발생한다. 

 

Java의 static 변수는 아래 시점에 메모리에 저장된다.

 

  • 스프링 컨테이너(Application Context)가 로드되기 전 == 객체 생성 이전 == 의존성 주입을 받기 전

 

하지만 `@Value`는 의존 관계 주입 시점(인스턴스 수준)에서 동작한다. 이로 인해 의존성 주입을 받기 전에 메모리에 저장되는 static 변수에는 값을 주입할 수 없다. 이는 더 나아가서 클래스 레벨에도 동일하게 적용할 수 있다.

 

`@Component` 애노테이션이 적용되지 않은 클래스는 컴포넌트 스캔 대상에 포함되지 않으므로 스프링 빈으로 등록되지 않는다. 따라서 스프링 빈으로 등록되어 있지 않은 클래스에서 static 변수가 아니더라도 `@Value`로 값을 주입받으면 동일한 에러가 발생할 수 있다.

 

일반적인 주입 방법이 아닌 다른 방법을 사용하면 static 변수에 설정 값을 주입할 수 있다.

 


 

 

@PostConstruct

`@PostConstruct`가 적용된 메서드는 모든 빈 초기화 직후에 호출이 된다. 이를 이용하여 인스턴스 변수에 주입된 값을 static 변수에 할당할 수 있다.

@Component
public class DemoConfig {

    @Value("${demo.config.property}")
    private String demoProperty; // 인스턴스 변수인 여기에 먼저 주입
    
    public static String STATIC_DEMO_PROPERTY; 
    
    @PostConstruct // 빈 초기화 이후 호출되어, 인스턴스 변수에 주입된 값을 static 변수에 할당
    public void setup() {
    	STATIC_DEMO_PROPERTY = demoProperty;
    }
}

 

Setter

setter 메서드를 이용하여 static 변수에 값을 할당할 수 있다. 이전 방법과 달리 Spring이 값을 주입할 때 static 변수에 값을 바로 할당할 수 있다.

@Component
public class DemoConfig {

    private String demoProperty;
    
    public static STATIC_DEMO_PROPERTY;
    
    @Value("@{demo.config.property}")
    public setDemoProperty(String demoProperty) {
    	DemoConfig.STATIC_DEMO_PROPERTY = demoProperty;
    }
}

 

 

 

 

 

 

Comments