[Spring] API 응답에서 직접 정의한 Error code 는 왜 사용할까?

2025. 3. 16. 20:41·Spring

직접 정의한 Error code 란?

직접 정의한 에러코드는 HTTP Status code 와 별개로 정의한 에러코드를 의미한다. HTTP 응답에는 HTTP 요청이 성공했는지 실패했는지 나타내주는 HTTP Status code 가 존재함에도, 대부분의 서비스에서는 아래처럼 HTTP Status code 뿐만 아니라 직접 정의한 Error code 도 함께 내려준다.

 

[카카오 쇼핑 에러코드]

응답 코드 및 에러 코드

[카카오뱅크 에러코드]

간편하고 다양한 인증이 필요할때 카카오뱅크 인증서

[Naver Cloud Platform 에러코드]

CLOVA eKYC 에러코드

[NHN CLOUD]

오류 코드 - 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 를 사용하는 클라이언트 측에서 에러 코드가 무슨 역할을 하고, 어떠한 상황에서 이 에러가 발생했는지에 대한 원인이 기술되어 있어야 한다는 것이다.

  1. 에러 코드
  2. 에러코드가 어떤 에러 상황에서 발생했는지에 대한 설명
  3. 매핑되는 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] WireMock 로 Feign (ApacheHttp5Client) 테스트시 NoHttpResponseException 발생 케이스와 해결방법  (0) 2025.05.06
[Spring] TestContainers, @TestConfiguration 사용시 @DynamicPropertySource 가 적용되지 않는 문제와 해결방안  (0) 2025.04.10
[Spring] OpenApI 3.0 Swagger 문서 작성 및 설정 방법  (1) 2025.02.11
[SpringBoot] MapStruct 제대로 활용하기  (0) 2024.11.03
[SpringBoot] @DataJpaTest 테스트 클래스 간 데이터 충돌 문제 해결  (0) 2024.10.30
'Spring' 카테고리의 다른 글
  • [Spring] WireMock 로 Feign (ApacheHttp5Client) 테스트시 NoHttpResponseException 발생 케이스와 해결방법
  • [Spring] TestContainers, @TestConfiguration 사용시 @DynamicPropertySource 가 적용되지 않는 문제와 해결방안
  • [Spring] OpenApI 3.0 Swagger 문서 작성 및 설정 방법
  • [SpringBoot] MapStruct 제대로 활용하기
기억은 RAM, 기록은 HDD
기억은 RAM, 기록은 HDD
  • 기억은 RAM, 기록은 HDD
    적립식 개발
    기억은 RAM, 기록은 HDD
  • 전체
    오늘
    어제
    • 분류 전체보기 (45)
      • Gradle (1)
      • 알고리즘 (14)
        • 강한 연결 요소 (1)
        • BFS (1)
        • 다이나믹 프로그래밍 (2)
        • 그리디 (1)
        • 투 포인터 (2)
        • 비트마스크 (1)
        • 스택 (1)
        • 백트래킹 (1)
        • 유니온-파인드 (1)
        • 기초 기하학 (1)
        • 분할정복을 이용한 거듭제곱 (1)
        • 볼록 껍질 (1)
      • JPA (3)
      • Java (9)
      • Spring (9)
      • Git&GitHub (2)
      • Infra (4)
  • 최근 글

  • 인기 글

  • 태그

    투 포인터
    자바synchronized키워드
    java 라이브러리 추가
    thread 와 runnable
    githubworkflow
    비트마스킹
    java
    데몬쓰레드
    자바future
    Github
    java synchronized
    기하학
    enum정리
    enum활용법
    spring cors 해결
    자바 runnable
    @embedded
    완전탐색
    정렬
    자바 callable
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
기억은 RAM, 기록은 HDD
[Spring] API 응답에서 직접 정의한 Error code 는 왜 사용할까?
테마상단으로

티스토리툴바