ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿼리 메서드 - 메서드 이름으로 자동 쿼리 생성
    JPA/스프링 데이터 JPA 2023. 8. 11. 20:50

    메서드 이름으로 쿼리 지정

     

    스프링 데이터 JPA는 메서드 이름으로 쿼리를 자동으로 입력해준다.

     

    public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
        return em.createQuery("select m from Member m where m.username = :username and m.age > :age")
                .setParameter("username", username)
                .setParameter("age", age)
                .getResultList();
    }

    스프링 데이터 JPA를 사용하지 않고 그냥 JPQL을 이용해서 쿼리를 작성했을 때이다. 스프링 데이터 JPA를 사용하면 메서드 이름만으로 쿼리를 자동으로 작성해준다.

     

    public interface MemberRepository extends JpaRepository<Member, Long> { // <> 안에는 <엔티티타입, PK 타입>
    
        List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
    }

    JpaRepository를 상속받으면 기본적인 CRUD는 바로 사용할 수 있다. find를 할 때에 어떤 기준으로 하는지 등도 메서드 이름만 잘 지정해주면 스프링 데이터 JPA가 자동으로 쿼리를 만들어준다. 관례를 잘 따라야하지만 findByUsernameAndGreaterThan 메서드를 이용해서 이름이 username이고 age보다 나이가 많은 Member를 찾아주는 쿼리를 자동으로 보내준다.

     

     

    관례는 https://spring.io/projects/spring-data-jpa#learn 로 들어가서 사용하는 버전을 찾아서 공식 문서를 확인하면 된다.

     

     

    기본적인 룰

    조회 : find...By (...에는 안써도 되고 All, First같이 조건을 걸어두고, By 뒤에는 뭘 기준으로 find할지)

    Count : count...By

    EXIST : exists...By

    삭제 : delete...By

    DISTINCT : findDistinct, findMemberDistinctBy

    LIMIT : findFirst3 (처음 3개), findFirst, findTop, finTop3 (위에서 3개)

     

     

    프로젝트를 하다보면 짧은 쿼리를 많이 작성할 일이 있는데, 이럴 때에 사용한다. 복잡한 쿼리를 작성해야하거나 잘 사용하지 않는 새로운 쿼리를 만들어야할 때에는 이러한 방법을 잘 사용하지 않는다.

     

     

     

     

     

    여러 반환타입으로 반환 가능

    List<Member> findListByUsername(String username); // 컬렉션
    
    Member findMemberByUsername(String username); // 단건
    
    Optional<Member> findOptionalByUsername(String username); // 단건(Optional>
    // find...By에서 ...에는 아무거나 사용해도 된다.

    반환 타입을 컬렉션, 단건, Optional 등으로 여러 타입을 반환할 수 있다.

     

    특이한 점은 jpa는 .getSingleResult()로 하나 반환할 때 결과가 없으면 NoResultException이 뜨는데 스프링 데이터 JPA는 findByUsername으로 하나를 찾는데 없어도 에러가 나지 않는다. -> null로 반환된다.

     

    물론 이럴 때에 2개가 반환되면 에러가 나간다.

Designed by Tistory.