반응형
배경
application.yml 에 작성한 설정값을 `@Value` 어노테이션으로 클래스의 필드에 주입시켜 값을 설정하도록 하였다.
그리고 application 을 실행시켜서 ApplicationRunner의 run 메소드에 따라 값이 출력되는것을 확인하였다.
package io.project
import org.springframework.stereotype.Component
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
@Component
class BValidator : ApplicationRunner {
@Value("\${spring.aaa}")
private lateinit var someValue: String
override fun run(args: ApplicationArguments) {
println("check some value: $someValue")
}
fun doValidate(accessToken: String) {
println(someValue)
}
}
> application 실행 시
[2025-04-25 14:28:53.341] [] 5372 [main] [INFO ] ProjectApplicationKt [logStarted:59] Started GbikeAuthServerApplicationKt in 5.616 seconds (process running for 5.88)
check some value: hello@123
하지만, 그 값을 사용하려는 함수 `doValidate` 를 호출하니 값이 설정되지 않는 오류가 발생하였다.
someValue = null
원인
원인은, BValidator 클래스를 AService에서 새로운 인스턴스로 생성하였기 때문에 있었기 때문에 Spring 컨테이너 밖의 객체가 되어서 였다.
Spring 컨테이너는 빈을 다음과 같은 순서로 처리한다.
- 빈 인스턴스 생성
- 의존성 주입 (@Value 포함)
- 초기화 메서드 실행
하지만 AService에서 `BValidator()` 를 호출함에 따라 직접 인스턴스를 생성하여 Spring 컨테이너의 관리 밖에 놓이게 되었고, Spring은 이런 인스턴스에 대해 `@Value` 어노테이션을 처리하지 않아 값이 지정되지 않은 것이다.
해결
BValidator 인스턴스를 Spring 컨테이너 관리 빈으로써 처리하도록 한다. 그러기 위해서 AService의 생성자에 BValidator를 주입받아 Spring Container에 등록시키고 등록된 인스턴스로 함수를 호출하게 수정하였다.
반응형
'DEV-ing log > Spring' 카테고리의 다른 글
[Kotlin / Spring] Spring Security 도입기 [1] : 의존성 설치하기 (0) | 2025.05.02 |
---|---|
[Kotlin / Spring] Spring Rest Docs 2탄 : x-www-form-urlencoded (2) | 2024.09.15 |
[Kotlin / Spring] Spring Rest Docs 1탄 - 시작하기 : application/json (0) | 2024.09.12 |
[Spring | H2] h2 테이블 생성 안되는 오류 ⚒️ : 예약어 문제 (0) | 2024.04.30 |
[IntelliJ] Live Template 에 커스텀 단축키 생성하기 (1) | 2024.04.28 |