@RestControllerAdvice
public class ErrorControllerAdvice {
@ExceptionHandler(value = Exception.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
protected ResponseEntity<ErrorResponse> handleException(Exception e) {
ErrorResponse response = ErrorResponse.of(ErrorCode.TEMPORARY_SERVER_ERROR);
response.setDetail(e.getMessage());
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(value = NoSuchElementException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
protected ResponseEntity<ErrorResponse> handleNoSuchElementException(Exception e) {
ErrorResponse response = ErrorResponse.of(ErrorCode.RESOURCE_NOT_FOUND);
response.setDetail(e.getMessage());
return new ResponseEntity<>(response, HttpStatus.NO_CONTENT);
}
//요 밑으로 쭉쭉 추가적인 ExceptionHandler들을 추가해서 처리합니다
/* Custom Error Handler */
@ExceptionHandler(value = CustomException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
protected ResponseEntity<ErrorResponse> handleCustomException(CustomException e) {
ErrorResponse response = ErrorResponse.of(e.getErrorCode());
response.setDetail(e.getMessage());
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}
}
요러면 ErrorControllerAdvice 클래스 하나에 어노테이션 붙여서 생성하면 끄읕! 😎TMI.
저는 특별한 경우가 아니면
BadRequest(400)으로 통일
& Enum으로 선언된 에러코드를 사용
& 공통된 클래스로 동일 json포맷으로 wrapping
- 프론트엔드에서 메시지를 공통 처리하기 용이하도록 했습니당
예를 들면, 아래와 같이 작성한 Controller/Service에서 Exception을 던지는 경우에
알아서 ExceptionHandler가 동작하도록 연결되어 있는 상태인 거죵
@ApiOperation(value = "그룹 조회")
@GetMapping(value = "/{groupId}")
@ResponseBody
public GroupDto.Response getGroup(@PathVariable Long groupId) {
Organization group = this.organizationJpaRepository
.findByUseYnAndAndOrgIdAndType("Y", groupId, this.GROUP)
.orElseThrow(NoSuchElementException::new);
return this.customMapper.map(group, GroupDto.Response.class);
}
다음 시리즈는 ErrorCode를 Enum처리 하고 공통 포맷으로 보내는 방법에 대해 이야기해보려고 합니다 (아래 요 코드처럼요)
ErrorResponse response = ErrorResponse.of(ErrorCode.INVALID_TOKEN);