@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 객체를 넘겨줘야 한다.
@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에 다 되어 있기에 전역적으로 빼서 사용해도 된다고 한다.