본문 바로가기
Development/Java

static 변수에 @Value Annotation을 사용하여 값을 할당하기 - Spring boot (Inject)

by 버들도령 2023. 1. 5.
728x90

static 변수에 @Value Annotation을 사용하여 값을 할당하기
Spring boot (Inject)

Spring @Value Annotation

 

Spring Boot를 사용하면서
Property 파일에 key/value 값들을 설정하고,
클래스에서 @Value Annotation을 사용하여 설정 값을 손쉽게 활용할 수 있습니다.

다음과 같은 Property 파일에 Key/Value 설정값들을 정의하죠.

파일명 : application.properties

# korea 암/복호화 키
korea.aes.256.key=GoForIt!!Korea!!

 

그리고 클래스에서는 다음과 같은 방식으로 
Property의 Key/Value  값을 사용하기 위해서 @Value Annotation을 정의하고,
원하는 변수에 Injecting 하도록 설정하죠.

/**
 * AES Encrypt/Decrypt 처리
 */
 
public class AESEncryptor {

    // 암호화 키 설정
    @Value("${korea.aes.256.key}")
    private String koreaAes256Key; // Korea 암호화 키 설정
    .
    .
    .
}

 

Spring의 @Value Annotation을 어떻게 활용하는지 좀 더 살펴볼까요?
변수에 기본 값을 정의할 수 있어요.

# 변수에 기본 값을 정의할 수 있어요.

@Value("Default Value")
private String defaultValue;

// defaultValue = "Default Value"

 

int, boolean 값을 설정할수도 있죠.

# int, boolean 값들도 할당할 수 있어요.

@Value("10")
private int defaultCount;

// defaultCount = 10

@Value("true")
private boolean isSuccess;

// isSuccess = true

 

Property 설정 값의 유무에 따라서 기본값을 설정할 수 있습니다.
@Value("${server.port:10511}")
위와 같이 Annotation을 설정해주면
server.port 값이 설정되어 있다면 해당 설정값.
server.port 값이 설정되어 있지 않다면 10511

@Value("${server.port:10511}")
private String defaultValue;

// server.port 값이 설정되어 있다면 해당 설정값.
// server.port 값이 설정되어 있지않다면 10511


아래처럼 시스템 환경변수를 가져오도록 할 수도 있어요.

// java.home의 시스템 환경 값
@Value("#{systemProperties['java.home']}")
public String javaHome;

// java.home의 시스템 환경 값
@Value("${java.home}")
public String javaHome2;


메소드에 대해서도 인자값을 설정할때 @Value Annotation을 적용할 수 있습니다.

# 아래의 메소드에서처럼 두개의 인자에 값을 설정할수도 있어요.
@Value("tempValue")
public void encryptAES256(String keyStr, String valueStr) {
 ...
}
// 위 메소드에서의 두 인자값은 아래와 같을거에요.
// keyStr = "tempValue"
// valueStr = "tempValue"

# 아래의 메소드는 각각의 인자값에 @Value Annotation을 사용해본겁니다.
@Value("TestKey")
public void decryptAES256(String keyStr, @Value("encryptStr") String valueStr){
 ...
}
// 위 메소드에서의 두 인자값은 아래와 같을거에요.
// keyStr = "TestKey"
// valueStr = "encryptStr"

 

자~~ 위에처럼 사용하더라도 그동안 문제가 없었을거에요.
하지만... 다음과 같이 정적(static) 변수에 대해서 @Value Annotation을 사용하려고 할때는 문제가 되요.

 

static 변수에 @Value Annotation 사용하기

static 변수에 @Value Annotation을 사용했을때는
해당 변수 값들이 모두 null로 되어있을거에요.
테스트해보시면 압니다.

/**
 * AES Encrypt/Decrypt 처리
 */
 
public class AESEncryptor {

    // 암호화 키 설정
    @Value("${korea.aes.256.key}")
    public static String koreaAes256Key; // Korea 암호화 키 설정
    
    @Value("Default Value")
    public static String defaultValue;
   
    // 위에서 static 변수에 @Value를 사용했지만... 아래처럼 모두 null 일거에요.
    // koreaAes256Key = null
    // defaultValue = null
    .
    .
    .
}

 

이런 경우에는 다음과 같이 setter 함수를 사용하여 Injecting 해주시면 됩니다.
아래처럼 setter 함수를 이용해서 정적 변수에 대해서도 값의 설정이 가능하도록 처리했습니다.

/**
 * AES Encrypt/Decrypt 처리
 */
@Component
public class AESEncryptor {

	public static String koreaAes256Key; // Korea 암호화 키 설정
	public static String defaultValue; / Default 값 설정
	public static String javaHome; // 시스템 환경 변수 설정
	public static String javaHome2; // 시스템 환경 변수 설정

	// 암호화 키 설정
	@Value("${korea.aes.256.key}")
	public void setKoreaAes256(String key) {
		koreaAes256Key = value;
	}
    
	@Value("Default Value")
	public void setDefaultValue(String value) {
		defaultValue = value;
	}

	@Value("#{systemProperties['java.home']}")
	public void setJavaHome(String value) {
		javaHome = value;
	}

	@Value("${java.home}")
	public void setJavaHome2(String value) {
		javaHome2 = value;
	}
    
    .
    .
    .
}

 

728x90

댓글