Red Glitter Pointer

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");
}

 

  1. queryFactory 로 시작한다
  2. fromQMember의 객체가 와야한다
  3. 파라미터 바인딩도 QMember의 객체에서 변수명에서 접근해서 설정한다.

 

 

+ Recent posts

loading