Spring

[Spring] EntityNotFoundException 이란?

do_hyuk 2023. 11. 2. 01:50

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를 사용하여 예외를 처리하고 오류 응답을 반환할 수 있다.