[작성일: 2023. 10. 06]
스프링 데이터 JPA
Spring Data JPA
Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use dat
spring.io
스프링 데이터 JPA는 JPA를 사용할 때 반복하는 코드를 자동화 해준다.
라이브러리는 이미 포함되어 있고, MemberRepository를 스프링 데이터 JPA로 변경해보자.
>> 기존 MemberRepository
@Repository
@RequiredArgsConstructor
public class MemberRepository {
private final EntityManager em;
public void save(Member member) { // 회원 가입
em.persist(member);
}
public Member findOne(Long id) { // 회원 조회
return em.find(Member.class, id);
}
public List<Member> findAll() { // 모든 회원 조회
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
public List<Member> findByName(String name) { // 회원 이름으로 조회
return em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
}
}
>> 스프링 데이터 JPA 적용 MemberRepository
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> { //타입, pk 타입
// select m from Member m where m.name = ?
List<Member> findByName(String name);
}
스프링 데이터 JPA는 JpaRepository라는 인터페이스를 제공하는데 여기서 기본적인 CRUD 기능이 모두 제공된다.
findByName처럼 일반화 하기 어려운 기능도 메서드 이름으로 정확한 JPQL 쿼리를 실행한다.
Querydsl
Querydsl - Unified Queries for Java
Unified Queries for Java. Querydsl is compact, safe and easy to learn. <!-- Querydsl Unified Queries for Java Querydsl provides a unified querying layer for multiple backends in Java. Compared to the alternatives Querydsl is more compact, safer and easier
querydsl.com
실무에서는 조건에 따라 실행되는 쿼리가 달라지는 동적 쿼리를 많이 사용한다.
복잡했던 주문 검색 코드를 Querydsl로 바꿔보자.
우선 build.gradle에 querydsl을 추가해야 한다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.2'
id 'io.spring.dependency-management' version '1.1.2'
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' // querydsl 추가
}
// 생략
dependencies {
//querydsl 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
// 생략
clean {
delete file('src/main/generated')
}


그 다음 Gradle에서 compileQuerydsl을 눌러주면 Q클래스가 생긴다.
>> Querydsl 적용 주문 검색 코드
@Repository
@RequiredArgsConstructor
public class OrderRepository {
private final EntityManager em;
// ... 코드 생략
// Querydsl 적용
public List<Order> findAll(OrderSearch orderSearch) {
JPAQueryFactory query = new JPAQueryFactory(em);
QOrder order = QOrder.order;
QMember member = QMember.member;
return query.select(order)
.from(order)
.join(order.member, member)
.where(statusEq(orderSearch.getOrderStatus()),
nameLike(orderSearch.getMemberName()))
.limit(1000)
.fetch();
}
private BooleanExpression nameLike(String memberName) {
if (!StringUtils.hasText(memberName)) {
return null;
}
return member.name.like(memberName);
}
private BooleanExpression statusEq(OrderStatus statusCond) {
if (statusCond == null) {
return null;
}
return order.status.eq(statusCond);
}
}
Querydsl은 SQL(JPQL)과 모양이 유사하면서 자바 코드로 동적 쿼리를 편하게 생성할 수 있다.
- 직관적인 문법
- 컴파일 시점에 빠른 문법 오류 발견
- 코드 자동완성
- 코드 재사용
- JPQL new 명령어보다 훨씬 깔끔한 DTO 조회 지원
- 동적 쿼리 사용
Querydsl은 JPQL을 코드로 만드는 빌더 역할을 할 뿐이며, JPQL을 잘 이해하면 금방 배울 수 있다.
🐣 출처: 인프런 김영한님 강의
이 글은 인프런의 김영한님 JPA 강의를 보고 작성한 글입니다.
강의를 들으면서 정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.