직접 정의한 Error code 란?
직접 정의한 에러코드는 HTTP Status code 와 별개로 정의한 에러코드를 의미한다. HTTP 응답에는 HTTP 요청이 성공했는지 실패했는지 나타내주는 HTTP Status code 가 존재함에도, 대부분의 서비스에서는 아래처럼 HTTP Status code 뿐만 아니라 직접 정의한 Error code 도 함께 내려준다.
[카카오 쇼핑 에러코드]
[카카오뱅크 에러코드]
[Naver Cloud Platform 에러코드]
[NHN CLOUD]
이렇게 에러코드를 직접 정의하면 REST API의 에러 응답을 이해하기 위해 API 문서에 작성하고, 확인해야한다는 단점이 있다.
직접 정의한 Error code 를 사용하는 이유
그럼에도 불구하고 직접 정의한 Error code를 사용하는 이유는 무엇일까?
예시로, 주문 내 상품을 확인하는 다음과 같은 엔드포인트를 가정해본다.
/api/v2/orders/{orderId}/items/{productId}
- 주문이 존재하지 않을 경우 404 (Not Found) 를 내려준다.
- 주문 내 상품이 존재하지 않을 경우 404 (Not Found) 를 내려준다.
- 상품의 재고 정보가 존재하지 않을 경우 404 (Not Found) 를 내려준다.
이때 동일한 404 Status Code를 반환하는 예외가 다수 존재한다. 이 경우 클라이언트에서 어떤 예외인지에 따라 다르게 처리하기 위해서는 상태 코드 뿐만아니라 추가적인 정보가 필요하다.
결국, 직접 정의한 Error code 가 없다면 Error message 를 참고해서 처리해야 하는데, Error message 는 대부분 사람이 이해할 수 있는 문자열 형식으로 서버에서 오탈자 수정, 내용변경 등 에러 메시지 내용을 변경하는 상황이 발생할 가능성이 높다. 이 경우 클라이언트에서 예외 처리 로직이 깨질 가능성이 높아지므로, 별도 ErrorCode 를 정의해 응답 본문에 추가해주는 것이다.
그러면, ErrorCode 는 어떻게 만들어야 하는가?
위에서 첨부한 카카오,네이버,NHN 등의 예시만 보더라도 에러코드에 대한 양식은 모두 상이하다. 딱 이렇게 만들어라는 규칙은 없다.
중요한 것은 해당 API 를 사용하는 클라이언트 측에서 에러 코드가 무슨 역할을 하고, 어떠한 상황에서 이 에러가 발생했는지에 대한 원인이 기술되어 있어야 한다는 것이다.
- 에러 코드
- 에러코드가 어떤 에러 상황에서 발생했는지에 대한 설명
- 매핑되는 HTTP 상태코드 (선택)
따라서 API 를 제공하는 쪽에서는 수동 문서화 또는 REST DOCS, Swagger (description) 등 문서화 툴을 활용해 에러코드에 대한 용어사전을 정의하는 것이 좋다.
에러코드에 대한 예시를 추가하면 필자의 경우 웹계층에서 발생한 에러와 비즈니스 처리과정에 대한 에러코드를 다음과 같이 나누었다. 각자 에러의 성격이 다르다 보았고 각 계층의 책임을 명확히 구분하고 관리하자는 생각에서 나눈 것이다. 앞에 E 를 추가한 이유는 http 상태코드도 세자리이므로 클라이언트의 혼동을 줄이기 위해서 붙였다.
// 웹계층에서 발생한 에러 1XX 시작
public enum ApiErrorCode {
E100,
E101,
E102,
E103,
E104,
}
// 비즈니스 처리 과정에서 발생한 에러 4XX 시작
public enum CoreErrorCode {
E401,
E402,
E403,
E404,
E405
}
- 웹 계층(ApiErrorCode): 클라이언트와의 통신 과정에서 발생하는 오류 ex) 잘못된 요청, 파라미터 누락, 인증 실패 등
- 비즈니스 로직 계층(CoreErrorCode): 도메인 로직에서 발생하는 오류 ex) 주문 실패, 재고 부족 등
'Spring' 카테고리의 다른 글
[Spring] TestContainers, @TestConfiguration 사용시 @DynamicPropertySource 가 적용되지 않는 문제와 해결방안 (0) | 2025.04.10 |
---|---|
[Spring] OpenApI 3.0 Swagger 문서 작성 및 설정 방법 (0) | 2025.02.11 |
[SpringBoot] MapStruct 제대로 활용하기 (0) | 2024.11.03 |
[SpringBoot] @DataJpaTest 테스트 클래스 간 데이터 충돌 문제 해결 (0) | 2024.10.30 |
[SpringBoot] 데이터베이스 마이그레이션 툴 Flyway 도입기 (0) | 2024.09.28 |