<인프런의 김영한님의 강의를 보고 정리한 내용입니다>
@Test
public void startJPQL() {
//member1을 찾아라.
String qlString =
"select m from Member m " +
"where m.username = :username";
Member findMember = em.createQuery(qlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
@Test
public void startQuerydsl() {
//member1을 찾아라.
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))//파라미터 바인딩 처리
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
일단 JPQL에서는
where m.username = :username
.setParameter("username", "member1")
파라미터 바인딩을 해줬는데,
Querydsl에서는
.where(m.username.eq("member1"))//파라미터 바인딩 처리
이렇게 짜도, 자동으로 jdbc에 있는 preparedstatement로 파라미터 바인딩을 알아서 한다.
?로 나가게 되는데 이게 중요한 부분이다 String 연산으로 보내게 되면 sql injection과 같은 공격을 받을 수 있기 때문이다.
그리고 db입장에서 성능상으로 유리하다.
또한
"where m.usernameeeeeeee = :username";
String이 때문에 이런 오타가 발생한다고 했을 때, 이 에러를 해당 메소드를 실행할 때, 발견하게 된다.
그러나 Querydsl
컴파일 시점에 오류를 잡아낼 수 있다.
[ JPA ] JPA의 save 시에 여러 케이스 알아보기 (0) | 2024.03.10 |
---|---|
[ Spring ] Swagger 의 basic path 변경 (0) | 2023.08.25 |
[ 스프링 데이터 JPA ] 네이티브 쿼리 사용하기 (0) | 2022.04.14 |
상속 관계에서 @Builder 적용 (0) | 2022.03.24 |
@AllArgsConstructor 유의사항 (0) | 2022.03.12 |