개발/Spring
[Springboot] Exception 처리하기
joon95
2022. 8. 4. 16:07
반응형
springboot 로 RestApi 를 만들다보니 Exception 처리는 필수이다.
한번 해보자.
에러는
{“error”:”에러코드”,”error_decription”:”에러설명”}
위와 같이 내보낼 것이다.
ErrorEnum 정의
@Getter
public enum ErrorEnum {
/* API 응답 코드 */
E00000("00000", "처리 성공", HttpStatus.OK),
E40401("40401", "요청한 엔드포인트가 존재하지 않습니다.", HttpStatus.NOT_FOUND);
E50002("50002", "API 요청 처리 실패.", HttpStatus.INTERNAL_SERVER_ERROR);
private String code;
private String msg;
private HttpStatus status;
private ErrorEnum(String code, String msg, HttpStatus status) {
this.code = code;
this.msg = msg;
this.status = status;
}
}
커스텀 Exception 정의
@SuppressWarnings("serial")
@Getter
public class ApiException extends RuntimeException{
private String errCode;
private String errMsg;
private HttpStatus status;
public ApiException(String s) {
super(s);
}
public ApiException(ErrorEnum e) {
super(e.getMsg());
this.errCode = e.getCode();
this.errMsg = e.getMsg();
this.status = e.getStatus();
}
}
글로벌 Exception 정의
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ApiException.class)
protected ResponseEntity<HashMap> handleCustomException(ApiException e){ //ErrorEnum.E40001
// System.out.println(e.getErrCode() + " / " + e.getErrMsg() + " / " + e.getStatus());
HashMap<String, String> map = new HashMap<String, String>();
map.put("error_description", e.getErrMsg());
map.put("error", e.getErrCode());
return new ResponseEntity<HashMap>(map, e.getStatus());
}
}
Exception 사용하기
controller 에 try 및 throw 설정
// 등록
@PostMapping
public ResponseEntity<User> addUser(@RequestBody User user) throws Exception{
ResponseEntity<User> res;
try {
res = new ResponseEntity<User>(userService.addUser(user), HttpStatus.OK);
} catch (Exception e) {
throw new ApiException(ErrorEnum.E50002);
}
return res;
}
user를 등록하다가 exception이 발생하면 error를 캐치하게 됨
테스트
+ 404 Handler 처리
NoHandlerFoundException 설정
글로벌 Exception 클래스에 추가
@ExceptionHandler(NoHandlerFoundException.class)
protected ResponseEntity<HashMap> handleNoHandlerFoundException(NoHandlerFoundException e,
HttpServletRequest request) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("error_description", ErrorEnum.E40401.getMsg());
map.put("error", ErrorEnum.E40401.getCode());
return new ResponseEntity<HashMap>(map, ErrorEnum.E40401.getStatus());
}
application.properties 설정
spring.mvc.throw-exception-if-no-handler-found: true
spring.web.resources.add-mappings: false
테스트
끝!
반응형