-
Exception HandlingBackEnd/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