본문으로 건너뛰기

@Value 어노테이션

@Value은 설정 파일에 설정한 값을 주입할 수 있는 어노테이션입니다.

✔️ @Value 어노테이션 주의점

주입 시점

@Value 어노테이션은 대상 컴포넌트가 스프링 빈으로 등록되고 의존 관계를 주입할 때 동작합니다. 따라서 환경 변수를 주입받는 대상 클래스에 @Component 어노테이션을 붙여주지 않는다면 해당 클래스는 컴포넌트 스캔이 대상이 되지 않아 스프링 빈으로 등록되지 않고, @Value 어노테이션 또한 동작하지 않습니다.

주입 방식

빈을 주입받을 때와 마찬가지로 @Value 어노테이션을 사용할 때도 필드 주입, 생성자 주입, setter 주입 등의 방식을 사용할 수 있습니다. 따라서 이들의 장단점을 비교하고, 상황에 따라 적절한 주입 방식을 선택해야 합니다.

프로퍼티 파일

프로퍼티 파일의 경로와 스코프를 확인해야 합니다. application.properties가 클래스 패스에 존재해야 하고, 프로퍼티 파일이 여러 개일 경우 우선 순위를 고려해야 합니다.

✔️ @ConfigurationProperties 어노테이션과의 차이점

스프링의 프로퍼티 파일의 값은 Environment에 등록되는데요. 두 어노테이션 모두 이 값을 불러올 수 있다는 공통점이 있습니다. 단, @Value 어노테이션은 단일 값을 주입받기 위해서 사용되며, RelaxedBinding이 적용되지 않습니다. RelaxedBingding이란 프로퍼티 이름이 조금 달라도 유연하게 바인딩을 시켜주는 규칙을 의미합니다.

반면, @ConfigurationProperties 어노테이션은 프로퍼티에 있는 값을 클래스로 바인딩하기 위해 사용됩니다. 그리고, 한 번에 여러 값을 바인딩 받을 수 있으며 RelaxedBinding을 적용합니다.

✔️ RelaxedBinding (완화된 바인딩) 이란?

application.propertiesapplication.yml에 정의한 프로퍼티 이름과, @ConfigurationProperties에 선언한 필드 이름이 정확히 일치하지 않아도 매핑되도록 허용하는 기능입니다.
즉, 언더스코어, 대시(-), 카멜케이스 차이 같은 걸 알아서 맞춰줍니다.

@ConfigurationProperties 클래스

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "app.config")
public class AppConfigProperties {

private String serverName;
private int maxConnection;

public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}

public int getMaxConnection() {
return maxConnection;
}
public void setMaxConnection(int maxConnection) {
this.maxConnection = maxConnection;
}
}

프로퍼티 파일

app:
config:
server-name: MyServer # kebab-case
max_connection: 100 # snake_case

또는

app:
config:
serverName: MyServer # camelCase
maxConnection: 100

또는

app.config.server-name=MyServer
app.config.max_connection=100
Loading comments...