반응형
결제 시스템으로 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);
}
}
'◼ Error 모음' 카테고리의 다른 글
[Spring] no main manifest attribute 에러 (0) | 2023.09.27 |
---|---|
spring_session' doesn't exist 세션 테이블 생성이 안되는 오류 (0) | 2023.09.14 |
@ModelAttribute 객체가 바인딩 되지 않는 오류 (0) | 2023.07.29 |
[티스토리] 게시글을 작성하는데 실패했습니다. (초간단 해결 방법) (0) | 2023.06.14 |
[IntelliJ] `Cannot resolve symbol` 에러 해결 방법 (0) | 2023.05.31 |