ROOM_NOT_FOUND_ERROR
- enum ErrorCode 에서 모든 메시지를 관리함
@Getter
@AllArgsConstructor
public enum ErrorCode {
// Global
INTERNAL_SERVER_ERROR(500, HttpStatus.INTERNAL_SERVER_ERROR, "내부 서버 오류입니다."),
...
// Room
ROOM_NOT_FOUND_ERROR(404, HttpStatus.NOT_FOUND, "해당 방이 존재하지 않습니다.")
...
;
private final int value;
private final HttpStatus status;
private final String message;
}
public class RoomNotFoundException extends ApiException {
public RoomNotFoundException(ErrorCode errorCode) {
super(errorCode);
}
}
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class RoomService {
public void delete(Long id){
Room deleteRoom = repository.findById(id)
.orElseThrow(() -> new RoomNotFoundException(ErrorCode.ROOM_NOT_FOUND_ERROR));
repository.delete(deleteRoom);
}
}
ErrorCode.ROOM_NOT_FOUND_ERROR
는 static import 하여 ROOM_NOT_FOUND_ERROR
으로 작성하는 게 가독성이 좋을 것 같습니다.@Getter
public abstract class ApiException extends RuntimeException {
private ErrorCode errorCode;
public ApiException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
}
public class RoomNotFoundException extends ApiException {
**public RoomNotFoundException(ErrorCode errorCode) {
super(errorCode);
}**
}
ApiException
를 추상 클래스로 만듦super(errorCode)
를 통해 부모 클래스로 값을 전달@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
protected ResponseEntity<ErrorResponse> handleException(final Exception e) {
e.printStackTrace();
**return ResponseEntity
.status(INTERNAL_SERVER_ERROR)
.body(ErrorResponse.of(500, INTERNAL_SERVER_ERROR, e.getMessage()));**
}
@ExceptionHandler(**ApiException.class**)
protected ResponseEntity<ErrorResponse> handleApiException(final ApiException e) {
e.printStackTrace();
ErrorCode errorCode = e.getErrorCode();
**return ResponseEntity
.status(errorCode.getStatus())
.body(ErrorResponse.of(errorCode));
}**
}
@RestControllerAdvice
: @Controller
나 @RestController
에서 발생한 예외를 한 곳에서 관리하고 처리할 수 있게 도와주는 어노테이션
@ExceptionHandler
: 예외 처리 상황이 발생하면 해당 Handler로 처리하겠다고 명시하는 어노테이션
e.printStackTrace()
: 에러의 발생근원지를 찾아서 단계별로 에러를 출력
@ExceptionHandler(Exception.class)
-> 지정하지 않은 에러들은 모두 500 에러로 발생
@ExceptionHandler(ApiException.class)
-> enum ErrorCode 에서 작성한 정보에 따라 에러가 출력됨
@Getter
@AllArgsConstructor
public class ErrorResponse {
private int value;
private HttpStatus status;
private String message;
public static ErrorResponse of(int value, HttpStatus status, String message) {
return new ErrorResponse(value, status, message);
}
public static ErrorResponse of(ErrorCode errorCode) {
int value = errorCode.getValue();
HttpStatus status = errorCode.getStatus();
String message = errorCode.getMessage();
return new ErrorResponse(value, status, message);
}
}
{
"value" : "404"
"status" : "NOT_FOUND"
"message" : "해당 방이 존재하지 않습니다."
}