공통 응답 엔티티로 사용될 클래스 내용입니다.
package com.mvp.common.exception;
import com.mvp.common.ResponseDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import java.util.NoSuchElementException;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
/**
* @ExceptionHandler(감지 할 예외)
* INTERNAL_SERVER_ERROR 예외의 상태 코드와 메시지를 ResponseEntity<ResponseDto> 만들어준다.
* return handleExceptionInternal(ErrorCode.INTERNAL_SERVER_ERROR);
*/
@ExceptionHandler({Exception.class})
public ResponseEntity<ResponseDto> handleAllException(Exception ex) {
log.error("[exceptionHandle] ex", ex);
return handleExceptionInternal(StatusCode.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(RestApiException.class)
public ResponseEntity<ResponseDto> handleRestApiException(RestApiException ex) {
return handleExceptionInternal(ex.getStatusCode());
}
private ResponseEntity<ResponseDto> handleExceptionInternal(StatusCode errorCode) {
return ResponseEntity
.status(errorCode.getHttpStatus())
.body(new ResponseDto(errorCode,null));
}
}
ResponseEntityExceptionHandler를 상속받습니다.catch하여 에러코드로 응답합니다.handleAllException : 일반적인 에러를 catch하는 메소드 (RestApiException을 제외한 코드를 모두 잡습니다.)handleRestApiException : 사용자 지정 에러코드를 catch합니다.handleExceptionInternal : 위에서 catch한 에러코드를 responseEntity로 변환하여 반환합니다.package com.mvp.common.exception;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class RestApiException extends RuntimeException {
private final StatusCode statusCode;
}
RuntimeException을 상속하는 사용자 정의 에러Enum 타입 statusCode를 멤버로 가집니다.package com.mvp.common.exception;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
@Getter
@RequiredArgsConstructor
public enum StatusCode {
SUCCESS(HttpStatus.OK, "정상적으로 요청이 완료되었습니다."),
BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."),
UNAUTHORIZED_REQUEST(HttpStatus.UNAUTHORIZED, "인증되지 않은 사용자입니다."),
FORBIDDEN_ACCESS(HttpStatus.FORBIDDEN, "권한이 없는 사용자입니다."),
NOT_FOUND(HttpStatus.NOT_FOUND, "Not found."),
METHOD_NOT_ALLOWED(HttpStatus.METHOD_NOT_ALLOWED, "허용되지 않은 Request Method 호출입니다."),
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류"),
NO_SUCH_ELEMENT(HttpStatus.BAD_REQUEST,"존재하지 않는 요소입니다."),
DUPLICATE_EMAIL(HttpStatus.BAD_REQUEST, "중복된 이메일 입니다."),
INVALID_EMAIL_OR_PASSWORD(HttpStatus.BAD_REQUEST,"이메일 혹은 비밀번호가 일치하지 않습니다");
private final HttpStatus httpStatus;
private final String message;
}
Enum 타입으로 정의하시면 되겠습니다.