실전! Querydsl

Ch04. 실무 활용(순수 JPA와 Querydsl) - 순수 JPA 리포지토리와 Querydsl

webmaster 2022. 1. 1. 13:22
728x90

순수 JPA Repository 만들기

@Repository
//@RequiredArgsConstructor //이걸 사용해 줄수도 있다.
public class MemberJpaRepository {

    private final EntityManager em;
    //queryDSL을 사용하기 위한 주입
    //동시성 문제는 발생하지 않는다 -> entityManager에 의존하고 있기 때문에
    private final JPAQueryFactory queryFactory; 
    
    public MemberJpaRepository(EntityManager em,JPAQueryFactory jpaQueryFactory) {
        this.em = em;
        this.queryFactory = new JPAQueryFactory(em); //스프링 빈으로 등록해도 된다.
        //this.queryFactory = jpaQueryFactory;
    }

    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> findByMemberUsername(String username){
        return em.createQuery("select m from Member m where m.username = :username",Member.class)
                .setParameter("username",username)
                .getResultList();
    }

    
}

Bean 등록

  • 빈으로 등록하여 사용하여도 된다.

QueryDsl로 JPARepository 변경

findAll -> querydsl
findbyMemberUsername -> Querydsl

참고

동시성 문제는 걱정하지 않아도 된다. 왜냐하면 여기서 스프링이 주입해주는 엔티티 매니저는 실제 동작 시점에 진짜 엔티티 매니저를 찾아주는 프록시용 가짜 엔티티 매니저이다. 이 가짜 엔티티 매니저는 실제 사용 시점에 트랜잭션 단위로 실제 엔티티 매니저(영속성 콘텍스트)를 할당해준다. > 더 자세한 내용은 자바 ORM 표준 JPA 책 13.1 트랜잭션 범위의 영속성 컨텍스트를 참고하자.

728x90