728x90
- JPQL과 Querydsl의 정의
- JPQL(Java Persistence Query Language)
- JPA에서 제공하는 메서드 호출만으로 섬세한 쿼리 작성이 어려워서 생겨났습니다.
- JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회합니다.
- Querydsl
- SQL을 java로 type-safe하게 개발 할 수 있게 해주는 프레임워크
- Querydsl -> JPQL -> SQL 와 같이 동작
- JPQL을 편하게 사용할 수 있게 도와주는 빌더의 역할
- JPQL(Java Persistence Query Language)
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@Autowired
EntityManager em;
JPAQueryFactory queryFactory;
@BeforeEach //클래스에 존재하는 모든 메소드를 실행한다고 할때, 다른 메소드가 시작하기전 실행시킴(데이터 삽입)
public void before() {
queryFactory = new JPAQueryFactory(em);
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
}
@Test
public void startJQPL() {
//member1을 찾아라(JPQL)
String sqlString =
"select m from Member m " +
"where m.username = :username";
Member findMember = em.createQuery(sqlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
@Test
public void startQuerydsl() {
//member1을 찾아라(Querydsl)
//QMember m = new QMember("m"); //별칭 직접 입력
QMember m = QMember.member; //위의 주석과 동일 QMember안에 정의되어 있습니다.(기본 인스턴스 사용)
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1")) //파라미터 바인딩 처리
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
}
- JPQL과 Querydsl의 비교
- JPQL : 문자(실행 시점 오류 → 실행 이전까지 오류 파악 힘듬), Querydsl : 코드(컴파일 시점 오류 잡음 → 매우 큰 이점)
- JPQL : 파라미터 바인딩 직접, Querydsl : 파라미터 바인딩 자동 처리(자동으로 PreparedStatement 처리를 해서 파라미터 바인딩(SQL 인젝션 문제 해결 가능 → 보안상 이점)
728x90
'JPA' 카테고리의 다른 글
Q클래스 인스턴스 사용 방법 두가지 (0) | 2022.02.14 |
---|---|
JPAQueryFactory를 필드에서 제공하자(feat. 동시성 문제는 스프링이 해결) (0) | 2022.02.14 |
쿼리 힌트란? (feat. 예제) (0) | 2022.02.14 |
JPA Auditing으로 생성시간/수정시간 자동화하기 (0) | 2022.02.14 |
JPA 로그에서 파라미터 값 보는 방법에 대한 연구 (0) | 2022.02.14 |