프로젝트 Project

추상 클래스로 예외 규격 설정하기

달래dallae 2024. 8. 6. 10:46

Rest API는 JSON 데이터로 요청하고 JSON 데이터로 응답하는 것이 표준입니다.

이는 오류를 응답할 때에도 같은 방식이 적용됩니다.

각 오류상황(정상/오류 등)에 맞는 응답스펙을 정한 뒤, 해당 포맷에 맞게 JSON으로 응답합니다.

 

Request Body

{
	"id" : "dallae",
	"pwd" : "password!@#"
}

Response Body

{
  "tiemStamp" : "2024-04-28T00:00:00.000+00:00",
  "status" : 404,
	"message" : "사용자를 찾을 수 없습니다.",
	"path" : "/api/login"
}

 


추상클래스로 Exception 규격 설정하기

추상클래스는 상속하는 클래스에게 메소드의 구현을 강제하면서, 해당 메소드의 내용을 위임 할 수 있습니다.

따라서 객체지향적인 예외 관리가 가능해집니다.

추상 클래스를 활용하면 API 의 성격에 따라 모두 다른 형식의 에러 응답을 공통적으로 설정할 수 있습니다.

✔️ 구현

추상 클래스

public abstract class CustomApiException extends RuntimeException {
    public abstract HttpStatus getStatus();

    public CustomApiException (String message) {super(message);}
}
  • 추상클래스도 RuntimeException를 상속받아, 던져진 예외를 잡을 수 있습니다.
  • 또한 HttpStatus 를 추상 메소드로 만들어서, 구현하는 클래스에서 예외 응답 코드를 설정해 줄 수있도록 구현하였습니다.

 

예외 클래스

public class NotFoundException extends CustomApiException {
    @Override
    public HttpStatus getStatus() {
        return HttpStatus.NOT_FOUND;
    }

    public NotFoundException (String message) {
        super(message);
    }
}
  • 예외 메시지는 로직에서 예외를 던질 때 설정할 수 있도록 구현했습니다.

 

로직에서 예외 던지기

public Friend findValidFriend(Long friendId) {
    return friendRepository.findById(friendId)
            .orElseThrow(() -> new NotFoundException("존재하지 않는 내역입니다."));
}

 

RestControllerAdvice

@RestControllerAdvice
public class ApiExceptionAdvice {
    @ExceptionHandler(CustomApiException.class)
    public ResponseEntity<ExceptionResponse> handleCustomApiException(CustomApiException e) {
        return ResponseEntity.status(e.getStatus())
                .body(new ExceptionResponse(e.getMessage(), LocalDateTime.now()));
    }
}
  • ControllerAdvice에서 추상클래스로 ExceptionHandler를 설정하면, 하위의 예외들을 메소드 하나로 모두 처리할 수 있습니다.