본문 바로가기

개발중/Java Persistence API (JPA)

JPA - 파라미터 바인딩

728x90
반응형

🟡 이름 기준 파라메터

이름 기준 파라메터는 파라메터를 이름으로 구분하는 방법이다.

이름 기준 파라메터 앞에는 : 를 붙힌다.

 

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 모두 해당 쿼리의 파싱 결과를 재사용 할 수 있어서 전체 성능이 향상 된다.

 

따라서 파라미터 바인딩 방식은 선택이 아닌 필수다.


 

728x90
반응형

'개발중 > 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