Spring Boot에서 @Value로 주입된 값을 Static 변수로 사용하기
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. 코드 설명
- 인스턴스 필드에 주입: @Value를 사용하여 yml 파일에 정의된 값을 인스턴스 변수(예: appNameValue, appVersionValue)에 주입합니다.
- @PostConstruct 어노테이션: Spring에서 빈이 생성된 후 호출되는 메서드입니다. 이 메서드 안에서 주입된 인스턴스 필드 값을 static 필드로 할당하여, 나중에 다른 클래스에서도 해당 static 변수를 사용할 수 있게 합니다.
- 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에서 전역적으로 값을 사용할 수 있어, 프로젝트의 여러 부분에서 동일한 설정값을 참조할 수 있음.
이 방법을 통해 애플리케이션 전역에서 설정값을 손쉽게 사용할 수 있게 되므로, 반복적인 설정 코드 없이도 효율적으로 설정 값을 관리할 수 있습니다.