@Value는 스프링 프레임워크에서 application.properties 또는 application.yml에 정의된 설정값을 주입할 수 있도록 해주는 애노테이션입니다.
설정값을 코드에 하드코딩하지 않고 외부 파일에 분리해 관리하는 방식으로, 유지보수와 환경별 설정 관리를 쉽게 할 수 있습니다.
@Value("${프로퍼티_키}")
private 타입 변수명;
@Value를 통해 application.properties 또는 application.yml에 정의된 외부 설정값을 자바 코드에 주입할 수 있도록 지원합니다.# application.properties
news.imgdir=/path/to/images
@Value("${news.imgdir}")
private String imgDir;
application.properties는 모든 값을 문자열로 저장하지만, @Value는 해당 필드의 타입에 따라 자동으로 변환하여 주입해줍니다.server.port=8080
feature.enabled=true
pi=3.14
@Value("${server.port}")
private int port; // "8080" → 8080
@Value("${feature.enabled}")
private boolean enabled; // "true" → true
@Value("${pi}")
private double piValue; // "3.14" → 3.14
// 필드 주입
@Value("${site.title}")
private String title;
// 생성자 주입
public MyComponent(@Value("${site.title}") String title) {
this.title = title;
}
// 메서드 주입
@Value("${site.description}")
public void setDescription(String desc) {
this.description = desc;
}
@Value로 개별 주입 가능@Value는 단순한 문자열뿐 아니라, 다양한 타입의 값을 주입할 수 있도록 지원합니다.
특히 Spring Expression Language(SpEL)를 활용하면 배열, 리스트, 맵, 수식 연산 등도 유연하게 처리할 수 있습니다.
String, int, boolean 등)Array), List, Map, enum 등도 지원| 타입 | 설명 |
|---|---|
| 기본 타입 | String, int, boolean, long, double 등 |
| 배열 | String[], int[] 등 |
| 리스트 | List<String>, List<Integer> 등 (SpEL로 변환) |
| 맵 | Map<String, Integer> 등 (SpEL로 변환) |
| 열거형(enum) | @Value("${enum.value}") SomeEnum enumValue |
| 환경변수 | 시스템 환경변수 및 JVM 변수도 사용 가능 |
my.values=1,2,3
products.count={P1:'3',P2:'10',P3:'5'}
user.first.name=홍길동
user.address=서울시 강남구
// 배열로 주입
@Value("${my.values}")
private String[] valuesArray;
// 리스트로 주입 (SpEL 사용)
@Value("#{'${my.values}'.split(',')}")
private List<String> valuesList;
// 맵으로 주입 (SpEL 사용)
@Value("#{${products.count}}")
private Map<String, Integer> productsCount;
여러 설정 값을 하나의 메서드에 주입할 수도 있습니다.
public void setUserDetails(@Value("${user.first.name}") String userName,
@Value("${user.address}") String address) {
this.userName = userName;
this.address = address;
}
운영체제나 JVM에서 제공하는 환경변수도 바로 주입할 수 있습니다.
@Value("${HOME}")
private String homeDirectory;
@Value("${java.home}")
private String javaHome;
해당 프로퍼티 키가 존재하지 않으면 IllegalArgumentException이 발생합니다.
${key:default} 문법으로 기본값을 설정할 수 있습니다.
@Value("${config.timeout:30}") // 설정 없으면 30 사용
private int timeout;
#{}로 수식, 빈 메서드 호출 등 동적 값 주입이 가능합니다. @Value 내부에서는 SpEL(Spring Expression Language)을 사용할 수 있습니다.@Value("#{2 * 60}") // 120
private int twoMinutes;
또는 다른 빈의 메서드를 호출할 수도 있습니다.
@Value("#{myBean.method()}")
private String result;
server.admin-what-is-real-name 등)| 항목 | 내용 |
|---|---|
| 역할 | 외부 설정값을 코드에 주입 |
| 장점 | 설정의 외부화, 유지보수 용이 |
| 문법 | @Value("${key}") |
| 주의점 | 키 없으면 예외 발생, SpEL 가능 |