에러 코드 문서화 예시
에러 코드에 대한 문서는 다음과 같은 정보를 포함해야 합니다.
- 에러 코드
- 에러 메시지
- 에러 설명
- 해결 방법 또는 참고 사항
예를 들어,
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" } }