Troubleshooting BE AI 요청 422 - 100-hours-a-week/KTB4-2nd-Cloud GitHub Wiki
BE에서 AI로 보낸 요청이 422로 실패
2026-09-24
🐞 에러 내용
사진 업로드 마지막 Batch에서 브라우저에 500이 반환됐습니다.
POST /api/trips/15/initial-attachments → 500 Internal Server Error
Backend 로그에는 AI 호출이 422로 실패했다고 남아 있었습니다.
IllegalStateException: AI 사진 분석 호출에 실패했습니다.
at TripPhotoAnalysisService.analyze(TripPhotoAnalysisService.java:84)
Caused by: HttpClientErrorException$UnprocessableContent: 422
{"error":{"code":"INVALID_REQUEST",
"detail":{"errors":[{"type":"missing","loc":["body"],"msg":"Field required","input":null}]}}}
loc: body, input: null이라 특정 필드가 틀린 게 아니라 요청 본문 자체가 비어서 도착한 상태였습니다.
🔍 원인 분석
Backend는 AI를 호출할 때 다음 순서를 거칩니다.
| 단계 | 내용 | 결과 |
|---|---|---|
| 1 | Worker EC2 상태 조회, 필요하면 시작 | 통과 |
| 2 | Worker /health 준비 대기 |
통과 |
| 3 | POST /trips/{id}/process 호출 |
422 |
| 4 | 응답 검증 | 도달 못함 |
먼저 인프라 쪽 문제인지 확인했습니다. Worker 로그를 보니 App의 사설 IP에서 온 요청이 정상적으로 도착해 있었습니다.
10.20.1.110:47782 - "POST /trips/15/process HTTP/1.1" 422
요청이 Worker까지 왔고 AI가 응답도 했으니 네트워크, Security Group, API 키, Worker 상태는 문제가 아니었습니다. 이 로그와 정리한 내용을 Backend, AI 팀에 공유했습니다.
처음에는 Backend가 요청 DTO를 잘못 만드는 쪽을 의심했습니다. 그런데 Backend 코드에서는 본문을 정상적으로 만들고 있었습니다.
다시 Worker 로그를 앞뒤로 보자 POST 바로 직전에 경고가 두 번 찍혀 있었습니다.
07:29:21.868 WARNING uvicorn.error: Unsupported upgrade request.
07:29:21.879 WARNING uvicorn.error: Unsupported upgrade request.
07:29:21.880 INFO 10.20.1.110:39330 - "POST /trips/23/process HTTP/1.1" 422
Backend의 Spring RestClient가 HTTP/2로 업그레이드를 시도했고, HTTP/1.1로만 떠 있는 Uvicorn이 이를 거절하면서 본문 없이 요청이 처리된 것이었습니다. Backend 팀도 같은 사례를 찾았고, AI 팀에서 Uvicorn이 HTTP/1.1 전용이라는 것도 확인해줬습니다.
✅ 해결 방법
Backend 팀이 AI 호출용 HTTP Client를 HTTP/1.1로 고정했습니다. 새 이미지를 배포한 뒤 사진 업로드부터 AI 처리 요청, 결과 반환, 여행 생성 완료까지 확인했습니다.
이후 Worker 로그에서 Unsupported upgrade request 경고는 다시 나오지 않았습니다.
회고
422라는 상태 코드만 보고 요청 본문을 만드는 쪽부터 의심했습니다. 실제 단서는 같은 시각 Worker 로그의 경고 한 줄이었습니다.
서비스 사이 요청이 실패하면 호출하는 쪽 로그만 보지 않고, 받는 쪽 로그를 같은 시각으로 맞춰 앞뒤까지 봅니다.