[JPA] JPQL 파라미터 바인딩

  • JDBC 위치 기반 파라미터 바인딩 ,
  • 더 유연하고 명확한 이름 기반 파라미터 바인딩도 지원

이름 기준 파라미터(Named Parameters)

void findMemberByParamBinding() {
        String usernameParam = "ipeac";
        String jpql = "select m from Member m where m.name = :username";
        em.createQuery(jpql, Member.class)
          .setParameter("username", usernameParam)
          .getResultList()
          .forEach(System.out::println);
    }
  • :변수명 의 형식으로 파라미터 바인딩
  • JPQL API는 대부분 메서드 체인 방식으로 설계되어있음.

위치 기준 파라미터 (Positional Parameters)

@Test
    void findMemberByPositionalBinding() {
        String jpql = "select m from Member m where m.name = ?1";
        em.createQuery(jpql, Member.class)
          .setParameter(1, "ipeac")
          .getResultList()
          .forEach(System.out::println);
    }
  • ?위치값 의 형식으로 파라미터 바인딩
  • 위치 값은 0이 아니라 1부터 시작한다

위치 값보다 이름 기준으로 바인딩하는게 더 편함


JPQL 를 만약에 파라미터 바인딩을 하지 않는 경우

“select m from Member m where m.username = ‘” + usernameParam + “’”

  • 보안성
    • mybatis 의 경우 #{ } 를 사용시 파라미터가 ‘ ‘ 안에 바인딩되어 쿼리에 기입됩니다.
      • 이는 SQL Injection 을 방지하기 위하여 설정하는 것이다.
      • JPQL도 위와 같은 방식으로 기입하면 SQL Injection 을 당할 수 있다.
  • 성능
    • 파라미터 바인딩 방식을 사용하여
      • 파라미터의 값이 달라도 같은 쿼리로 인식하여
        • JPA 는 JPQL 은 SQL 로 파싱한 결과를 재사용
    • 재사용으로 인하여 전체 성능이 향상됨.

Uploaded by N2T

'자바 > JPA' 카테고리의 다른 글

[JPA] JPQL 소개  (0) 2023.11.09
[JPA] JPQL 의 기본 문법과 쿼리 API  (0) 2023.11.09
[JPA] 프로젝션  (0) 2023.11.09
[JPA] 페이징 API  (0) 2023.11.09
[JPA] 집합 함수  (0) 2023.11.09