자, 이제 동적 쿼리 문제를 해결해 줄 기술 Querydsl이다.
만약 sql이 클래스처럼 타입이 있고 자바코드로 작성할 수 있다면?
막 내가 u만 쳐도 알아서 username이 emmet 기능으로 나오고 그런다면?
그리고 타입구분이 되어서 컴파일 오류도 발생시켜 준다면? (이런 걸 type-safe 라고 함)
Querydsl은 쿼리를 자바로 type-safe하게 개발할 수 있게 지원해주는 프레임 워크.
주로 JPQL에 사용.
sql 문법의 오류를 잡아준다..!
sql도 지원하긴 하는데, 그건 복잡해서 잘 안쓰고, 주로 JPQL에서 사용.
예를 들어, DB에서 다음과 같은 조건의 사람들을 가져오라고 할 때.
나이 : 20~40살
성 : 김씨
순서 : 나이 많은 순
3명만.
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
private String name;
private int age;
}
테이블
create table Member(
id bigint auto primary key,
age integer not null,
name varchar(255)
)
JPA에서 Query의 방법은 크게 3가지
1. 직접 쿼리(JPQL).
@Test
public void jpql(){
String query = "select m from Member m where m.age between 2- and 40 and m.name like '김%' order by m.age desc";
List<Member> resultList =
em.createQuery(query, Member.class)
.setMaxResults(3).getResultList();
}
order by 값 desc 는 값 기준으로 desc(내림차순)
setMaxResults(3) 이렇게 하면 자동으로 페이징,
limit, oracle, rownum 이런 걸 넣어준다.
장점 : SQL QUERY와 비슷해 금방 익숙해 짐.
단점 : type-safe가 아님. 동적 쿼리 생성이 어려움.
2. Criteria API
@Test
public void jpaCriteriaQuery(){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> cq = cb.createQuery(Member.class);
Root<Member> root = cq.from(Member.class);
Path<Integer> age = root.get("age");
Predicate between = cb.between(age, 20, 40);
Path<String> path = root.get("name");
Predicate like = cb.like(path, "김%");
CriteriaQuery<Member> query = cq.where(cb.and(between, like));
query.orderBy(cb.desc(age));
List<Member> resultList =
em.createQuery(query).setMaxResults(3).getResultList();
}
장점 : ..? 그래도 쿼리 작성의 자바 코드화..?
단점 : 어려움. 알아야 할 게 많음.
딱히 코드에 대한 설명을 쓰지 않는 게, 안 쓸 것이라 느껴져서.
뭐라고 해야 할지..
라이브러리가 블랙박스로 숨겨둬야 할 부분을 보여준 느낌?
이게 좀 만든 사람은 잘 사용하겠지만, 배워서 사용하는 입장에서는 좀 까다로운 그런 라이브러리 느낌임.
3. MetaModel Criteria API (type-safe)
뭐 위와 비슷하게 생겼다고 함.
복잡하다고 함.
'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글
35. Querydsl 설정 (0) | 2023.10.13 |
---|---|
34. Querydsl 등장 (0) | 2023.10.13 |
32. 스프링데이터JPA 적용 2 (0) | 2023.10.12 |
31. 스프링DataJpa 적용1 (0) | 2023.10.12 |
30. 스프링DataJPA 주요 기능 (0) | 2023.10.12 |