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>로 한 이유 -> 회원 등록 시 중복된 이메일 사용을 확인하기 위해서
  1. MemberService에서 MemberRepository.findByEmail(String memberEmail) 호출
  2. MemberRepository에 findByEmail 메서드에 @Param("email") -> @Query(... = :email)

동작 테스트

@Query에 이름 기반 파라미터 바인딩이 잘 작동한 것을 볼 수 있다.

 

Java8 이후부터는 자바 컴파일러에 -parameters 옵션을 설정하면 @Param을 생략해도 된다는데 개인적으로는 @Param이 있는 것이 직관적으로 보여서 따로 설정하진 않았다.