🟡 이름 기준 파라메터
이름 기준 파라메터는 파라메터를 이름으로 구분하는 방법이다.
이름 기준 파라메터 앞에는 : 를 붙힌다.
String userNameParam = "Binsoo";
TypedQuery<Member> query;
query = em.createQuery("SELECT m FROM Member m WHERE m.username = :username"), Member.class);
query.setParameter( "username ", userNameParam );
List<Member>resultList = query.getResultList();
🟡 위치 기준 파라메터
위치 기준 파라메터를 사용하려면 ? 다음에 위치 값을 주면 된다.
위치 값은 1부터 시작 된다.
String userNameParam = "Binsoo";
TypedQuery<Member> query;
query = em.createQuery("SELECT m FROM Member m WHERE m.username = :username"), Member.class);
query.setParameter( "username ", userNameParam );
List<Member>resultList = em.createQuery("SELECT m FROM Member m WHERE m.username = ?1"), Member.class)
.setParameter(1, userNameParam )
.getResultList();
위치 기반 파라메터 보다는
이름 기준 파라메터바인딩 방식을 사용하는 것이 더 명확하다.
JPQL 을 수정해서 다음 코드처럼 파라메터 바인딩 방식을 사용하지 않고
직접 문자를 더해 만들어 넣으면 악의적인 사용자에 의해 SQL 인젝션 공격을 당할 수 있다.
또한 성능 이슈도 있는데 파라메터 바인딩 방식을 사용하면 파라메터의 값이 달라도
같은 쿼리로 인식해서 JPA 는 JPQL 을 SQL 로 파싱한 결과를 재사용 할 수 있다.
그리고 DB 내부에서 실행한 SQL 을 파싱해서 사용하는데 같은 쿼리는 파싱한 결과를 재사용 할 수 있다.
결과적으로 애플리케이션과 DB 모두 해당 쿼리의 파싱 결과를 재사용 할 수 있어서 전체 성능이 향상 된다.
따라서 파라미터 바인딩 방식은 선택이 아닌 필수다.
'개발중 > Java Persistence API (JPA)' 카테고리의 다른 글
JPA - 프로젝션 (0) | 2021.07.01 |
---|---|
JPA - 결과 조회 getResultList/getSingleResult (0) | 2021.07.01 |
🟡 Criteria이란 ? (0) | 2021.07.01 |
🟡 QueryDSL이란 ? (0) | 2021.07.01 |
🟡 JPQL 이란 ? (0) | 2021.07.01 |