Spring REST 오류 응답과 문제 상세 관리
HTTP 오류 응답에 문제 상세 정보 담기
Spring에서는 오류가 발생했을 때, 단순히 코드만 전달하는 게 아니라 RFC 9457 규격을 따라 문제 상황에 대한 구체적인 정보를 JSON 형식으로 넣어 보낼 수 있습니다. 예외가 발생하면 상태 코드, 설명, 관련 데이터 등을 함께 응답 바디에 포함할 수 있어, 클라이언트가 쉽게 문제를 파악할 수 있습니다.
핵심 추상화: ProblemDetail과 ErrorResponse
문제 상세 정보는 ProblemDetail이라는 객체에 담깁니다. 이 객체는 규격에 맞는 필드뿐만 아니라, 프로젝트에 맞게 추가적인 정보(비표준 필드)도 넣을 수 있도록 설계되었습니다. ErrorResponse는 HTTP 상태, 헤더, 바디를 묶어서 관리하며 모든 Spring MVC 예외는 이 인터페이스를 구현합니다.
예외 처리와 응답 렌더링
@ExceptionHandler나 @RequestMapping에서 ProblemDetail 또는 ErrorResponse를 반환하면, 자동으로 RFC 9457 JSON 응답이 만들어집니다. Jackson 변환기가 "application/problem+json" 포맷을 우선적으로 사용하며, 필요한 경우 URL 경로 등도 자동으로 채워줍니다.
ResponseEntityExceptionHandler 활용
Spring에서 예외를 공통적으로 처리하려면 ResponseEntityExceptionHandler를 상속하여 @ControllerAdvice로 등록할 수 있습니다. 이 핸들러는 ErrorResponse 계열 예외를 받아 적절한 오류 응답으로 변환합니다. 또한 필요한 경우 예외를 ProblemDetail의 하위 클래스로 만들어 비표준 필드를 추가하는 것도 가능합니다.
RFC 9457 확장: 비표준 필드 추가
문제 상세 정보에 프로젝트별로 더 많은 데이터를 넣고 싶을 때는, ProblemDetail의 "properties" 맵에 직접 항목을 추가하거나, 클래스를 확장해서 전용 필드를 추가할 수 있습니다. Jackson은 이 필드들을 JSON의 최상위 항목으로 자동 반영합니다.
오류 메시지의 커스터마이징과 다국어 지원
에러 메시지의 코드와 상세 내용은 MessageSource를 통해 외부에서 정의한 메시지로 변환할 수 있습니다. 이를 활용하면, 에러 응답을 다국어로 보여주거나, 구현 내부 정보를 숨기고 친숙한 메시지로 바꿀 수 있습니다. 각 에러 타입에 따라 메시지 코드와 인자를 다르게 설정할 수 있어 세밀한 제어가 가능합니다.
특정 예외별 메시지 전략
예를 들어, 미디어 타입 오류, 요청 파라미터 누락, 타입 불일치 등 각 예외마다 어떠한 정보(지원 미디어 타입, 누락된 변수명 등)를 메시지 인자로 넘길 수 있습니다. 단순한 에러뿐 아니라, 검증 오류도 각각의 에러 항목을 세밀하게 다국어로 변환 가능합니다.
클라이언트에서 오류 응답 활용 방법
Spring의 WebClient나 RestTemplate을 사용하는 클라이언트는 오류 발생 시 getResponseBodyAs로 받은 JSON을 직접 ProblemDetail이나 그 하위 타입으로 변환해 처리할 수 있습니다. 이렇게 받은 정보로, 어떤 문제가 발생했는지 코드적으로 대응할 수 있습니다.
출처 및 참고 : Error Responses :: Spring Framework
이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
키워드만 입력하면 나만의 학습 노트가 완성돼요.
책이나 강의 없이, AI로 위키 노트를 바로 만들어서 읽으세요.
콘텐츠를 만들 때도 사용해 보세요. AI가 리서치, 정리, 이미지까지 초안을 바로 만들어 드려요.