- [Spring] EntityNotFoundException 이란?2023년 11월 02일 01시 50분 01초에 업로드 된 글입니다.작성자: do_hyuk
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를 사용하여 예외를 처리하고 오류 응답을 반환할 수 있다.
'Spring' 카테고리의 다른 글
Spring 이란? (0) 2024.01.03 [Spring Boot] Spring Security & OAuth2.0 사용 - 소셜 로그인 기능 구현하기1 (0) 2023.11.08 [Spring] Spring Security 기본 개념(JWT / OAuth 2.0 / 동작방식 / 구성요소) (0) 2023.11.06 [JPA] 매핑 어노테이션 (0) 2023.10.20 [Spring Data JPA] 파라미터 바인딩 (0) 2023.10.19 댓글