18.예외처리

강재영's avatar
Aug 19, 2024
18.예외처리
 

1.터트려보기

총 5개의 데이터가 있는데 6개를 test로 넣어서 터트려보았다.
@Test public void findById_test() { //given int id = 6; //when Board board = boardRepository.findById(id); //eye System.out.println(board.getId()); System.out.println(board.getTitle()); System.out.println(board.getContent()); }
 
notion image
 
NoResultException이 터진걸 확인할 수 있다.
 
이렇게 두면 안되니 예외 핸들러를 작성하기로했다.
 

2.RuntimeException

예외상황을 명확하게 이해하고 처리하기
 
Query query = em.createNativeQuery("select * from board_tb where id = ?", Board.class); query.setParameter(1, id); try { Board board = (Board) query.getSingleResult(); return board; } catch (Exception e) { //익세션을 내가 잡은것 까지 배움 - 처리 방법은 v2에서 배우기 throw new RuntimeException("게시글 id를 찾을 수 없습니다."); } }
 
notion image
 
예외가 생기면 이걸 RuntimeException으로 상위레이어에 예외를 처리 하게 처리함
보통 상위레이어에서 한번에 처리하는게 좋다.
 

1. NoResultException의 문제

jakarta.persistence.NoResultException은 쿼리 결과가 없을 때 JPA에서 발생하는 예외입니다. 이 예외가 발생하면, 호출한 쪽에서는 그 예외를 처리하지 않으면 프로그램이 비정상 종료될 수 있습니다.
하지만 이 예외는 특정한 상황(예: DB에 해당 ID의 게시글이 존재하지 않음)에서 예상될 수 있으므로, 이를 처리하지 않으면 사용자에게 명확한 오류 메시지를 제공할 수 없고, 프로그램이 어디서 어떻게 실패했는지 파악하기 어렵습니다.

2. 예외를 커스텀 처리하는 이유

  • 명확한 에러 메시지: NoResultException은 다소 일반적이고, 사용자나 다른 개발자가 문제를 이해하기 어려울 수 있습니다. 대신 RuntimeException으로 감싸면서 "게시글 id를 찾을 수 없습니다."라는 구체적인 메시지를 제공함으로써, 문제를 쉽게 이해할 수 있습니다.
  • 코드의 가독성: 예외를 명시적으로 처리함으로써, 이 코드 블록에서 어떤 상황이 발생할 수 있는지 쉽게 이해할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성이 향상됩니다.

3. RuntimeException으로 처리하는 이유

RuntimeException으로 감싸서 예외를 던지는 이유는, 이를 호출한 상위 레이어(예: 서비스 계층, 컨트롤러 계층 등)에서 이 예외를 처리하거나, 특정한 흐름에 따라 애플리케이션을 제어할 수 있도록 하기 위함입니다.
  • 서비스 계층에서의 제어: 만약 이 예외가 발생하면, 상위 계층에서 이를 감지하고 적절한 대응(예: 사용자에게 에러 메시지 표시, 대체 처리 로직 실행 등)을 할 수 있습니다.
  • 디버깅과 로깅: 명확한 예외 메시지를 제공하면, 로그를 통해 문제 발생 위치를 쉽게 추적할 수 있습니다. 이는 디버깅을 용이하게 하고, 문제가 발생했을 때 빠르게 원인을 파악할 수 있게 합니다.
 

결론

이 예외 처리는 안정적인 애플리케이션 동작을 보장하고, 문제 발생 시 명확한 정보를 제공하며, 코드의 가독성과 유지보수성을 높이기 위해 필요합니다. 상위 계층에서는 이 예외를 처리하여 사용자에게 적절한 피드백을 제공하거나, 시스템이 적절히 대응할 수 있도록 합니다.
Share article

강재영 블로그