JPQL이란?
- Query를 Table이 아닌 객체(엔티티) 기준으로 작성하는 객체지향 쿼리 언어
- JPQL은 객체를 기준으로 모든 것이 움직이기 때문에, Table에 매핑되는 객체가 반드시 존재해야 함
- 검색할 때에도 Table이 아닌 객체를 대상으로 검색해야 함.
- Entity와 속성은 대소문자로 구분 (MEMBER <> member)
- 별칭(alias) 사용 필수
💣 SQL, JPQL의 문제점
- SQL, JPQL은 문자열이며 Type-Check가 불가능하다.
- 컴파일 시점에 알 수 있는 방법이 없다
- 해당 로직을 실행하기 전까지 작동 여부 확인 불가능
- 해당 쿼리 실행 시점에 오류를 발견한다.
기존 방식(JPQL, MyBatis 등)이 모두 문자열(String) 형태로 쿼리가 작성되어 컴파일 단계에서 Type-Check가 불가하였다.
이러한 리스크를 줄이기 위해 QueryDSL 사용, 이를 통해 컴파일 단계에서 Type-Check가 가능해진 것.
QueryDSL이란?
- SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
- JPA Criteria (JPQL을 자바 코드로 작성할 수 있도록 도와주는 빌더 클래스 API) 보다 편리하고 실용적이다
- 오픈소스
🌟 QueryDSL의 장점
- 자바 코드로 쿼리문을 작성하여 컴파일 시점에 오류를 발견할 수 있다
- 문자가 아닌 코드로 작성
- IDE의 도움으로 타입 체크나 오타를 발견할 수 있어 수정이 용이, 코드 자동 완성 기능 활용 가능
- 동적 쿼리 구현 가능
- 파라미터 바인딩을 자동으로 처리해주어 직접 설정할 필요가 없다
JPQL
@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();
Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");
}
값을 넣을 때 : 를 사용해야 하고, setParameter() 로 설정해야한다
QueryDSL
@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();
Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");
}
- queryFactory 로 시작한다
- from은 QMember의 객체가 와야한다
- 파라미터 바인딩도 QMember의 객체에서 변수명에서 접근해서 설정한다.
'Backend > Spring' 카테고리의 다른 글
[Spring Boot] JPA log 설정 (0) | 2023.12.30 |
---|---|
[Spring] DAO, DTO, VO, Entity 개념 정리 (2) | 2023.12.29 |
[JPA / 강의] Entity mapping(엔티티 매핑) (0) | 2023.12.27 |
[JPA / 강의] JPA 기본 동작 방식(등록, 수정) (2) | 2023.12.26 |
[JPA / 강의] JPA의 기초 (4) | 2023.12.26 |