DevLogs/LearningSpring

@Value 어노테이션에 SpEL 사용법

밥먹고해요 2024. 10. 31. 13:38

0. 용어

  • SpEL : Spring Expression Language

 

1. @Value("${...}")

1.1. 프로퍼티 파일에 정의된 값 주입

application.properties 파일에 app.name으로 정의된 문자열을 주입할 수 있다.

파일에 정의가 없을 경우에 대한 기본값을 제공할 수 있다.

@Value("${app.verion:1.0}")
private String appVersion;

 

1.2. 환경 변수 값 주입

환경 변수로 정의된 값을 주입할 수 있다.

@Value("${JAVA_HOME}")
private String javaHome;

 

2. @Value("#{...}")

2.1. bean 주입

"myBean" 으로 명명된 bean을 주입할 수 있다.

@Value("#{myBean}")
private MyBean value;

 

2.2. bean의 메서드 반환값 주입

"myBean"으로 명명된 bean의 myMethod() 메서드를 호출한 반환값을 주입할 수 있다.

@Value("#{myBean.myMethod()}")
private String value;

 

2.3. bean의 필드 값 주입

"myBean"으로 명명된 bean의 myField 필드에 할당된 값을 주입할 수 있다.

@Value("#{myBean.myField}")
private String value;

 

2.4. 표현식 평가 결과 값 주입

표현식 평가 결과를 주입할 수 있다.

@Value("#{1 + 2}")
private int value; // 3

@Value("#{myBean.myIntField > 100} ? 'OK' : 'Nope'")
private String result; // "OK" 혹은 "Nope"

 

2.5. 시스템 속성 값 주입

시스템 속성 값을 주입할 수 있다.

@Value("#{systemProperties['user.name']}")
private String value;

 

3. 단점 (주의사항)

  • 낮은 가독성 : SpEL 표현식이 복잡할수록 이해하기 쉽지 않다.
  • 디버깅 어려움 : SpEL 표현식이 잘못되었을 때 오류 메시지가 직관적이지 않다. 예를 들어, 오타나 잘못된 경로로 인한 문제를 쉽게 찾을 수 없다.
  • 성능 저하 : SpEL 표현식은 런타임에 평가되므로, 성능 저하가 발생할 수 있다.
  • 타입 안전성 부족 : SpEL 표현식이 문자열 기반이고 런타임에 평가되므로, 컴파일 시점에 오류를 발견하기 어렵다.
  • 의존성 추적이 어려움 : SpEL 표현식을 통해 주입되는 값이 많아질수록 어떤 값이 어디에서 주입되는지 추적이 어렵다. 즉, 코드 유지보수성을 떨어뜨린다.
  • 보안 문제 : 외부 입력으로 전달받은 값을 SpEL 표현식에 사용하는 경우, 공격의 대상이 될 수 있다.