티스토리 뷰
Trouble Shooting
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.potato.message.send.controller.MessageSendController]: Constructor threw exception
감자씨 2025. 5. 16. 15:51728x90

메세지 전송 컨트롤러에 생성자 함수를 구현하던 중 오류가 발생했다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSendController' defined in file
...
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.potato.message.send.controller.MessageSendController]: Constructor threw exception
...
Caused by: java.lang.NullPointerException: Parameter specified as non-null is null:
...
기존 코드를 보면,
@Value 어노테이션으로 Spring 환경 변수에서 주입되는 API_KEY, API_SECRET_KEY 속성을 지정하고
생성자는 해당 값으로 새로운 인스턴스를 제공 받도록 구현했다.
@Value("${API_KEY}") private String API_KEY;
@Value("${API_SECRET_KEY}") private String API_SECRET_KEY;
public MessageSendController() {
this.messageService = NurigoApp.INSTANCE.initialize(API_KEY, API_SECRET_KEY, "https://...");
}
여기서 문제는 @Value로 해당 값이 주입되기 전에 인스턴스를 제공 받는 부분이 실행 되면서,
API_KEY, API_SECRET_KEY 부분이 null이 되어 오류가 발생했다.
728x90
그래서 생성자 대신 @PostConstruct 어노테이션을 활용하여 코드를 수정했다.
@Value("${API_KEY}") private String API_KEY;
@Value("${API_SECRET_KEY}") private String API_SECRET_KEY;
// 수정된 부분
@PostConstruct
public void init() {
this.messageService = NurigoApp.INSTANCE.initialize(API_KEY, API_SECRET_KEY, "https://...");
}
이 방식으로 실행하면 @Value의 값이 주입된 이후 init() 메서드가 실행되면서 messageService가 정상적으로 초기화된다.
아래 코드처럼 @Autowired 어노테이션을 사용하여 구성하는 방식도 있지만,
@PostConstruct를 사용하여 값이 완전히 주입된 후 초기화하는 방식이 더 안정적이라고 생각해서 이 방식은 사용하지 않았다.
@Autowired
public MessageSendController(@Value("${API_KEY}") String API_KEY,
@Value("${API_SECRET_KEY}") String API_SECRET_KEY) {
this.messageService = NurigoApp.INSTANCE.initialize(API_KEY, API_SECRET_KEY, "https:...");
}

728x90