728x90
반응형
Spring에서 @Value 어노테이션은 application.properties와 같이 프로퍼티에 정의된 값을 주입하는데 사용된다.
@Value 어노테이션 사용 방법
.properties
app.name=MyApplication
app.version=1.0.0
.java
@Component
public class AppConfig {
@Value("${app.name:default}")
private String appName;
@Value("${app.version:0}")
private String appVersion;
}
보통 이렇게 @Value 형식에 맞춰 properties 값을 주입하여 주면 간단히 사용할 수 있지만 한 가지 주의할 점이 있다.
@Value로 값을 주입할 변수가 static으로 선언하면 값을 주입할 수 없어 변수는 Null 값을 가지게 된다.
💡왜 static 변수에는 값을 주입할 수 없을까?
원인 => Spring의 라이프 사이클과 static 필드의 특성 때문이다.
1. Spring의 의존성 주입 방식
• @Value는 Spring 컨테이너가 빈의 인스턴스를 생성하고 난 뒤, 해당 인스턴스의 필드에 값을 주입한다.
• static 필드는 클래스 레벨에서 관리되며 특정 인스턴스에 속하지 않는다.
• 즉, Spring이 빈을 생성해도 static 필드는 컨테이너가 관리하는 범위를 벗어나 있다.
2. static 필드의 특성
• static 필드는 클래스 로드 시점에 메모리에 할당되며, Spring 컨테이너와는 별개로 존재한다.
• Spring 컨테이너는 인스턴스 수준에서 동작하기 때문에 @Value와 같은 주입 메커니즘이 static 필드에 적용되지 않는다.
이러한 이유로 직접적으로 static 변수에 직접적으로 값을 주입할 수는 없다 그렇기 때문에 setter나 Environment를 활용하여 값을 주입할 수 있다.
해결 방법1 : setter에 추가
private static String SSO_YN;
@Value("${sso.yn:N}")
public void setSsoYn(String ssoYn) {
SSO_YN = ssoYn;
}
해결 방법2 : Spring의 Environment 객체 활용
@Configuration
public class Config {
private static String appName;
@Autowired
public void setEnvironment(Environment environment) {
appName = environment.getProperty("app.name");
}
}
- 끝 -
728x90
반응형
'🍃SpringFramework > SpringMVC' 카테고리의 다른 글
[SpringMVC] 주요 @Annotation들 (2) | 2023.08.19 |
---|---|
[SpringMVC] WebListener를 활용한 중복 로그인 방지 (0) | 2023.08.19 |
[SpringMVC] REST API & Ajax (0) | 2023.08.19 |
[SpringMVC] MyBatis (0) | 2023.08.19 |
[SpringMVC] TDD (0) | 2023.08.19 |