Error Responses

Dev.Hammy·2024년 4월 8일
0

반응형 스택에서 이에 상응하는 내용 보기

REST 서비스에 대한 일반적인 요구 사항은 오류 응답 본문에 세부 정보를 포함하는 것입니다. Spring Framework는 "HTTP API에 대한 문제 세부 정보" 사양인 RFC 7807을 지원합니다.

다음은 이 지원에 대한 주요 추상화입니다.

  • ProblemDetail  -  RFC 7807 문제 세부정보에 대한 표현입니다. 사양에 정의된 표준 필드와 비표준 필드에 대한 간단한 컨테이너입니다.

  • ErrorResponse  - HTTP 상태, 응답 헤더 및 본문을 포함한 HTTP 오류 응답 세부 정보를 RFC 7807 형식으로 노출하는 계약입니다. 이를 통해 예외가 HTTP 응답에 매핑되는 방법에 대한 세부 정보를 캡슐화하고 노출할 수 있습니다. 모든 Spring MVC 예외는 이를 구현합니다.

  • ErrorResponseException  - 다른 사람들이 편리한 기본 클래스로 사용할 수 있는 기본 ErrorResponse 구현입니다.

  • ResponseEntityExceptionHandler - 모든 Spring MVC 예외 및 ErrorResponseException을 처리하고 본문으로 오류 응답을 렌더링하는 @ControllerAdvice에 대한 편리한 기본 클래스입니다.

Render

반응형 스택에서 이에 상응하는 내용 보기

@ExceptionHandler 또는 @RequestMapping 메서드에서 ProblemDetail 또는 ErrorResponse를 반환하여 RFC 7807 응답을 렌더링할 수 있습니다. 이는 다음과 같이 처리됩니다.

  • ProblemDetailstatus 속성은 HTTP 상태를 결정합니다.

  • ProblemDetailinstance 속성은 아직 설정되지 않은 경우 현재 URL 경로에서 설정됩니다.

  • 콘텐츠 협상의 경우 Jackson HttpMessageConverterProblemDetail을 렌더링할 때 "application/json"보다 "application/problem+json"을 선호하고 호환되는 미디어 유형이 없으면 이를 대체합니다.

Spring WebFlux 예외 및 ErrorResponseException에 대해 RFC 7807 응답을 활성화하려면 ResponseEntityExceptionHandler를 확장하고 Spring 구성에서 @ControllerAdvice로 선언합니다. 핸들러에는 모든 내장 웹 예외를 포함하는 ErrorResponse 예외를 처리하는 @ExceptionHandler 메소드가 있습니다. 더 많은 예외 처리 메서드를 추가하고 보호된 메서드를 사용하여 모든 예외를 ProblemDetail에 매핑할 수 있습니다.

Non-Standard Fields

반응형 스택에서 이에 상응하는 내용 보기

두 가지 방법 중 하나로 비표준 필드를 사용하여 RFC 7807 응답을 확장할 수 있습니다.

첫째, ProblemDetail의 "속성(properties)" Map에 삽입합니다. Jackson 라이브러리를 사용할 때 Spring Framework는 이 "속성" Map이 래핑 해제되어 응답에서 최상위 JSON 속성으로 렌더링되도록 보장하는 ProblemDetailJacksonMixin을 등록하며 마찬가지로 역직렬화 중 알 수 없는 속성이 이 Map에 삽입됩니다.

ProblemDetail을 확장하여 전용 비표준 속성을 추가할 수도 있습니다. ProblemDetail의 복사 생성자를 사용하면 기존 ProblemDetail에서 하위 클래스를 쉽게 만들 수 있습니다. 이는 중앙에서 수행될 수 있습니다. 추가 비표준 필드가 있는 하위 클래스로 예외의 ProblemDetail을 다시 생성하는 ResponseEntityExceptionHandler와 같은 @ControllerAdvice에서.

Customization and i18n

반응형 스택에서 이에 상응하는 내용 보기

오류 응답 세부 사항을 사용자 정의하고 국제화하는 것은 일반적인 요구 사항입니다. 구현 세부사항이 공개되는 것을 피하기 위해 Spring MVC 예외에 대한 문제 세부사항을 사용자 정의하는 것도 좋은 습관입니다. 이 섹션에서는 이에 대한 지원을 설명합니다.

ErrorResponse는 "type", "title" 및 "detail"에 대한 메시지 코드와 "detail" 필드에 대한 메시지 코드 인수를 노출합니다. ResponseEntityExceptionHandlerMessageSource를 통해 이를 해결하고 그에 따라 해당 ProblemDetail 필드를 업데이트합니다.

메시지 코드의 기본 전략은 다음 패턴을 따릅니다.

  • "type": problemDetail.type.[fully qualified exception class name]

  • "title": problemDetail.title.[fully qualified exception class name]

  • "detail": problemDetail.[fully qualified exception class name][suffix]

ErrorResponse는 둘 이상의 메시지 코드를 노출할 수 있으며 일반적으로 기본 메시지 코드에 접미사를 추가합니다. 아래 표에는 Spring MVC 예외에 대한 메시지 코드와 인수가 나열되어 있습니다.

예외 메시지 코드 메시지 코드 인수

AsyncRequestTimeoutException

(기본값)

ConversionNotSupportedException

(기본값)

{0} 속성 이름, {1} 속성 값

HandlerMethodValidationException

(기본값)

{0} 모든 유효성 검사 오류를 나열합니다. 각 오류에 대한 메시지 코드 및 인수도 MessageSource를 통해 해결됩니다.

HttpMediaTypeNotAcceptableException

(기본값)

{0} 지원되는 미디어 유형 목록

HttpMediaTypeNotAcceptableException

(기본값) + ".parseError"

HttpMediaTypeNotSupportedException

(기본값)

{0} 지원되지 않는 미디어 유형, {1} 지원되는 미디어 유형 목록

HttpMediaTypeNotSupportedException

(기본값) + ".parseError"

HttpMessageNotReadableException

(기본값)

HttpMessageNotWritableException

(기본값)

HttpRequestMethodNotSupportedException

(기본값)

{0} 현재 HTTP 메서드, {1} 지원되는 HTTP 메서드 목록

MethodArgumentNotValidException

(기본값)

{0} 전역 오류 목록, {1} 필드 오류 목록입니다. 각 오류에 대한 메시지 코드 및 인수도 MessageSource를 통해 해결됩니다.

MissingRequestHeaderException

(기본값)

{0} 헤더 이름

MissingServletRequestParameterException

(기본값)

{0} 요청 매개 변수 이름

MissingMatrixVariableException

(기본값)

{0}

매트릭스 변수 이름

MissingPathVariableException

(기본값)

{0} 경로 변수 이름

MissingRequestCookieException

(기본값)

{0} 쿠키 이름

MissingServletRequestPartException

(기본값)

{0} 부분 이름

NoHandlerFoundException

(기본값)

NoResourceFoundException

(기본값)

TypeMismatchException

(기본값)

{0} 속성 이름, {1} 속성 값

UnsatisfiedServletRequestParameterException

(기본값)

{0} 매개 변수 조건 목록

Client Handling

반응형 스택에서 이에 상응하는 내용 보기

클라이언트 애플리케이션은 WebClient를 사용할 때 WebClientResponseException을 포착하거나 RestTemplate을 사용할 때 RestClientResponseException을 포착할 수 있으며 getResponseBodyAs 메소드를 사용하여 오류 응답 본문을 ProblemDetail 또는 ProblemDetail의 하위 클래스와 같은 대상 유형으로 디코딩할 수 있습니다.

0개의 댓글