오봉이와 함께하는 개발 블로그
Querydsl - 순수 JPA와 Querydsl 본문
728x90
순수 JPA 리포지토리와 Querydsl
순수 JPA 리포지토리
@Repository
public class MemberJapRepository {
private final EntityManager em;
private final JPAQueryFactory queryFactory;
public MemberJapRepository(EntityManager em) {
this.em = em;
this.queryFactory = new JPAQueryFactory(em);
}
public void save(Member member) {
em.persist(member);
}
public Optional<Member> findById(Long id) {
Member findMember = em.find(Member.class, id);
return Optional.ofNullable(findMember);
}
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
public List<Member> findByUsername(String username) {
return em.createQuery("select m from Member m where m.username = :username", Member.class)
.setParameter("username", username)
.getResultList();
}
}
@SpringBootTest
@Transactional
class MemberJapRepositoryTest {
@Autowired
EntityManager em;
@Autowired
MemberJapRepository memberJapRepository;
@Test
void basicTest() {
Member member = new Member("member1", 10);
memberJapRepository.save(member);
Member findMember = memberJapRepository.findById(member.getId()).get();
assertThat(findMember).isEqualTo(member); // 같은 영속성 컨텍스트이기 때문에 객체 주소가 같다.
List<Member> result1 = memberJapRepository.findAll();
assertThat(result1).containsExactly(member);
List<Member> result2 = memberJapRepository.findByUsername("member1");
assertThat(result2).containsExactly(member);
}
}
Querydsl 사용 순수 JPA 리포지토리 - Querydsl 추가
public List<Member> findAll_Querydsl() {
return queryFactory
.selectFrom(member).fetch();
}
public List<Member> findByUsername_Querydsl(String username) {
return queryFactory
.selectFrom(member)
.where(member.username.eq(username))
.fetch();
}
@Test
void basicQuerydslTest() {
Member member = new Member("member1", 10);
memberJapRepository.save(member);
List<Member> result1 = memberJapRepository.findAll_Querydsl();
assertThat(result1).containsExactly(member);
List<Member> result2 = memberJapRepository.findByUsername_Querydsl("member1");
assertThat(result2).containsExactly(member);
}
Querydsl으로 쿼리를 짜면 많은 장점이 있는데, 일단 컴파일 할 때 오류를 잡을 수 있다는 점과 파라미터 바인딩이 자동으로 된다는 점이 있다.
JPAQueryFactory 스프링 빈 등록
다음과 같이 JPAQueryFactory
를 스프링 빈으로 등록해서 주입받아 사용해도 된다.
@SpringBootApplication
public class QuerydslApplication {
public static void main(String[] args) {
SpringApplication.run(QuerydslApplication.class, args);
}
@Bean
JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
return new JPAQueryFactory(entityManager);
}
}
@Repository
public class MemberJapRepository {
private final EntityManager em;
private final JPAQueryFactory queryFactory;
public MemberJapRepository(EntityManager em, JPAQueryFactory queryFactory) {
this.em = em;
this.queryFactory = queryFactory;
}
// ............
}
이 방법을 사용하면 @RequiredArgsConstructor
를 사용해서 생성자 코드를 편리하게 작성할 수 있다.
동시성 문제는 걱정하지 않아도 된다.
왜냐하면 여기서 스프링이 주입해주는 엔티티 매니저는 실제 동작 시점에 진짜 엔티티 매니저를 찾아주는 프록시용 가짜 엔티티 매니저이다.
이 가짜 엔티티 매니저는 실제 사용 시점에 트랜잭션 단위로 실제 엔티티 매니저(영속성 컨텍스트)를 할당해준다.
인프런 김영한 지식공유자님 강의 : 실전! Querydsl
728x90
'BE > JPA' 카테고리의 다른 글
Querydsl - 동적 쿼리와 성능 최적화 조회 Where절 파라미터 사용 (0) | 2022.09.20 |
---|---|
Querydsl - 동적 쿼리와 성능 최적화 조회 Builder 사용 (0) | 2022.09.20 |
Querydsl - SQL Function 호출하기 (0) | 2022.09.19 |
Querydsl - 수정, 삭제 벌크 연산 (0) | 2022.09.19 |
Querydsl - 동적 쿼리(Where 다중 파라미터 사용) (0) | 2022.09.18 |
Comments