1. 기존의 사용하던 BaseException의 문제점

BaseResponse라는 커스텀 객체에 BaseException 객체를 보내서 결과 코드를 전송하는 방식이었다.

package com.sinor.cache.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
@JsonPropertyOrder({"isSuccess", "code", "message", "data"})
public class BaseResponse<T> {
	@JsonProperty("isSuccess")
	private final Boolean isSuccess;
	private final int code;
	private final String message;
	@JsonInclude(JsonInclude.Include.NON_NULL)
	private T data;

	// 요청에 성공한 경우
	public BaseResponse(BaseResponseStatus status, T data) {
		this.isSuccess = status.isSuccess();
		this.message = status.getMessage();
		this.code = status.getCode();
		this.data = data;
	}

	// 요청에 실패한 경우
	public BaseResponse(BaseResponseStatus status) {
		this.isSuccess = status.isSuccess();
		this.message = status.getMessage();
		this.code = status.getCode();
	}

}

해당 Response에

package com.sinor.cache.common;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class BaseException extends Exception {
	private BaseResponseStatus status;

	public BaseException(BaseResponseStatus status) {
		super(status.getMessage());
		fillInStackTrace();
		this.status = status;
	}

}

을 담아서 Status를 Body에 담아서 결과를 반환하는 형태였는데 이는 문제점이 많았다.

문제점

2. Global Exception Handler

@RestControllerAdvice@ExceptionHandler를 사용하여 전역의 RestController에서 Excetion을 감지하는 클래스를 정의한다.

package com.sinor.cache.common;

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

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestControllerAdvice
public class GlobalBindingControllerAdvice {
	@ExceptionHandler(BaseException.class)
	public ResponseEntity<?> customException(BaseException e){
		log.error("Base exception occurred" + e.getStatus().getCode(), e);

		Map<String, Object> responseBody = new HashMap<>();
		responseBody.put("isSuccess", e.getStatus().isSuccess());
		responseBody.put("status", e.getStatus().getCode());
		responseBody.put("message", e.getStatus().getMessage());

		return ResponseEntity.status((e).getStatus().getCode()).body(responseBody);
	}
}

결과

3. 뭔가 맘에 안든다.