[querydsl] Q생성 및 사용 방법 및 문법

Welcome to Seoyun Dev Log·2023년 4월 21일
0

JPA

목록 보기
2/15

Querydsl Q 생성

Q는 엔티티마다 자동으로 생성해 준다.

Gradle -> tasks -> other -> compileQuerydsl 실행
하면 build -> generated -> querydsl -> 팩토리에 Q가 생성된다

Querydsl 사용

    1. JPAQueryFactory 생성합니다
      : EntityManager를 생성하여 JPAQueryFactory에 파라미터 전달
      ⭐️ 필드 레벨로 빼서 사용하는 것이 일반적
      : JPAQueryFactory를 필드로 제공하면 동시성 문제는 어떻게 될까? 동시성 문제는 JPAQueryFactory를 생성할 때 제공하는 EntityManager(em)에 달려있다. 스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션 마다 별도의 영속성 컨텍스트를 제공하기 때문에, 동시성 문제는 걱정하지 않아도 된다.
      멀티스레드 환경에서 동시성 문제없이 동작하도록 설계 되어있다
JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(em);
//필드
JPAQueryFactory jpaQueryFactory;

    @BeforeEach
    public void before(){
        jpaQueryFactory = new JPAQueryFactory(em);
    }
    1. 해당 엔티티 Q 생성
      : Q는 static으로 생성되어 있기 때문에 바로 호출하여 사용하면 된다
QMember qMember = QMember.member;

문법

JPQL & Querydsl 차이

Querydsl은 JPQL 빌더

  • JPQL: 문자(실행 시점 오류), Querydsl: 코드(컴파일 시점 오류)
  • JPQL: 파라미터 바인딩 직접, Querydsl: 파라미터 바인딩 자동 처리

where 바인딩

: querydsl은 바인딩을 직업 set으로 넣어주지 않아도 체이닝하여 자동으로 프리페어 스테이트먼트 파라미터 바인딩 형식으로 사용한다

  • JPQL
    • 컴파일 오류를 잡아낼 수 없음 (런타임 오류가 발생하기 때문에 위험하다)
@DisplayName("JPQL 쿼리 확인.")
    @Test
    void startJPQL() {
        //member1을 조회
        Member findByJPQL = em.createQuery("select m from Member m where m.username = :username", Member.class)
                .setParameter("username", "member1")
                .getSingleResult();

        assertThat(findByJPQL.getUsername()).isEqualTo("member1");
    }
  • Querydsl
    • 파라미터 바인딩으로 DB 성능 최적화
    • 컴파일 오류를 잡아낼 수 있음
    • 체이닝으로 문법을 사용하기 때문에 문법 오류를 내기 어렵다
@DisplayName("Querydsl 쿼리 확인.")
    @Test
    void StartQuerydsl() {
        JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(em);
        QMember qMember = QMember.member;

        Member resultFindMember = jpaQueryFactory
                .selectFrom(qMember)
                .from(qMember)
                .where(qMember.username.eq("member1"))
                .fetchOne();

        assertThat(resultFindMember.getUsername()).isEqualTo("member1");
    }
profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글