errorCode 구조화

이건영·2023년 9월 13일
0
post-custom-banner

개발을 하다 보면 에러를 리턴 해야 할 때가 있다.
보통 http status를 400번대와 error code, error data등을 리턴하게 된다.
하지만 기존 설계에서는 표준에 맞지 않게 리턴하고 있었다.

  • http status 400번, 500번대의 에러를 200번대로 리턴함
  • error message가 파편화 되어서 정의 되어 같은 error code임에도 불구하고 서로 다른 error message 리턴함

error code 관련해서 구조화 작업을 진행 했다.

errorCode interface

public interface ErrorCode {
	HttpStatus retrieveHttpStatus();
	String retrieveErrorCode();
	String retrieveErrorMessage();
}

ErrorCodeField class

  • enum값 내부에 field로 선언하여 http status, error code, error message를 담기 위한 class
public class ErrorCodeField {
	private final HttpStatus httpStatus;
    private final String errorCode;
	protected final String errorMessage;
}

각 도메인 마다 생성 될 error code enum

  • errorCode interface 상속
  • enum 이름 : errorcode, value값: http status, error message
public enum UserErrorCodeV2 implements ErrorCode {
	USER_INFO_NOT_FOUND(BAD_REQUEST, "user info is not exist");

	private final ErrorCodeField errorCodeField;

	UserErrorCodeV2(HttpStatus httpStatus, String errorMessage) {
		errorCodeField = new ErrorCodeField(httpStatus, errorMessage);
	}

	@Override
	public HttpStatus retrieveHttpStatus() {
		return errorCodeField.getHttpStatus();
	}

	@Override
	public String retrieveErrorCode() {
		return isNull(errorCodeField.getErrorCode()) ? name() : errorCodeField.getErrorCode();
	}

	@Override
	public String retrieveErrorMessage() {
		return errorCodeField.getErrorMessage();
	}
}

ErrorCodeField class

  • error code 리턴 시 data가 담길 class
public class ErrorBodyDto {
	private String errorCode;

	private String errorMessage;

	private Object errorData;

	public ErrorBodyDto(String errorCode, String errorMessage) {
		this.errorCode = errorCode;
		this.errorMessage = errorMessage;
	}

	public static ErrorBodyDto of(String errorCode, String errorMessage) {
		return ErrorBodyDto.builder()
			.errorCode(errorCode)
			.errorMessage(errorMessage)
			.build();
	}
}

ResponseErrorException class

  • RuntimeException을 customizing을 위한 class
  • http status, 에러 데이터 리턴을 위한 ErrorBodyDto
public class ResponseErrorException extends RuntimeException {

	private HttpStatus httpStatus;
	private ErrorBodyDto errorBody;
       
	private ResponseErrorException(HttpStatus httpStatus, ErrorBodyDto errorBody) {
		this.httpStatus = httpStatus;
		this.errorBody = errorBody;
	}
    
	private ResponseErrorException(ErrorCode errorCode, Object errorData) {
		super(createResponseErrorMessage(errorCode));

		this.httpStatus = errorCode.retrieveHttpStatus();
		this.errorBody = ErrorBodyDto.builder()
			.errorCode(errorCode.retrieveErrorCode())
			.errorMessage(errorCode.retrieveErrorMessage())
			.errorData(errorData)
			.build();
	}
    
	public static ResponseErrorException of(ErrorCode errorCode){
		return new ResponseErrorException(errorCode, null);
	}
    
	public static ResponseErrorException of(ErrorCode errorCode, Object errorData){
		return new ResponseErrorException(errorCode, errorData);
	}
 

}
  • 표준에 따른 http status code return으로 인한 소통 원할
  • ErrorCode 라는 interface 설계
    • code, message, http status 구조화함
    • 일관 되지 않았던 response 형식 refactoring
    • 각 도메인 별로 ErrorCode를 분리하여 관리
      • 관리 용이성 증가
      • 특정 domain에서 어떠한 error가 있는지 파악 용이
profile
일단 해보자
post-custom-banner

0개의 댓글