Spring
[Spring Data JPA] 파라미터 바인딩
do_hyuk
2023. 10. 19. 00:21
포트폴리오 작성을 위해 웹을 만들고 있는 도중 JPA에 회원 이메일을 통해 회원을 조회하고 싶은데 @Query문에 파라미터를 어떤 식으로 작성하는지 몰라 찾아보다 알게 되었다.
스프링 데이터 JPA는 2가지 방법으로 파라미터 바인딩을 지원한다.
- 위치기반
- 이름기반
SELECT m FROM Member m WHERE m.email = ?0 //위치 기반
SELECT m FROM Member m WHERE m.email = :email //이름 기반
스프링 데이터 JPA의 기본값으로는 위치 기반 파라미터 바인딩이다. 이름 그대로 파라미터 순서로 바인딩하는 것이다.
코드 가독성과 유지보수를 위해 위치 기반보다는 이름 기반을 사용하게 한다.
위치 기반은 순서 실수가 있을 수 있기 때문이다.
공식 문서를 보면 알 수 있다.
이름 기반 파라미터 바인딩에 대해 알아보자.
/**
* 이름 기반 파라미터 바인딩
*/
@Query("select m from Member m where m.email = :email")
List<Member> findByEmail(@Param("email") String memberEmail);
Email 중복이 안되는데 List <Member>로 한 이유 -> 회원 등록 시 중복된 이메일 사용을 확인하기 위해서
- MemberService에서 MemberRepository.findByEmail(String memberEmail) 호출
- MemberRepository에 findByEmail 메서드에 @Param("email") -> @Query(... = :email)
@Query에 이름 기반 파라미터 바인딩이 잘 작동한 것을 볼 수 있다.
Java8 이후부터는 자바 컴파일러에 -parameters 옵션을 설정하면 @Param을 생략해도 된다는데 개인적으로는 @Param이 있는 것이 직관적으로 보여서 따로 설정하진 않았다.