Spring Boot, REST API 예외 응답 로직 작성하기

목표

  • 아래와 같이 REST API 오류 응답시 클라이언트가 이해할 수 있는 충분한 정보를 제공한다.
HTTP/1.1 401 Unauthorized
Content-Type: application/json
{
   "error_code":"INVALID_CLIENT_ID",
   "error_message":"The requested client identifier is invalid.",
   "error_data":{
      "client_id":"x9LHxnqkFp9vcEfUlsCtBG"
   }
}

ExceptionData 설계

package com.jsonobject.example.api.domain;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

@NoArgsConstructor
@Data
public class ApiExceptionData {

    private Map<String, Object> data;

    public ApiExceptionData add(String key, Object value) {

        if (this.data == null) {
            this.data = new HashMap<String, Object>();
        }
        this.data.put(key, value);

        return this;
    }
}

Exception 설계

package com.jsonobject.example.api.exception;

import com.jsonobject.example.api.domain.ApiExceptionData;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

@NoArgsConstructor
@Getter
@Setter
@ToString
@Slf4j
@JsonPropertyOrder(value = {"error_code", "error_message", "error_data"})
public class ApiException extends Exception {

    @JsonProperty("error_code")
    private String code;

    @JsonProperty("error_message")
    private String message;

    @JsonProperty("error_data")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Map data;

    public ApiException(String code, String message) {

        this.code = code;
        this.message = message;
    }

    public ApiException(String code, String message, ApiExceptionData data) {

        this.code = code;
        this.message = message;
        this.data = data.getData();
    }
}

ExceptionHandler 설계

이제 마지막으로 ExceptionHandler를 작성하여 설계한 예외 발생시 후처리 로직을 설계해야 한다. 본 블로그의 아래 글을 참고한다.

예외 발생

  • 이제 시스템에서는 아래와 같이 예외를 발생시키면 된다.
throw new ApiException(

        "INVALID_CLIENT_ID",
        "The requested client identifier is invalid.",
        new ApiExceptionData().add("client_id", client_id)
);
저작자 표시 비영리 동일 조건 변경 허락
신고