๋“ค์–ด๊ฐ€๋ฉฐ

JPQL, Querydsl, ๊ทธ๋ฆฌ๊ณ  Spring Data JPA ๋ชจ๋‘ ๋‹ค์–‘ํ•œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ์ด๋ฒˆ์— ์ด ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ์ •๋ฆฌํ•ด์„œ ๋‚˜์ค‘์— ์ ์ ˆํ•œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

JPQL ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

JPQL(Java Persistence Query Language)๋Š” JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์งˆ์˜ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” EntityManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , setFirstResult์™€ setMaxResults ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

String jpql = "SELECT m FROM Member m ORDER BY m.name";
Query query = em.createQuery(jpql);
query.setFirstResult(10);  // ์‹œ์ž‘ ์ธ๋ฑ์Šค
query.setMaxResults(20);  // ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ ์ˆ˜
List<Member> members = query.getResultList();

์ด ๋ฐฉ๋ฒ•์€ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ฟผ๋ฆฌ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Querydsl ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

Querydsl์€ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. JPAQueryFactory๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , offset๊ณผ limit ๋ฉ”์†Œ๋“œ๋กœ ํŽ˜์ด์ง•์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QueryResults<Member> results = queryFactory
    .selectFrom(member)
    .orderBy(member.name.asc())
    .offset(10)
    .limit(20)
    .fetchResults();

List<Member> members = results.getResults();
long total = results.getTotal();

Querydsl์€ ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋„ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ์˜ ๋ฒ„๊ทธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring Data JPA ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

Spring Data JPA๋Š” ๋ฉ”์†Œ๋“œ ์ด๋ฆ„๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Pageable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public interface MemberRepository extends JpaRepository<Member, Long> {
    Page<Member> findByLastName(String lastName, Pageable pageable);
}

Pageable pageable = PageRequest.of(0, 20, Sort.by("name"));
Page<Member> page = memberRepository.findByLastName("Smith", pageable);
List<Member> members = page.getContent();

Spring Data JPA๋Š” ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ์„ ํฌ๊ฒŒ ์ค„์—ฌ์ฃผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

JPQL, Querydsl, Spring Data JPA ๊ฐ๊ฐ์˜ ๋ฐฉ์‹์€ Java์—์„œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง•์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ CRUD ์ž‘์—…์—๋Š” Spring Data JPA๊ฐ€ ์ ํ•ฉํ•˜๋ฉฐ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ๋™์  ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Querydsl์ด ํƒ์›”ํ•œ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JPQL์€ ์ง์ ‘์ ์ธ ์ฟผ๋ฆฌ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๊ฐœ๋ฐœํŒ€์— ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด๋ณด์ž