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를 설정하면, 하위의 예외들을 메소드 하나로 모두 처리할 수 있습니다.
'프로젝트 Project' 카테고리의 다른 글
OAuth2 로그인 구현하기 (2) | 2024.08.06 |
---|---|
Spring Security + JWT로 로그인 구현하기 (2) (1) | 2024.08.06 |
static 내부 클래스로 DTO 관리하기 (0) | 2024.08.06 |
Spring Security + JWT로 로그인 구현하기 (1) (0) | 2024.08.05 |
멀티 모듈로 프로젝트 구성하기 (0) | 2024.08.05 |