ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Exception Handling
    BackEnd/Spring Boot 2022. 4. 5. 22:00
    반응형

    Overview

      해당 글에서는 Spring AOP를 이용하여 Exception Handling 처리를 하겠습니다.

     

    GoodsController

      Exception Handling 처리를 위해 상품코드: 1로 호출 시에만 정상적으로 상품정보를 반환하고 그 외에는 Exception이 발생한다고 가정하겠습니다. (상품코드: 10000 호출 시 사용자 정의 Exception인 GoodsNotFoundException 발생, 그 외 최상위 Exception인 Exception 발생)

    package com.spring.springboot;
    
    import com.spring.springboot.domain.Goods;
    import com.spring.springboot.exception.GoodsNotFoundException;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GoodsController {
    
      @GetMapping(path = "/goods/{goodsCode}") // endpoint
      public Goods findGoods(@PathVariable int goodsCode) throws Exception {
    
        if (goodsCode == 1) {
          Goods goods = new Goods(goodsCode, "1번 상품입니다.");
          return goods;
        } else if (goodsCode == 10000) {
          throw new GoodsNotFoundException("GoodsNotFoundException");
        } else {
          throw new Exception("Exception");
        }
      }
    }

    com.spring.springboot.domain.Goods;

    package com.spring.springboot.domain;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Goods {
    
      private int goodsCode;
      private String goodsName;
    }

    com.spring.springboot.exception.GoodsNotFoundException;

    package com.spring.springboot.exception;
    
    public class GoodsNotFoundException extends RuntimeException {
    
      public GoodsNotFoundException(String message) {
        super(message);
      }
    }

     

    ExceptionHandler

      Exception 처리를 위해 시간, 메시지, 상세정보를 가지는 도메인 클래스(ExceptionResponse)를 정의하고, 모든 컨트롤러에서 예외 발생 시 핸들링하는 CustomizedResponseEntityExceptionHandler 클래스를 구현하겠습니다.

    package com.spring.springboot.exception;
    
    import java.util.Date;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class ExceptionResponse {
    
      private Date timestamp;
      private String message;
      private String details;
    }
    package com.spring.springboot.exception;
    
    import java.util.Date;
    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;
    
    @RestController
    @ControllerAdvice
    public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    
      @ExceptionHandler(Exception.class)
      public final ResponseEntity<Object> handleAllExceptions(Exception e, WebRequest request) {
        ExceptionResponse exceptionResponse =
            new ExceptionResponse(new Date(), e.getMessage(), request.getDescription(false));
    
        return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
      }
    
      @ExceptionHandler(GoodsNotFoundException.class)
      public final ResponseEntity<Object> handleGoodsNotFoundExceptions(Exception e,
          WebRequest request) {
        ExceptionResponse exceptionResponse =
            new ExceptionResponse(new Date(), e.getMessage(), request.getDescription(false));
    
        return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
      }
    }
    • @ControllerAdvice: @Controller나 @RestController에서 발생한 예외를 한 곳에서 처리할 수 있게 해주는 애노테이션입니다. basePackageClasses, basePackages 속성을 이용하여 특정 클래스에서 발생하는 예외만 받아서 처리할 수 있습니다.
    • @ExceptionHandler: 등록한 예외 발생 시 핸들링합니다.
    • ResponseEntity: Header와 Body에 응답 객체를 저장하여 반환할 수 있는 클래스입니다.

     

    Note. JSON Viewer

      크롬 확장 프로그램인 JSON Viewer는 JSON 형식의 파일을 가독성 좋게 정렬하여 출력합니다.

     

    [JSON Viewer 적용 전]


    [JSON Viewer 적용 후]


    실행결과

    반응형

    'BackEnd > Spring Boot' 카테고리의 다른 글

    다국어 처리(Internationalization)  (0) 2022.04.08
    Validation  (0) 2022.04.06
    Spring Boot 설정 및 동작 원리  (0) 2022.04.05
    Spring Boot  (0) 2022.04.02
    Swagger  (0) 2021.07.23

    댓글

Designed by Tistory.