@Value

Yuno·2024년 8월 18일

Spring Framework 에서 사용되는 어노테이션으로, 프로퍼티 파일이나 시스템 환경 변수, 스프링의 빈 정의에서 특정 값들을 주입하기 위해 사용됨. 이 어노테이션은 스프링의 의존성 주입 기능의 일부로, 주로 어플리케이션 설정값이나 환경 변수를 클래스의 필드에 주입할 때 사용됨


👉 주요 기능

  • 프로퍼티 값 주입 : @Value 를 사용하면, application.propertiesapplication.yml 등의 프로퍼티 파일에 정의된 값을 클래스의 필드에 주입할 수 있음.
  • 시스템 환경 변수 주입 : 시스템의 환경 변수나 JVM 시스템 프로퍼티를 주입할 수 있음.
  • 기본값 설정 : 프로퍼티가 설정되지 않은 경우, 기본값을 지정할 수 있음.

👉 사용 예시

  1. 프로퍼티 파일에서 값 주입
    application.properties 파일
app.name=MySpringApp
app.version=1.0.0

Java 클래스

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

@Component
public class AppConfig {
	
    @Value("${app.name}")
    private String appName;
    
    @Value("${app.version}")
    private String appVersion;
    
    public String getAppName() {
    	return appName;
    }
    
    public String getAppVersion() {
    	return appVersion;
    }
}
  1. 기본값 설정
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class AppConfig {
	
    @Value("${app.description:Default Description}")
    private String appDescription;
    
    public String getAppDescription() {
    	return appDescription;
    }
}

app.description 프로퍼티가 설정되지 않은 경우, 기본값인 "Default Description"appDescription 에 주입됨

  1. 시스템 환경 변수 주입
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class SystemConfig {
	
    @Value("${JAVA_HOME}")
    private String javaHome;
    
    public String getJavaHome() {
    	return javaHome;
    }
}

이 경우, 시스템 환경 변수 JAVA_HOME 의 값이 javaHome 필드에 주입됨


📌 특징 및 유의사항

  • 프로퍼티 형식 : ${} 형식을 사용하여 프로퍼티 값을 참조함
  • 기본값 설정 : 프로퍼티가 없을 경우 : 뒤에 기본값을 지정할 수 있음
  • 타입 변환 : @Value 는 주입된 값을 필드의 타입에 맞게 자동으로 변환함. 예를 들어, int, boolean, List 와 같은 타입으로도 주입 가능

✏️ 예시 : 복합 표현식 사용

application.properties

app.timeout=5000
app.feature.enabled=true

Java 클래스

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

@Component
public class ComplexConfig {
	
    @Value("#{${app.timeout} > 1000 ? 'Timeout is sufficient' : 'Timeout is too low'}")
    private String timeoutMessage;
    
    @Value("#{${app.feature.enabled} ? 'Feature is enabled' : `Feature is disabled`}")
    private String featureStatus;
    
    public String getTimeoutMessage() {
    	return timeoutMessage;
    }
    
    public String getFeatureStatus() {
    	return featureStatus;
    }
}

👉 실제 사용 사례

  • 환경별 설정 : 개발, 테스트, 프로덕션 환경마다 다른 설정값을 사용해야 할 때, @Value 를 통해 환경별로 다른 프로퍼티 값을 주입할 수 있음.
  • API 키 주입 : 외부 서비스와의 통신에 필요한 API 키나 시크릿을 프로퍼티 파일에 저장하고, 이를 @Value 로 주입하여 사용함
profile
Hello World

0개의 댓글