application.properties의 키 값이 @Value를 선언한 필드 값에 주입되지 않는 문제

결제 시스템으로 iamport api를 사용하기 위해 IamportClient 객체를 apikey로 생성하는데

이 apikey를 application.properties에 작성하고 @Value 어노테이션으로 키 값을 받아오는데 해당 필드에 키값이 채워지지 않는 문제가 발생했다.

@Controller
@RequiredArgsConstructor
public class OrderController {
    private final OrderService orderService;

    @Value("${imp.api.key}")
    private String apiKey;

    @Value("${imp.api.secretkey}")
    private String secretKey;
    
    private IamportClient iamportClient new IamportClient(apiKey, secretKey);
}

 

 

문제 발생원인을 알기 위해서는 Spring Bean의 생명주기를 알아야 한다.

스프링 컨테이너 생성 => 스프링 빈 생성 => 의존 관계 주입(DI) => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료

Controller 클래스에서 IamportClient 객체를 프로피터에 작성한 키값으로 두 apikey 필드에 채워 이 키값을 인자로 받아 초기화 하고 있는데

필드 초기화는 빈이 생성되고, 의존 관계 주입이 끝난 후에야 초기화가 된다.

그런데 @Value 어노테이션은 의존 관계 주입이 끝나 기전에 빈이 생성되고 필드 초기화를 시도해서 프로퍼티의 값이 해당 필드에 초기화가 되지 않은 것이였다.

 

수정한 코드는 다음과 같다.

@PostConstruct 어노테이션을 사용하여 빈 생성이 되고, 의존 관계 주입(DI)가 이루어진 후 초기화를 수행하도록 수정하였다.

@Controller
@RequiredArgsConstructor
public class OrderController {
    private final OrderService orderService;

    @Value("${imp.api.key}")
    private String apiKey;

    @Value("${imp.api.secretkey}")
    private String secretKey;
    
    private IamportClient iamportClient;

    @PostConstruct
    public void init() {
        this.iamportClient = new IamportClient(apiKey, secretKey);
    }
}