JPQL vs Querydsl
JPQL
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@Autowired
EntityManager em;
@BeforeEach
public void before() {
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
}
@Test
public void startJPQL() {
// member1을 찾아라.
Member findMember = em.createQuery("select m from Member m where m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
}
- SpringBootTest : 통합 테스트를 제공하는 기본적인 스프링 부트 테스트 어노테이션
- @Transactional : 이걸 걸어놓으면 테스트가 각각 진행된 후 롤백된다.
- startJPQL : JPQL 문법 사용
Querydsl
@Test
public void startQuerydsl() {
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
- 차이점
- JPAQueryFactory 객체를 생성해주어야 한다. 생성자로 EntityManager 객체를 넘겨줘야 한다.
- QMember로 사용하려는 엔티티의 타입알리아스(typealias)를 정한다. (안 쓸수도 있음 꼭 필요한건 아님)
- queryFactory에 메서드 체이닝으로 SQL 쿼리를 짜듯이 코딩을 한다.!
QMember m = QMember.member;
- 이렇게 가능하다는 이야기!
JPQL이 좋지만 단점인 이유
@Test
public void startJPQL() {
Member findMember = em.createQuery("select m from Member m "
+ "where m.usernamedfdfd = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
- 이상한 점이 눈에 잘 안 보입니다.(안 보입니다! ㅎㅎ)
- 문자열로 된 부분이 잘못 작성되어 있어도 컴파일 시점에서 문제가 발생되지 않습니다.
- 런타임 에러 발생
- jdbc 처음 쓸 때 문자열로 작성한 것과 똑같습니다.
- prepareStatement 객체 생성해서 넣어주고, 파라미터 바인딩
Querydsl이 좋은 이유
컴파일 시점에 발견할 수 있다.!
- 파라미터 바인딩을 지원해준다.
- 자바 코드로 SQL을 작성하기 때문에 언어의 한계를 돌파하기 위한 시도? 멋있다..
JPAQueryFactory queryFactory;
@Test
public void startQuerydsl() {
queryFactory = new JPAQueryFactory(em);
QMember m = QMember.member;
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
- 이렇게 쓸 수도 있다.
- 멀티스레딩 환경에 대한 설정이 JPAQueryFactory에 다 되어 있기에 전역적으로 빼서 사용해도 된다고 한다.
'Spring관련 기술 > JPA' 카테고리의 다른 글
Querydsl - 검색 조건 쿼리 (0) | 2024.01.16 |
---|---|
Querydsl - 기본 QType 활용 (0) | 2024.01.16 |
QueryDsl 라이브러리 살펴보기 (0) | 2024.01.14 |
Query Dsl 시작하기 - 설정 (0) | 2024.01.14 |
고아객체 (0) | 2023.12.16 |