[Spring] EntityNotFoundException 이란?
1. 사용 예시
이번 글은 Spring에서 데이터베이스에 있는 데이터를 조회하는 경우 해당 데이터가 없을 때 발생시킬 예외 중 하나를 소개하겠다.
전에는 존재하지 않는 데이터를 조회하는 예외처리를 할 때마다 NoSuchElementExeption만 사용했었다.
위와 같은 경우에서 예외를 처리하는 권장 방법 중 하나는 커스텀 예외를 발생시키는 것이다.
2. 예외 발생 방법
Spring.io를 보면, 이런 경우에 대한 권장 커스텀 예외가 바로 EntityNotFoundException이다.
이 예외는 일반적으로 데이터베이스에서 리소스를 찾을 수 없을 때 사용된다.
이 예외는 java.persistence 패키지의 일부로서 쿼리에서 결과가 없을 때 레포지토리 레이어에서 발생시킬 수 있다.
Spring Data JPA는 이미 이 예외를 제공중이니 추가 설정 없이 사용 가능하다.
/**
* 문제 삭제
*/
@Transactional
public Long delete(Long problem_id, Member member){
Optional<Problem> problemByIdAndWriter =
problemRepository.findProblemByIdAndWriter(problem_id, member);
if(problemByIdAndWriter.isEmpty()){
throw new EntityNotFoundException(String.format("problem id '%d'가 존재하지 않습니다.", problem_id));
}
problemRepository.deleteById(problem_id);
return problem_id;
}
이러한 예외를 처리하는 또 다른 방법으로는 RuntimeExceotion과 같은 더 일반적인 예외를 발생시키는 것이다.
그러나 이 방법은 오류에 대한 구체적인 정보를 제공하지 않으므로 디버깅하기 어려울 수 있다.
위와 같은 예외를 발생시킬 때, 발생한 오류에 대한 명확한 메시지를 제공하는 것이 중요하다.
예를 들어 메시지로 "problem id 1234가 존재하지 않습니다"와 같이 오류를 설명할 수 있다.
3. 예외 catch
예외를 catch하고 처리하기 위해 컨트롤러 레이어에서 try-catch 블록을 사용하는 것이 중요하다.
예외가 catch되면 적절한 HTTP 상태 코드(404 Not Found)와 함께 오류 응답을 클라이언트에 반환할 수 있다.
오류 응답은 또한 발생한 오류를 설명하는 메시지를 포함할 수 있다.
@GetMapping("/{memberId}")
public ResponseMeberEntity<MemberResponseDTO> getMemberById(@PathVariable long member_id) {
MemberResponseDTO result;
try {
result = memberService.getMember(member_id);
} catch (EntityNotFoundException e) {
log.error(e.getMessage());
return new ResponseMeberEntity<>(HttpStatus.NOT_FOUND);
}
return new ResponseMeberEntity<>(result, HttpStatus.OK);
}
4. 기타 방법
이 예외를 처리하는 또 다른 방법은 Spring의 ResponseEntityExceptionHandler를 사용하는 것입니다.
이 클래스는 예외를 catch하고 클라이언트에 오류 응답을 반환하는 글로벌 예외 핸들러를 제공합니다.
이 클래스를 사용하려면 상속하고 특정 예외를 처리하기 위해 메서드를 오버라이딩 해야합니다.
예를 들어, handleEntityNotFoundException 메서드를 재정의하여 오류가 발생한 것을 설명하는 메시지와 함께
404 Not Found 응답을 반환할 수 있습니다.
5. 요약
요약하면, Spring 애플리케이션에서 데이터베이스에서 게시글을 가져올 때, 게시글이 존재하지 않는 경우
EntityNotFoundException과 같은 커스텀 예외를 발생시키는 것이 권장됩니다.
이 예외는 무엇이 잘못되었는지 설명하는 명확한 메시지를 포함해야한다.
예외는 컨트롤러 레이어에서 catch 되어 오류 응답을 반환하여 처리할 수 있다.
또는 Spring의 ResponseEntityExceptionHandler를 사용하여 예외를 처리하고 오류 응답을 반환할 수 있다.