관리 메뉴

코딩하는 락커

[Spring Boot를 이용한 RESTful Web Services 개발] 16강 본문

🍃 Spring/🌱 Spring Boot를 이용한 RESTful Web Service

[Spring Boot를 이용한 RESTful Web Services 개발] 16강

락꿈사 2022. 2. 7. 17:27

예외 클래스 생성

  • ExceptionResponse라는 Java 객체를 선언하여 예외 발생 시간, 예외 메시지, 상세정보 등 저장.
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;
}

 

일반적인 예외 클래스 생성

  • ResponseEntityExceptionHandler 클래스를 상속받은 Handler 클래스 선언
  • ResponseEntityExceptionHandler 클래스 : 시스템에서 에러 발생시 에러를 핸들링하기 위해 스프링에서 제공하는 클래스 
  • ControllerBean에서 예외 발생시 이 클래스가 발생하도록 설정
  • AOP : 스프링 프레임워크에서 로깅 정보, 로그인 정보, 메시지 추가 정보 등 모든 비즈니스 로직을 수행하는 Controller에서 항상 실행시켜줘야 하는 공통적인 로직
  • 스피링 부트 어플리케이션에서 공통적으로 처리 되어야 하는 로직, 메소드 등을 추가할 때 사용
  • @RestController 어노테이션 추가하여 웹 서비스에서 사용할 수 있도록 함
  • @ContollerAdvice 어노테이션 추가하여 모든 Controller가 실행될 때 반드시 이 어노테이션이 붙은 Bean이 실행되도록 함
package com.example.restfulwebservice.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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 {
    
    // ResponseEntity는 사용자 객체 한명 추가했을 때 반환하는 형태의 값
    // Exception ex는 메소드에서 발생했던 에러 객체
    // WebRequest request는 어디서 발생했는지 알아보기 위한 request 정보
    // @ExceptionHandler 어노테이션은 이 메소드가 ExceptionHandler로 사용될 수 있음을 지칭.
    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> handlerAllException(Exception ex, WebRequest request){
        
        // 발생 날짜, 에러 메시지, request의 부가적인 내용
        ExceptionResponse exceptionResponse =
                new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));

         // 위 값을 ResponseEntity의 인자로 넣어 반환
         // 서버에서 발생하는 일반화 된 에러이기 때문에 HttpStatusCode는 500번이고 INTERNAL_SERVER_ERROR로 지정
        return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

존재하지 않는 사용자 호출시 위 코드로 발생시킨 500번 에러와 반환된 메시지 값은 등록한 ExceptionResponse객체에 담긴 timestamp, message, details 정보가 포함된 것을 볼 수 있음

 

존재하지 않는 사용자를 요청할 때 발생시킬 예외 클래스 생성

// @ExceptionHandler(UserNotFoundException.class)를 사용하여 사용자가 없을 때의 예외로 지정
@ExceptionHandler(UserNotFoundException.class)
public final ResponseEntity<Object> handleUserNotFound(Exception ex, WebRequest request){
    
    // 발생 날짜, 에러 메시지, request의 부가적인 내용
    ExceptionResponse exceptionResponse =
            new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));

    // 위 값을 ResponseEntity의 인자로 넣어 반환
    // status code를 NotFound로 지정
    return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
}

존재하지 않는 사용자 호출시 아까와 다르게 404 에러와 반환된 메시지 값은 등록한 ExceptionResponse객체에 담긴 timestamp, message, details 정보가 포함된 것을 볼 수 있음

Comments