repository 계층에서 반환 타입은 어떤 타입으로 해야할까요?
먼저 EntityManager에서 getSingleResult를 조회했을 때 값이 없는 경우에는 NotResultException이 발생합니다.
@Test
public void findEntityNotExists(){
//given
assertThrows(NoResultException.class,
() -> em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", "asdasdasd")
.getSingleResult());
}
Spring-data-jpa에서는 NoResultException을 catch해서 null로 반환해주는 기능을 제공합니다.
@Repository
public interface MemberJpaRepository extends JpaRepository<Member, Long> {
Member findOneByNameAndEmail(String name, String email);
}
그런데 exception을 던져야하는지 null을 리턴해야하는지에 대해서는 회사마다 상황마다 필요한 방법이 다를 수 있습니다.
이러한 경우를 일관되게 처리할 수 있도록 spring-data-jpa에서는 Optional<T>로 리턴하는 방식을 제공합니다.
@Repository
public interface MemberJpaRepository extends JpaRepository<Member, Long> {
Optional<Member> findOptByNameAndEmail(String name, String email);
}
다양한 방법을 제공하니 상황에 맞게 사용하되 일관된 방법을 유지하는게 좋습니다.
지원하는 다양한 반환 타입은 아래에서 확인할 수 있습니다.
https://docs.spring.io/spring-data/jpa/docs/2.7.16/reference/html/#appendix.query.return.types
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
'DEV > Spring Data JPA' 카테고리의 다른 글
Join과 Pagination 함께 사용할 때 Count 쿼리 최적화 (0) | 2023.09.24 |
---|---|
COUNT 쿼리, Page<T> vs Slice<T> (0) | 2023.09.24 |
메서드 이름으로 데이터 조회하기 vs JPQL 직접 작성해서 데이터 조회하기 (0) | 2023.09.24 |
getOne vs findById (0) | 2023.09.24 |
findOne vs findById (0) | 2023.09.24 |