본문 바로가기

Spring & Java

spring boot exception 처리를 위한 enum 클래스 활용

반응형

오류 발생시 json 형태의 커스텀한 객체를 던지고 싶다.

예외처리시 오류 코드와 오류 메시지는 enum 클래스를 활용한다.


케이스별 예외에 대한 정의를 enum 으로 정의 한다.


public enum ServiceError {

BIND_ERROR(){
@Override
public ResultError getResultError() {
String message = getMessage();
return ResultError.builder()
.httpStatus(HttpStatus.BAD_REQUEST)
.resultCode("40000")
.resultMessage(StringUtils.isEmpty(message) ? "Binding Error." : message)
.build();
}
},
EMAIL_ALREADY_EXIST(){
@Override
public ResultError getResultError() {
return ResultError.builder()
.httpStatus(HttpStatus.BAD_REQUEST)
.resultCode("40001")
.resultMessage("Email Already")
.build();
}
},
PHONE_ALREADY_EXIST(){
@Override
public ResultError getResultError() {
return ResultError.builder()
.httpStatus(HttpStatus.BAD_REQUEST)
.resultCode("40002")
.resultMessage("Phone number is already exit.")
.build();
}
},
NO_SUCH_USER(){
@Override
public ResultError getResultError() {
return ResultError.builder()
.httpStatus(HttpStatus.NOT_FOUND)
.resultCode("40003")
.resultMessage("Not such user.")
.build();
}
};

private String message;

public abstract ResultError getResultError();

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

예외처리 클래스를 상속받아 구현 한 후 위의 serviceError enum 클래스타입으로 사용한다.


public class ServiceException extends RuntimeException{

private static final long serialVersionUID = -7165609979529099309L;

private final ServiceError serviceError;

public ServiceException(ServiceError serviceError) {
super();
this.serviceError = serviceError;
}

public ServiceException(ServiceError serviceError, String message) {
super(message);
this.serviceError = serviceError;
}

public ServiceException(ServiceError serviceError, String message, Throwable cause) {
super(message, cause);
this.serviceError = serviceError;
}

public ServiceException(ServiceError serviceError, Throwable cause) {
super(cause);
this.serviceError = serviceError;
}

public ServiceError getServiceError() {
return serviceError;
}
}

예외처리 에서 예외를 던질때 정의한 타입으로 던지도록 (enum class) 한다.

try {

// 비즈니스 로직 혹은 서버 오류 혹은 디비에러 등등

} catch (ServiceError e) {
log.error("[service] Error {}",e);

ServiceError.BIND_ERROR.setMessage("describe error");

throw new ServiceException(ServiceError. BIND_ERROR, e);

}



Rest Api로 오류 내용을 전달하도록 커스텀 객체를 만든다.


@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
public class ResultError{

@JsonIgnore
private HttpStatus httpStatus;
@JsonProperty(required = true)
private String resultCode;
@JsonProperty(required = true)
private String resultMessage;
}

컨트롤러에서 예외발생시 예외케이스별로 httpstatucode, payload{resultcode,resultmessage} 를 정의하여 던지도록 한다.


@RestControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {

@org.springframework.web.bind.annotation.ExceptionHandler(ServiceException.class)
public ResponseEntity<?> responseException(ServiceException e){
ResultError err = e.getServiceError().getResultError();
return new ResponseEntity<>(err,err.getHttpStatus());
}

// 오류코드 외의 예외 처리는 오버라이드 하여 구현 하도록 한다.

}


반응형