Spring Data JPA와 QueryDSL 이해
Spring Data JPA
소개
- 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결
- 개발자는 인터페이스만 작성
- 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입
사용법
어지간한 쿼리는 JPARepository<>를 상속시키면 다 구현되어 있다.
특정 조건으로 조회쿼리를 짜야할 때 인터페이스만 만들어도 알아서 SPQL을 만들어 주기도 한다.
페이징 처리도 Pageable 인터페이스를 상속받은 객체를 파라미터로 넣어주면 알아서 페이징 처리를 해준다.
Pagable page = new PageRequest(1,20,new Sort...); // 정렬도 가능 page<Member> result = memberRepository.findByName("hello",page);
@Query를 사용해서 직접 JPQL 지정
public interface MemberRepository extends JPARepository<Member, Long>{ @Query("SELECT m FROM Member m WHERE m.username = ?1") Mamber findByUsername(String username, Pageable pageable) }
QueryDSL
- SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
- JPQ 크리테리아에 비해서 편리하고 실용적임
- 오픈소스
SQL, JPQL은 Type-check 불가능, 해당 로직을 실행하기 전까지 작동 여부 확인 불가
장점
- 문자가 아닌 코드로 작성
- 컴파일 시점에 문법 오류 발견
- 코드 자동완성(IDE)
- 단순하고 쉬움: 코드 모양이 JPQL과 거의 비슷
- 동적 쿼리
예시
- 동적 쿼리
String name = "member";
int age = 9;
QMember m = QMember.member;
BooleanBuilder builder = new BooleanBuilder();
if(name != null){
builder.and(m.name.contains(name));
}
if(age != 0){
builder.and(m.age.gt(age));
}
List<Member> list = query.selectFrom(m).where(builder).fetch();
- 자바문법을 사용할 수 있어서 함수 사용( 가독성 ) + 재사용 가능
...
return query.selectFrom(coupon).where(
coupon.type.eq(typeParam),
isServiceanle()
).fetch();
private BooleanExpression isServiceable(){
return coupon.status.eq("LIVE").and(marketing.viewCount.lt(marketing.maxCount));
}
'Study > JPA' 카테고리의 다른 글
[JPA] 객체 지향 쿼리 (0) | 2022.01.13 |
---|---|
[JPA] JPA 내부 구조 (0) | 2022.01.12 |
[JPA] 양방향 매핑 (0) | 2022.01.12 |
[JPA] 연관관계 매핑 (0) | 2022.01.11 |
[JPA] JPA 필드와 컬럼 매핑 (0) | 2022.01.10 |