trouble shooting

400 Bad Request, 409 Conflict와 422 Unprocessable Entity 의 차이는?

TLdkt 2022. 12. 26. 17:15
728x90
반응형

들어가며

포인트 전송 API를 구현하며 잔여 포인트가 부족한 경우 에러 코드를 무엇으로 할 것인지에 대해 무려 1시간 30분 동안 토론했다. HTTP 규약에 대해 잘 몰랐는데 구분 기준에 대해 조금이나마 학습할 수 있었기에 기록한다

 

문제상황

포인트 전송 시점에 잔여 포인트가 부족하다면, 잘못된 요청이니까 400이겠거니! 생각했었다.

그러나 조금 더 고민해보니, 기존 프로젝트에서 비즈니스 로직에 부합하지 않는 경우 409로 서버 자원과 충돌한다는 응답을 해왔기 때문에... 409가 아닐까? 생각했다. 특히 'a request conflict with current state of server resource' 라는 MDN 문서 표현 때문에 더더욱!

마침 다른 팀원도 적합한 에러코드를 찾기 위해 MDN 문서를 뒤지고 있던 차였어서 고민을 공유했더니, 흔쾌히 같이 찾아보자고 했다.

4XX 라인을 타고 내려가며 살펴본 결과, 422도 후보 선상에 올랐다.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409

 

409 Conflict - HTTP | MDN

The HTTP 409 Conflict response status code indicates a request conflict with the current state of the target resource.

developer.mozilla.org

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422

 

422 Unprocessable Content - HTTP | MDN

The HyperText Transfer Protocol (HTTP) 422 Unprocessable Content response status code indicates that the server understands the content type of the request entity, and the syntax of the request entity is correct, but it was unable to process the contained

developer.mozilla.org

422는 명령 자체가 틀려먹었다는 응답이다.

대체 무슨 차이인 걸까...?

 

에러코드를 빵셔틀에 비유해보자 

 

그래서 이를 비유적으로 생각을 해봤다. 

 

400:

매 빵 - ???

409:

매점 가서 빵사와 - 매점이 닫혀있음

422:

1000원으로 빵사고 1000원 남겨와 - 매점이 열려있든 닫혀있든 상관없이 실행을 못하는 명령

 

즉, 아래와 같이 정리된다.

 

400은 신택스 에러(해석할 수 없는 명령)

409는 서버 자원의 상태와 충돌이 있는 것이고

422는 서버 자원의 상태와 관련없이 실행 자체가 불가능한 명령

 

결론적으로 최종 후보였던 422로 작성했다 ㅎㅎ 토론은 즐겁다!

728x90
반응형