티스토리 뷰
해당 글은 김영한님의 실전! Querydsl - 인프런 | 강의를 수강하고 정리한 게시글입니다.
Querydsl - 기본 지식
JPQL과 Querydsl의 차이
시작전 JPQL과 Querydsl의 차이점이 뭔지 예제로 알아보자.(시작전 세팅은 제외)
[JPQL로 작성한 “member1”을 찾는 예제]
@Test
public void startJPQL() {
// member1 find.
String qlString = "select m from Member m " + // 만약 여기서 m옆에 공백이 빠진다면..?
"where m.username = :username";
Member findMember = em.createQuery(qlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
[Querydsl로 작성한 “member1”을 찾는 예제]
@Test
public void startQuerydsl() {
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1")) // 파라미터 바인딩 처리
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
위의 예제에서 볼 수 있듯이 ‘JPQL’로 작성한 문법은 String으로 작성되기 때문에 컴파일 시점에 오류를 찾을 수 없고 런타임이 되서야 오류를 찾을 수 있다.
반면 ‘Querydsl’로 작성된 문법은 자바 문법을 사용하기 때문에 컴파일 타임에도 오류를 잡을 수 있다는 장점이 있다.
참고 :
EntityManager 로 JPAQueryFactory 생성
Querydsl은 JPQL 빌더(Querydsl도 결국 JPQL로 변환되서 실행된다..)
JPQL: 문자(실행 시점 오류), Querydsl : 코드 (컴파일 시점 오류)
JPQL : 파라미터 바인딩 직접, Querydsl : 파라미터 바인딩 자동 처리
JPAQueryFactory를 필드로
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@Autowired
EntityManager em;
JPAQueryFactory queryFactory;
@BeforeEach
public void before() {
queryFactory = new JPAQueryFactory(em);
}
}
- 테스트를 만들어 기본 문법을 알아볼텐데 테스트에 앞서 EntityManager처럼 JPAQueryFactory도 필드로 제공하면 동시성 문제는 어떻게 될까?
- 동시성 문제는 JPAQueryFactory를 생성할 때 제공하는 EntityManager에 달려있다. 스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션 마다 별도의 영속성 컨텍스트를 제공하기 때문에, 동시성 문제는 걱정하지 않아도 된다.
기본 Q-Type 활용
- Querydsl을 사용하기위해 설정을 마치면 기존에 만들어진 Entity에 Q-Type 클래스가 만들어지는데 여기서 Q클래스 인스턴스를 사용하는 2가지 방법은 다음과 같다.
QMember qMember = new QMember("m"); //별칭 직접 지정
QMember qMember = QMember.member; //기본 인스턴스 사용
여기서 첫번째 방식은 별칭을 직접 지정해서 사용하는 방식이고 사용되는 별칭은 별의미가 없고 만약 Subquery를 사용하여 2개의 Q클래스가 사용될 때는 별칭을 다르게 지정해줘야한다.
두번째 방식은 Q클래스 내의 static final로 선언된 기본 인스턴스를 사용하는 방식이다.
이또한 Q클래스 내에 첫번째 방식으로 선언해논것과 같다.
import static study.querydsl.entity.QMember.*;
이렇게 기본 인스턴스(2번째 방식)를 static import해서 사용하면 굳이 타이핑을 할 필요가 없다..
필요한 사전 지식
SQL 문법에 대한 어느정도 지식은 알고 들어가는게 좋다.
특히 강의에서 언급한 부분은 블로그에 정리해 두었으니 참고( [SQL] 01. having과 where , [SQL] 02. Join 정리 )
'Backend > JPA' 카테고리의 다른 글
[Querydsl] 03. 중급 문법 (0) | 2022.02.06 |
---|---|
[Querydsl] 02. 기본 문법 (0) | 2022.02.05 |
[JPA] 18. API 개발 - OSIV와 성능 최적화 (0) | 2022.02.03 |
[JPA] 17. API 개발 - 컬랙션 조회 최적화 (0) | 2022.02.02 |
[JPA] 16. API 개발 - 지연 로딩과 조회 성능 최적화 (0) | 2022.02.01 |