이번 10월 두 번째 스프린트로 진행한 미니프로젝트에서 발생한 에피소드는 여러모로 흥미로운 경험이었습니다. 상용 서버 배포를 진행한 후, 다음 날 아침에 갑작스럽게 생긴 문제를 해결하는 과정에서 다양한 교훈을 얻었습니다.
프로젝트 배포와 첫 번째 에러 발생
배포 후 테스트
10월 19일 목요일, 상용 서버 배포를 마친 후 충분한 테스트를 거쳤습니다. 모든 과정이 순조롭게 진행되어 안심하고 퇴근했습니다. 다음 날인 10월 20일 금요일, 여유 있게 출근하여 아침 9시경에 배포된 서버가 정상적으로 작동하는지 점검해보았습니다. 그러나 슬프게도 서버가 다운된 상태였습니다.
문제 확인
dev 서버와 QA 서버에서 동일한 오류가 발생하는 것을 확인한 후, 로컬 환경에서도 직접 테스트를 진행했습니다. 다행히도 문제의 원인을 금방 파악할 수 있었습니다. OpenAI의 Embedding API 요청에서 500 Internal Server Error가 발생했으며, 이는 외부 연동에서 자주 발생하는 문제입니다.
에러 핸들링과 커스텀 익셉션
커스텀 익셉션 생성
외부 연동에서 발생하는 오류에 대한 명확한 대처법은 없지만, 상황에 맞는 사용자 경험(UX)을 고려해야 합니다. 서버 측에서는 적절한 에러 코드를 내려주는 것이 중요합니다. 이를 위해 커스텀 익셉션을 생성하고, 다음과 같은 코드를 작성했습니다.
java
public EmbeddingResponseDto createEmbedding(String message) {
List<String> messages = Collections.singletonList(message);
try {
return openAiFeignClient.createEmbedding(EmbeddingRequestDto.builder().model(embeddingModel).input(messages).build());
} catch (Exception e) {
throw new ExternalServerException("open AI 연동 오류 : /embeddings");
}
}
익셉션 핸들러
RestControllerAdvice를 활용하여 커스텀 익셉션 핸들러를 작성했습니다. 이 핸들러는 외부 연동 실패에 대한 적절한 코드와 메시지를 반환하도록 구성되어 있습니다.
java
@ExceptionHandler(value = {ExternalServerException.class})
public ResponseEntity<Object> ExternalServerException(RuntimeException e) {
ResultVo<String> responseVo = new ResultVo<>();
responseVo.setCode(ResultCode.EXTERNAL_SERVER_ERROR.getCode());
responseVo.setResponse(ResultCode.EXTERNAL_SERVER_ERROR.getDescription());
if (!ObjectUtils.isEmpty(e.getMessage())) {
responseVo.setResponse(e.getMessage());
}
logMessageManager.setExceptionLogMessage(e, responseVo);
return new ResponseEntity<>(responseVo, HttpStatus.INTERNAL_SERVER_ERROR);
}
에러의 진화와 OpenAI 대응
Bad Gateway 에러
익셉션 처리를 완료한 후, 응답 내용을 확인했더니 502 Bad Gateway 오류가 발생했습니다. OpenAI도 이러한 문제에 적극적으로 대응하고 있는 듯했습니다. 해당 오류는 API 인증 스택의 업스트림 파트에서 문제가 발생했음을 나타냈습니다.
상태 확인
OpenAI의 서버 상태를 확인할 수 있는 웹사이트도 발견했습니다. 이 사이트에서 오류 발생 시의 상태를 확인하니, 처음에는 주황색 표시로 나타났으나 몇 시간 후에는 빨간색으로 변했습니다. 이는 시스템에 심각한 문제가 발생하고 있음을 의미했습니다.
결론 및 소감
이날은 평소보다 1시간 늦게 출근했는데, 딱 그 시점부터 에러가 발생하기 시작했습니다. 오후 1시쯤에는 문제가 해결되었으며, 운이 좋게도 적절한 대응을 할 수 있었습니다. 상용 서버 배포 후 다음 날 바로 문제가 발생했던 경험은 아찔하면서도 한편으로는 웃음을 자아내는 일이었습니다. 이러한 경험을 통해 외부 연동의 복잡성을 다시 한 번 체감할 수 있었으며, 향후 비슷한 상황에 대비할 수 있는 소중한 교훈이 되었습니다.