Spring/Spring

Spring Boot에서 @Value로 주입된 값을 Static 변수로 사용하기

ghyeong 2024. 10. 11. 17:56
반응형

Spring Boot에서 애플리케이션 설정 파일(application.yml 또는 application.properties)의 값을 주입받기 위해 우리는 흔히 @Value 어노테이션을 사용합니다. 그러나 주입받은 값을 static 변수로 사용하려고 할 때는 몇 가지 제한 사항이 있습니다. 이번 포스팅에서는 @Value로 주입된 값을 static 변수에 저장하고 전역적으로 사용하는 방법을 알아보겠습니다.

문제 상황: @Value와 static 변수의 사용

Spring에서는 @Value 어노테이션을 통해 yml 또는 properties 파일의 값을 필드에 주입할 수 있습니다. 하지만 이 어노테이션은 인스턴스 필드에만 사용할 수 있으며, static 필드에는 직접 주입할 수 없습니다.

 
@Component
public class ConfigProperties {

    @Value("${app.name}")
    public static String appName;  // Error! Static 변수에는 직접 주입 불가능

}​

위 코드처럼 @Value로 static 변수를 초기화하려고 하면 오류가 발생합니다. 이는 Spring이 객체 인스턴스를 생성할 때 필드 주입을 수행하기 때문입니다. 반면, static 변수는 클래스 로딩 시점에서 이미 초기화되기 때문에, 이 시점에는 Spring의 주입 메커니즘이 작동하지 않습니다.

해결 방법: 인스턴스 변수에 주입 후 Static 변수에 할당하기

이 문제를 해결하기 위해서는 인스턴스 변수에 값을 주입한 후, 이를 static 변수에 할당하는 방식을 사용합니다. Spring에서는 @PostConstruct 어노테이션을 사용하여 객체가 생성된 이후에 메서드를 실행할 수 있습니다. 이를 통해 인스턴스 필드에 주입된 값을 static 변수로 설정할 수 있습니다.

구현 예시

다음은 yml에 정의된 값을 static 변수로 저장하여 전역적으로 사용할 수 있게 하는 방법입니다.
3.1. application.yml 설정
우선, application.yml 파일에 애플리케이션 관련 정보를 설정합니다.

app:
  name: "myApp"
  version: "1.0.0"
  environment: "production"

 


반응형

3.2. ConfigProperties 클래스
Spring의 @Value로 주입받은 값을 static 변수에 저장하는 클래스를 만들어봅니다.

package com.example.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class ConfigProperties {

    // @Value로 static 필드에 직접 주입 불가하므로 인스턴스 변수에 주입
    @Value("${app.name}")
    private String appNameValue;

    @Value("${app.version}")
    private String appVersionValue;

    @Value("${app.environment}")
    private String appEnvironmentValue;

    // Static 필드 (초기화는 PostConstruct에서 진행)
    public static String appName;
    public static String appVersion;
    public static String appEnvironment;

    // PostConstruct에서 static 필드에 값 할당
    @PostConstruct
    public void init() {
        appName = appNameValue;
        appVersion = appVersionValue;
        appEnvironment = appEnvironmentValue;
    }
}

 
3.3. 코드 설명

  1. 인스턴스 필드에 주입: @Value를 사용하여 yml 파일에 정의된 값을 인스턴스 변수(예: appNameValue, appVersionValue)에 주입합니다.
  2. @PostConstruct 어노테이션: Spring에서 빈이 생성된 후 호출되는 메서드입니다. 이 메서드 안에서 주입된 인스턴스 필드 값을 static 필드로 할당하여, 나중에 다른 클래스에서도 해당 static 변수를 사용할 수 있게 합니다.
  3. Static 필드 사용: 이제 ConfigProperties.appName, ConfigProperties.appVersion, ConfigProperties.appEnvironment 등을 통해 전역적으로 해당 값을 참조할 수 있습니다.

사용 예시

이제 MyBatis 매퍼나 다른 클래스에서 static 변수에 접근할 수 있습니다. 예를 들어:

public class SomeService {

    public void printAppInfo() {
        System.out.println(ConfigProperties.appName);        // 주입된 appName 값 출력
        System.out.println(ConfigProperties.appVersion);     // 주입된 appVersion 값 출력
        System.out.println(ConfigProperties.appEnvironment); // 주입된 appEnvironment 값 출력
    }
}
 

이 코드를 실행하면 ConfigProperties 클래스의 static 필드에 접근하여 설정된 값을 출력할 수 있습니다.

결론

Spring Boot에서 @Value로 주입된 값을 static 변수로 사용하기 위해서는 인스턴스 필드에 값을 주입한 후, @PostConstruct 메서드를 통해 static 필드에 할당하는 방법을 사용할 수 있습니다. 이를 통해 yml이나 properties 파일의 값을 전역적으로 참조하고, MyBatis나 다른 서비스에서 쉽게 사용할 수 있습니다.
핵심 정리:

  • @Value는 인스턴스 필드에만 주입 가능.
  • Static 필드에 값을 주입하려면, 인스턴스 필드에 주입 후 @PostConstruct 메서드를 사용해 값을 static 필드에 할당.
  • 이렇게 하면 Spring에서 전역적으로 값을 사용할 수 있어, 프로젝트의 여러 부분에서 동일한 설정값을 참조할 수 있음.

이 방법을 통해 애플리케이션 전역에서 설정값을 손쉽게 사용할 수 있게 되므로, 반복적인 설정 코드 없이도 효율적으로 설정 값을 관리할 수 있습니다.

반응형