[Spring] EntityNotFoundException

Yoon Uk·2023년 5월 13일
1

Spring

목록 보기
2/5
post-thumbnail
post-custom-banner

1. EntityNotFoundException 사용 예시

Spring 에서 데이터베이스에 있는 데이터를 조회하는 경우 해당 데이터가 없을 때 발생킬 예외 중 하나를 소개하겠습니다.
(전에는 NoSuchElementExeption만 사용했다.)

위의 경우에서 예외를 처리하는 권장 방법 중 하나는 커스텀 예외를 발생시키는 것입니다.

2. 예외 발생 방법

Spring.io에 따르면, 이러한 경우에 대한 권장 커스텀 예외는 EntityNotFoundException입니다.
이 예외는 일반적으로 데이터베이스에서 리소스를 찾을 수 없을 때 사용됩니다.
이 예외는 javax.persistence 패키지의 일부이며 쿼리에서 결과가 없을 때 리포지토리 레이어에서 발생시킬 수 있습니다.

Spring Data JPA는 이미 이 예외를 제공하므로 추가 설정없이 사용할 수 있습니다.

public ArticleResponseDto getArticle(Long articleId) {
    Optional<Article> article = articleRepository.findById(articleId);

    if(article.isEmpty()) {
        throw new EntityNotFoundException(String.format("Article Id '%d'가 존재하지 않습니다.", articleId));
    }

    return ArticleMapper.articleToDto(article.get());
}

이러한 예외를 처리하는 또 다른 방법은 RuntimeException과 같은 더 일반적인 예외를 발생시키는 것입니다. 그러나 이 방법은 오류에 대한 구체적인 정보를 제공하지 않으므로 디버깅하기 어려울 수 있습니다.

위와 같은 예외를 발생시킬 때, 발생한 오류에 대해 명확한 메시지를 제공하는 것이 중요합니다.

예를 들어 메시지는 "ID가 1234인 게시글이 존재하지 않습니다"와 같이 오류를 설명할 수 있습니다. 이 메시지는 예외 생성자에 포함될 수 있습니다.

3. 예외 catch

예외를 catch하고 처리하기 위해 컨트롤러 레이어에서 try-catch 블록을 사용하는 것이 중요합니다. 예외가 catch되면 적절한 HTTP 상태 코드, 예를 들어 404 Not Found와 함께 오류 응답을 클라이언트에 반환할 수 있습니다. 오류 응답은 또한 발생한 오류를 설명하는 메시지를 포함할 수 있습니다.

@GetMapping(value = "/{articleId}")
public ResponseEntity<ArticleResponseDto> getArticleById(@PathVariable long articleId) {
    ArticleResponseDto result;
    try {
        result = articleService.getArticle(articleId);
    } catch (EntityNotFoundException e) {
        log.error(e.getMessage());
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    return new ResponseEntity<>(result, HttpStatus.OK);
}

4. 기타 방법

이 예외를 처리하는 또 다른 방법은 Spring의 ResponseEntityExceptionHandler를 사용하는 것입니다. 이 클래스는 예외를 catch하고 클라이언트에 오류 응답을 반환하는 글로벌 예외 핸들러를 제공합니다. 이 클래스를 사용하려면 상속하고 특정 예외를 처리하기 위해 메서드를 오버라이딩 해야합니다.
예를 들어, handleEntityNotFoundException 메서드를 재정의하여 오류가 발생한 것을 설명하는 메시지와 함께 404 Not Found 응답을 반환할 수 있습니다.

5. 요약

요약하면, Spring 애플리케이션에서 데이터베이스에서 게시글을 가져올 때, 게시글이 존재하지 않는 경우 EntityNotFoundException과 같은 커스텀 예외를 발생시키는 것이 권장됩니다.
이 예외는 무엇이 잘못되었는지 설명하는 명확한 메시지를 포함해야합니다.
예외는 컨트롤러 레이어에서 catch되어 오류 응답을 반환하여 처리할 수 있습니다. 또는 Spring의 ResponseEntityExceptionHandler를 사용하여 예외를 처리하고 오류 응답을 반환할 수 있습니다.

post-custom-banner

0개의 댓글