상세 컨텐츠

본문 제목

SpringBoot - Error Handling

Spring/Restfull API

by ChrisMare 2023. 9. 30. 18:49

본문

에러 핸들링

 

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상태 코드를 전송하고 싶은 데이터와 함께 전송할 수 있기 때문에 좀 더 세밀한 제어가 필요한 경우 사용한다고 합니다.

ReponseEntity 구조

ResponseEntity는 HttpEntity를 상속받고 사용자의 응답 데이터가 포함된 클래스이기 때문에

HttpStatus, HttpHeaders, HttpBody 를 포함한다. 

 

이러한 방식을 활용하여

 

Controller에서는 비즈니스 코드의 결과만 리턴하고AOP를 통해서 깜싸서 응답결과와 성공여부, Controller에서 처리된 데이터등을 담아서 사용할 수 있다.이때 성공일때는 Success를 넘기면 되고 에러 혹은 예외일 시 Fail 및 예외정보를 넘겨서 처리한다면항상 클라이언트쪽에서는 동일한 결과를 가지고 처리할 수 있다.

 

'Spring > Restfull API' 카테고리의 다른 글

SpringBoot RESTfull Service  (0) 2023.09.30

관련글 더보기

댓글 영역