Skip to content

[REFACTOR] 요청 검증 실패 공통 에러 코드 도입 #594

Description

@GiJungPark

Description

작업 배경

현재 GlobalExceptionHandler는 DTO Bean Validation 실패(MethodArgumentNotValidException)와 잘못된 JSON 형식(HttpMessageNotReadableException)을 모두 HTTP 상태 이름인 BAD_REQUEST 코드로 응답합니다.

{
  "code": "BAD_REQUEST",
  "message": "컬렉션 이름은 비어 있거나, 공백일 수 없습니다."
}

HTTP 상태는 둘 다 400으로 적절하지만, 응답의 서비스 에러 코드까지 같아 클라이언트와 API 문서에서 요청 필드 검증 실패와 JSON 파싱 실패를 구분할 수 없습니다. 컬렉션 API 문서화(#560) 과정에서 이 문제가 확인되어, 특정 도메인에 속하지 않는 요청 처리 오류를 공통 에러 코드로 정의합니다.

목표 상태

  • DTO Bean Validation 실패가 공통 서비스 에러 코드로 응답됩니다.
  • 잘못된 JSON 형식이 DTO 검증 실패와 다른 공통 서비스 에러 코드로 응답됩니다.
  • HTTP 상태와 사용자에게 전달하는 구체적인 검증 메시지는 기존 계약을 유지합니다.
  • 컬렉션 등 도메인 비즈니스 규칙 오류는 기존 도메인 코드를 계속 사용합니다.

에러 코드 초안

코드 HTTP 상태 용도
COMMON-001 400 Bad Request DTO Bean Validation 실패
COMMON-002 400 Bad Request 요청 본문 JSON 파싱 실패
  • COMMON-001message는 실패한 검증 애너테이션의 구체적인 메시지를 사용합니다.
  • 필드마다 별도의 공통 에러 코드를 만들지 않습니다.
  • 작품 수·중복 작품과 같은 비즈니스 규칙은 COLLECTION-002 등 기존 도메인 코드를 유지합니다.

작업 범위

  • 공통 요청 오류를 표현하는 ICustomError 구현 enum 추가
  • MethodArgumentNotValidException 응답 코드를 COMMON-001로 변경
  • HttpMessageNotReadableException 응답 코드를 COMMON-002로 변경
  • 동적 Bean Validation 메시지와 공통 코드 조합 방식 정리
  • 관련 예외 처리 테스트 추가
  • 기존 REST Docs 테스트와 OpenAPI 오류 예시 갱신
  • 공통 에러 코드 명명·사용 기준 문서화

제외 범위

  • 도메인 비즈니스 오류 코드 변경
  • DTO 필드별 개별 에러 코드 신설
  • ErrorResult 응답 구조 변경 또는 필드별 오류 배열 추가
  • 데이터베이스 무결성 오류와 파일 업로드 오류 코드 정비
  • HTTP 400을 422로 변경

완료 조건

  • DTO 검증 실패 응답의 codeCOMMON-001입니다.
  • 잘못된 JSON 요청 응답의 codeCOMMON-002입니다.
  • DTO 검증 실패 시 기존의 구체적인 검증 메시지가 유지됩니다.
  • 도메인 예외의 기존 에러 코드와 HTTP 상태가 변경되지 않습니다.
  • 관련 예외 처리 테스트와 API 문서 테스트가 통과합니다.
  • 생성된 OpenAPI 명세에서 두 공통 오류가 서로 다른 named example로 확인됩니다.

To-Do

  • 공통 요청 오류 enum 및 코드 정의
  • DTO Bean Validation 예외 처리 변경
  • JSON 파싱 예외 처리 변경
  • 예외 처리 테스트 추가
  • REST Docs 및 OpenAPI 예시 갱신
  • 공통 에러 코드 사용 기준 문서화

Reference

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions