DEV/Spring Data JPA

데이터 조회의 반환값 T vs Optional<T>

행운개발자 2023. 9. 24. 10:20
728x90

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

 

728x90