에러 핸들링
RESTfull API 사용중
클라이언트오류, 서버측 오류, 성공 등 Http Status 결과와 에러 메시지등을 보내어 효율적으로 관리해보자
우선 exception을 관리하는 packages 생성 후
1. Exception 객체 생성
2. 해당 Exception객체를 사용하여 에러를 응답하는 핸들러를 만들어야된다.
1. ExceptionResponse : 에러 응답 객체 생성
package com.example.restfulwebservice.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExceptionResponse {
private Date timestamp;
private String message;
private String details;
}
2. 해당 응답 에러 객체를 사용하여 처리하는 에러 헨들러 클래스 생성
package com.example.restfulwebservice.exception;
import com.example.restfulwebservice.user.UserNotFoundException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import java.util.Date;
@RestController
@ControllerAdvice //? 모든 컨트롤러가 실행 될 때 실행된다.
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
// 디폴트 Exception 발생 시
@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest reqeust) {
ExceptionResponse exceptionResponse =
new ExceptionResponse(new Date(), ex.getMessage(), reqeust.getDescription(false));
return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
// UserNotFoundException 예외 발생 시
@ExceptionHandler(UserNotFoundException.class)
public final ResponseEntity<Object> handleUserNotFoundException(Exception ex, WebRequest reqeust) {
ExceptionResponse exceptionResponse =
new ExceptionResponse(new Date(), ex.getMessage(), reqeust.getDescription(false));
return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
ExceptionResponse exceptionResponse =
new ExceptionResponse(new Date(), "Validation Failed", ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
}
@RestController: Error 응답 객체를 처리한다.
@ControllerAdvice: 모든 컨트롤러가 실행 될 때 처리되는 역할을 수행한다. 값으로 특정 패키지로 제한을 둘 수도 있다.
ResponseEntity ?
ResponseEntity란, httpentity를 상속받는, 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스이다.
ResponseEntity에는 사용자의 HttpRequest에 대한 응답 데이터가 포함된다.
✨ 또한, HTTP 아케텍쳐 형태에 맞게 Response를 보내주는 것에도 의미가 있습니다.
에러 코드와 같은 HTTP상태 코드를 전송하고 싶은 데이터와 함께 전송할 수 있기 때문에 좀 더 세밀한 제어가 필요한 경우 사용한다고 합니다.
ResponseEntity는 HttpEntity를 상속받고 사용자의 응답 데이터가 포함된 클래스이기 때문에
HttpStatus, HttpHeaders, HttpBody 를 포함한다.
이러한 방식을 활용하여
Controller에서는 비즈니스 코드의 결과만 리턴하고AOP를 통해서 깜싸서 응답결과와 성공여부, Controller에서 처리된 데이터등을 담아서 사용할 수 있다.이때 성공일때는 Success를 넘기면 되고 에러 혹은 예외일 시 Fail 및 예외정보를 넘겨서 처리한다면항상 클라이언트쪽에서는 동일한 결과를 가지고 처리할 수 있다.
SpringBoot RESTfull Service (0) | 2023.09.30 |
---|
댓글 영역