작성
·
267
0
안녕하세요! 6월 방학부터 개학한 오늘까지 김영한님의 모든 강의를 들으며 많은 깨달음을 얻고 실력을 키웠습니다.
먼저, 정말 좋은 강의를 해주셔서 감사하다는 말씀을 드립니다!
제가 질문드리고 싶은건 NoResultException입니다!
JpaReopsitory<T,ID>를 상속받는 레포지토리는
Member findByUsername(String username) 를 하고
memberRepository.findByUsername("DB에 없는 username") 을 할시에 null이 들어가면서 exception이 터지지 않는데
MemberRepository.java
public Member findByUsernmae(String username) {
return em.createQuery("select m from Member m where m.username=:username", Member.class)
.setParameter("username", username)
.getSingleResult();
}
memberJpaRepository.findByUsername("DB에 없는 값")을 할시에는 Exception이 터집니다.
먼저, Repository 내에서 NoResultException이 터지고 Repository에서 나갔을때는 EmptyResultDataAccessException이 터지는거에 궁금했었는데 이건 방금 강의에서 말씀해주셔서 아! 하고 알았습니다.
하지만, JpaRepository를 상속받은 레포지토리는 같은 쿼리를 날리지만 어떤 원리로 exception이 터지지 않고 null이 들어가는지 궁금합니다!
혹시, JpaRepository인터페이스를 구현한 클래스에서 Exception을 잡은다음에 null로 뿌려주는것일까요?
감사합니다!
답변 1
1
안녕하세요. 박상호님
생각하신 내용이 맞습니다.
처음에 JPA 스펙을 정의할 때는 하나의 데이터를 조회하는 getSingleResult()가 데이터가 없는 경우 예외를 발생하도록 정의했습니다. 그런데 개발자들이 막상 개발을 해보니 데이터가 없을 때 예외가 터지는 것 보다는 null을 받는 것이 더 편리하다고 생각했지요. 그래서 스프링 데이터 JPA는 이 경우 예외를 잡아서 null로 반환하도록 해줍니다.
감사합니다.
감사합니다!!!