스프링/6. 스프링 DB-2

33. Querydsl

sdafdq 2023. 10. 13. 06:33

자, 이제 동적 쿼리 문제를 해결해 줄 기술 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