문제 상황
- spring-boot 프로젝트에서 fast api 프로젝트 서버로 요청을 보냈는데 500 에러가 발생
- 디버깅 결과 요청 바디 값 일부가 누락되어서 아예 안들어왔음. spring-boot 에서는 제대로 보내고 있는 상황
원인
- 요청 보낼 때의 바디와 서버(fast-api 서버)에서 받고자 하는 요청 바디가 안맞아 발생하는 422 unprocessable entity 가 아닌 500 Internal Server Error으로 반환된 이유:
- fast api 에서 ValidationError가 발생하는 경우 코드 내부의 큰 버그라고 간주하기 때문에 클라이언트(spring-boot 프로젝트)에게는 500으로 알린다.
It should be this way because if you have a Pydantic ValidationError in your response or anywhere in your code (not in the client's request), it's actually a bug in your code
- spring-boot에서 제대로 보내고 있는데 fast-api 서버에서는 파싱하지 못한 이유:
- 요청 바디 string을 json으로 로드(
json.loads()
)할 때 만들어놓은 모델 객체로 변환하는데, 클래스 필드 타입 일부가 안맞아서 그 필드들만 누락되었음.
- 보낸 데이터 : "2022-10-22 16:48" 형식의 datetime - 모델 클래스의 필드 타입 "2022-10-22" 형식의 date
@classmethod
def __get_validators__(cls):
yield cls.validate_to_json
@classmethod
def validate_to_json(cls, value):
if isinstance(value, str):
return cls(**json.loads(value))
return value
- fast-api 서버 디버깅 과정에서 spring-boot 에서부터 제대로 안보내고 있는 것처럼 보인 이유(=누락되어 보인 이유):
- 요청 바디를 찍는 print문을 문제가 되었던 json.loads() 이후에 했기 때문에...
해결
- datetime으로 필드를 통일
- spring-boot 서버에서 date로 안바꾼 이유: 프론트에서부터 datetime 형식으로 보내고 있기 때문에 중간 백단 서버에서 fast-api 사용 서버에 맞게 date로 바꾸게 되면 이후에 비슷한 로직이 필요한 API를 개발할 때 같은 실수가 일어날 수 있다고 생각