- 파라미터 바인딩에는 위치기반 바인딩과 이름 기반 바인딩이 있다

코드 가독성과 유지보수를 위해 이름 기반 파라미터 바인딩을 사용하자. 위치기반은 실수로 위치가 바뀔 경우 큰 문제가 발생할 수 있다. 

import org.springframework.data.repository.query.Param
    
public interface MemberRepository extends JpaRepository<Member, Long> {
    @Query("select m from Member m where m.username = :name")
    Member findMembers(@Param("name") String username);
    
}

-컬렉션 파라미터 바인딩

Collection타입으로 in 절을 지원한다 

@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);

 

-반환 타입

스프링 데이터 JPA는 유연한 반환 타입을 지원한다 

List<Member> findByUsername(String name); //컬렉션 
Member findByUsername(String name); //단건 
Optional<Member> findByUsername(String name); //단건 Optional

 

List는 찾으려는 객체가 없더라도 빈 객체를 반환하므로 컬렉션은 어떤 상황에서 사용해도 괜찮다 

만약 데이터를 조회했는데 데이터가 있을 수도 없을 수도 있을 Optional 사용하면 된다 

 

참고: 단건으로 지정한 메서드를 호출하면 jpql의 Query.getSingleResult() 메서드를 호출하는데, 이때 결과가 없으면 

javax.persistance.NoResultException 예외가 발생하는데, 이는 개발자 입장에서 다루기가 상당히 불편하다

스프링 데이터 JPA는 단건을 조회할 때 위 예외가 발생해도 예외를 무시하고 대신 null을 반환한다 

 

 

+ Recent posts