실제 repository를 만들어 보자.

@Repository
public class MemberJpaRepository {

	private final EntityManager em;
	private final JPAQueryFactory queryFactory;

	public MemberJpaRepository(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();
	}
}

test

@SpringBootTest
@Transactional
class MemberJpaRepositoryTest {

	@Autowired
	EntityManager em;

	@Autowired
	MemberJpaRepository memberJpaRepository;

	@Test
	public void basicTest() {
		Member member = new Member("member1", 10);
		memberJpaRepository.save(member);

		Member findMember = memberJpaRepository.findById(member.getId()).get();
		assertThat(findMember).isEqualTo(member);

		List<Member> members1 = memberJpaRepository.findAll();
		assertThat(members1).containsExactly(member);

		List<Member> members2 = memberJpaRepository.findByUsername("member1");
		assertThat(members2).containsExactly(member);
	}
}

repository에 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 추가

@Test
public void basicQuerydslTest() {
	Member member = new Member("member1", 10);
	memberJpaRepository.save(member);

	List<Member> members1 = memberJpaRepository.findAll_Querydsl();
	assertThat(members1).containsExactly(member);

	List<Member> members2 = memberJpaRepository.findByUsername_Querydsl("member1");
	assertThat(members2).containsExactly(member);
}

queryFactory 초기화는 취향인데 스프링 bean으로 등록할 수도 있다.

@Bean
JPAQueryFactory jpaQueryFactory(EntityManager em) {
	return new JPAQueryFactory(em);
}
@Repository
@RequiredArgsConstructor
public class MemberJpaRepository {

	private final EntityManager em;
	private final JPAQueryFactory queryFactory;

의문