에러 코드 문서화 예시
에러 코드에 대한 문서는 다음과 같은 정보를 포함해야 합니다.
- 에러 코드
- 에러 메시지
- 에러 설명
- 해결 방법 또는 참고 사항
예를 들어,
101 에러 코드에 대한 문서화는 다음과 같이 될 수 있습니다.- 에러 코드:
101
- 에러 메시지: "사용자 이름이 너무 짧습니다."
- 에러 설명: 사용자 이름이 설정된 최소 길이 기준을 만족하지 못했을 때 발생합니다.
- 해결 방법: 사용자 이름을 8자 이상으로 설정해 주세요.
enum errorCode404 { USER_NOT_FOUND(HttpStatus.NOT_FOUND, "E1001", "유저가 없서용~"); }
도메인
- custom server error - 1 번부터 시작
01: Auth 관련 Exception02: User 관련 Exception03: Project 관련 Exception04: Profile Card 관련 Exception05: ProjectJoinRequest 관련 Exception06: Notification 관련 Exception07: Cert 관련 Exception08: Geo 관련 Exception09: Matching 관련 Exception10: Profile Card Like 관련 Exception11: Chat 관련 Exception12: Review 관련 Exception13: Achievement 관련 Exception14: UserAchievement 관련 Exception
- 공통 error - 0 번 부터 시작
00: 공통E999999: 500 에러
에러 종류
Number | Situation |
0 | 도메인 또는 DTO 객체를 생성할 때 잘못된 경우, 즉 MethodArgumentValidException 또는 ConstraintViolationException이 발생한 경우
(400) |
1 | 도메인 로직 상의 오류인 경우 (400) |
2 | 인증, 인가가 안된 경우 (401,403) |
3 | 존재하지 않는 리소스에 접근한 경우 (404) |
4 | 외부 API 연동 중 에러가 발생한 경우 |
예시
E000001
도메인 구분 - 공통
에러 종류 구분 - dto 생성 오류
정의 된 순서 (시퀀스 값) - 첫번째로 정의 됨
에러코드 관리
레퍼런스
알
일정이 있어서 늦게 확인 했습니다… 🙇🏻🙇🏻
코드로 관리 하는거랑 문자열로 관리하는 거랑 어떤 관리적인 측면에서의 이점이 있을까?
고민을 해봤습니다.
이전에 개발했던 서비스들은 아시는 것처럼 코드로 관리하였었습니다.
E001, E002… 사실 매핑하기 위한 코드 값이지
코드만 가지고는 오류에 대해서 판단하기 힘든 것도 사실입니다.그래서 고민이 되는게, 과연
오류 코드라는 것으로 관리를 해야 하는 것일까?에러코드의 역할을 하는 보다 서술적인 내용을 담은 메시지를 전달하는 방법은 없는건가?
api를 소비하는 입장에서 요청 → 응답 → 에러코드 확인 → 백엔드에 확인 요청 이 아닌 요청 → 응답 → 에러코드 확인 → 자체적으로 수정 → 재요청 → 정상처리 프로세스 처리를 할 수 있는 방법은 없을까?
이미 HttpStatus라는 Http의 규격이 존재합니다.
- 빈도가 높은 HttpStatus
HttpStatus Code | HttpStatus Message |
200 | OK |
400 | Bad Request |
401 | Unauthorized |
402 | Request Failed |
403 | Forbidden |
404 | Not Found |
409 | Conflict |
429 | Too Many Requests |
500 | Internal Server Error |
502 | Bad Gateway |
503 | Server Unavailable |
504 | Gateway Timeout |
우리는 개발 중에
HTTP Status를 확인하고, 어떤 요청에서 잘못되었는지를 확인한 뒤에 이를 수정하고 재요청하여 최종적으로 원하는 결과를 얻는 플로우로 개발을 진행합니다.그렇다면 이러한 프로세스로
오류 코드를 정의하고, 이를 확인할 수 있는 방법을 제공한 뒤에, 자체적으로 내용을 수정하고, 재요청 할 수 있도록 하는 프로세스를 정의하면, client와의 협업에서 보다 원할한 소통을 할 수 있을 거랑 생각됩니다.위와 같은 프로세스를 정의하는 방법으로 wiki에
오류코드와 메시지, 보다 자세한 해결 방법을 정의해두고,오류코드 명세에 이를 확인할 수 있는 방법을 제공함으로써 client의 행동을 규격화 할 수 있지 않을까?Http에 대한 공통 규격이 존재하는 것처럼, 비즈니스에서는 보다
서술적인 내용을 표현할 수도 있을 것 같음오류코드 명세를 정의한다면 아래와 같은 방식으로 정의할 수 있지 않을까?오류 타입(type)- invalid_request_error(4xx)
- auth_error (401, 403)
- api_error (500)
오류 코드(code)- 에러가 발생할 수 있는 구간을 정의하고 이를 단어로 정의
오류 메시지(message)- 오류 코드에 대한 보다 상세한 내용을 서술
오류 원인(param)- 요청 시 원인이 되는 파라미터를 전달
- 비즈니스 처리시 원인이 되는 파라미터는 응답으로서 노출할 대상이 아님
오류타입(type) | 오류코드(code) | 오류메시지(message) | 오류 원인(param) |
invalid_request_error | ㅤ | ㅤ | ㅤ |
api_error | ㅤ | ㅤ | ㅤ |
에러 응답 타입 - 상세한 명세를 제시하는 타입
public class ErrorResponse { private final String type; // 오류에 대한 타입(카테고리)을 정의 (api_error, invalid _request_error...) private final String code; // 보다 디테일한(도메인 관련) 오류코드를 정의 (invalid_parameter) private final String message; // 오류코드에 대한 보다 상세한 메시지를 정의 private final String param; // 오류가 발생한 원인에 대한 파라미터를 전달 private final String docUrl; // code에 대한 보다 자세한 정보를 알 수 있는 URL private final String requestLogUrl; // 요즘 트랜드한 서비스에서는 요청에 대한 관리 페이지를 제공(에러사유에 대한 해법 제공) //... }
오류 관련 상세한 정보를 제공하는 페이지(URL)를 제공한다면? (wiki에 에러 모음 페이지를 만들어서 관리)docUrl 라는 필드에 값으로 전달하여,
client가 해당 페이지에 들어가서 상세 메시지를 확인한 뒤
어떤 내용에 대해서 잘못되었는지를 판단할 수 있도록 하는 것도 좋을 듯
요즘 회사들이 api document 페이지에도 심혈을 기울이는 것과도 연결을 할 수 있을 듯
path가 없는 경우
{ "error": { "code": "resource_missing", // 예시 404 not found에 대한 응답 코드 "doc_url": "{github wiki에 정의하여 url을 담아 보내주는 것도 좋을 듯}", "message": "No such transaction ", // api resource(path)가 없는 경우 "type": "invalid_request_error" } }
400 Bad Request 특정 값에 대한 오류가 발생하는 경우
{ "error": { "message": "{value} is not a valid phone number", "message_code": "invalid_phone_number", "param": "phone", "request_log_url": "{요청 및 응답 명세를 확인할 수 있는 url}", "type": "invalid_request_error" } }
500 internal server exception
{ "error": { "message": "An unknown error occurred", "request_log_url": "{요청 및 응답 값을 확인할 수 있는 url}", "type": "api_error" } }

