[Spring] @Value란?

artp·2025년 5월 20일

spring

목록 보기
1/11
post-thumbnail

@Value는 스프링 프레임워크에서 application.properties 또는 application.yml에 정의된 설정값을 주입할 수 있도록 해주는 애노테이션입니다.

설정값을 코드에 하드코딩하지 않고 외부 파일에 분리해 관리하는 방식으로, 유지보수와 환경별 설정 관리를 쉽게 할 수 있습니다.

1. 기본 문법

@Value("${프로퍼티_키}")
private 타입 변수명;
  • 스프링은 @Value를 통해 application.properties 또는 application.yml에 정의된 외부 설정값을 자바 코드에 주입할 수 있도록 지원합니다.

예시

application.properties

# application.properties
news.imgdir=/path/to/images

NewsController.java

@Value("${news.imgdir}")
private String imgDir;

특징

  • 문자열, 숫자, 불리언 등 기본 타입 자동 변환 지원
  • 문자열이 아닌 타입에도 할당 가능 (Spring이 내부적으로 타입 변환 시도)
    • 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

2. 적용 가능한 위치

  • 필드
  • 생성자 파라미터
  • 메서드 파라미터
  • 메서드 자체

예시

// 필드 주입
@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로 개별 주입 가능

3. 지원하는 타입

@Value는 단순한 문자열뿐 아니라, 다양한 타입의 값을 주입할 수 있도록 지원합니다.
특히 Spring Expression Language(SpEL)를 활용하면 배열, 리스트, 맵, 수식 연산 등도 유연하게 처리할 수 있습니다.

  • 기본 타입 (String, int, boolean 등)
  • 배열(Array), List, Map, enum 등도 지원
  • SpEL(Spring Expression Language)로 복잡한 값 처리 가능

표: 지원 타입 정리

타입설명
기본 타입String, int, boolean, long, double
배열String[], int[]
리스트List<String>, List<Integer> 등 (SpEL로 변환)
Map<String, Integer> 등 (SpEL로 변환)
열거형(enum)@Value("${enum.value}") SomeEnum enumValue
환경변수시스템 환경변수 및 JVM 변수도 사용 가능

예시: application.properties

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;

4. 주의사항 및 팁

키가 존재하지 않을 경우 예외 발생

해당 프로퍼티 키가 존재하지 않으면 IllegalArgumentException이 발생합니다.

기본값 지정

${key:default} 문법으로 기본값을 설정할 수 있습니다.

@Value("${config.timeout:30}") // 설정 없으면 30 사용
private int timeout;

SpEL 사용 가능

  • #{}로 수식, 빈 메서드 호출 등 동적 값 주입이 가능합니다.
  • @Value 내부에서는 SpEL(Spring Expression Language)을 사용할 수 있습니다.
@Value("#{2 * 60}") // 120
private int twoMinutes;

또는 다른 빈의 메서드를 호출할 수도 있습니다.

@Value("#{myBean.method()}")
private String result;
  • Relaxed Binding 미지원: 프로퍼티 이름이 완전히 일치해야 합니다. (server.admin-what-is-real-name 등)
  • 타입 변환 주의: 복잡한 타입(List, Map 등)은 명시적 변환 또는 SpEL 활용이 필요합니다.

5. 정리

항목내용
역할외부 설정값을 코드에 주입
장점설정의 외부화, 유지보수 용이
문법@Value("${key}")
주의점키 없으면 예외 발생, SpEL 가능
profile
donggyun_ee

0개의 댓글