static 변수에 @Value Annotation을 사용하여 값을 할당하기
Spring boot (Inject)
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;
}
.
.
.
}
댓글