Repository 설계/쿼리메서드/@Query/Querydsl

예지성준·2024년 7월 24일

스프링부트

목록 보기
4/6
post-thumbnail

Repository 설계하기

  • DAO 클래스 대체

1. JpaRepository 인터페이스 : 상속

  • CrudRepository의 하위 인터페이스

2. JpaRepository에서 지원하는 메서드

  • S save(S entity) -> persist(...) 와 같음 : 영속성 상태로 추가

  • S saveAndFlush(S entity) : persist() + flush() 같이 수행

  • List<S\> saveAll(Collection<S\> ...)

  • List<S\> saveAllAndFlush(....)
    <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
    Iterable.. 반복 가능 , list/set 형태의 모든 자료가 여기 들어간다.

  • void delete(T entity) : remove(...)

  • count()

  • Iterable findAll()

  • S findOne(..)

    S findById(기본키)

    낱개 조회 할때 값이 없을때를 대비하여 반환값을 Optional로 처리한다.

    ... get...

👩‍💻참고)
find로 시작하는 메서드 : 영속 상태
get로 시작하는 메서드 : 비영속 상태 - 상태변화 감지 X

  • flush() : 상태 변화 감지 -> DB 에 반영

조회 할 시 flush 암묵적으로 발생함 ( * 수정 )
em.setFlushMode(FlushModeType.AUTO); 필요함!!! [ex08 테스트 예제 참고]


예제


10명 회원 추가

🔽

findAll -> 전체 조회

...
    @Test
    void test2(){
        List<Member> members = memberRepository.findAll();
        members.forEach(System.out::println);
    }


쿼리 메서드

  • 검색 쿼리를 메서드 패턴으로 쉽게 만들 수 있다.
  • 쿼리 메서드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나로 Repository 인터페이스에 간단한 네이밍 룰을 이용하여 메서드를 작성하면 원하는 쿼리를 실행할 수 있다.

find + (엔티티 이름) + By + 변수이름

구현체 정의 없이 메서드 패턴으로 조회

  • 쿼리 메서드로 패턴 만듦

  • 한명의 회원 조회


예제2

...
    List<Member> findByEmailContainingAndUserNameContainingOrderByCreatedAtDesc(String key1, String key2);

복잡한 조건일 경우 너무 메서드 명이 길다.
이렇게 쓰지는 않음 간단한 조건일때만 사용한다.


예제3
참고 스프링Data JDBC

PageRequest -> 구현 클래스

  • PageNumber: 0부터 시작
  • PageSize:한 페이지당 출력되는 개수
  • sort: 정렬/ 뒤에 자동으로 ORDER BY 붙음


@Query 애노테이션

JPQL(Java Persistence Query Language)

  • 엔티티 기준의 SQL, 조회 결과 영속성 상태

✅ MemberRepository 인터페이스

✅ test

  • @Query 애노테이션을 이용한 방법에도 단점이 있다. @Query 애노테이션 안에 JPQL 문법으로 문자열을 입력하기 때문에 잘못 입력하면 컴파일 시점에 에러를 발견할 수 없음

  • 이를 보완할 수 있는 방법으로 Querydsl이 있다.

쿼리 직접 입력하는 일은 지양하자!!

Querydsl (비표준)

  • 쿼리 빌더 제공
  • Querydsl은 JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API이다. Querydsl은 소스코드로 SQL문을 문자열이 아닌 코드로 작성하기 때문에 컴파일러의 도움을 받을 수 있다.

특정 메서드를 조합해서(조검식, 조회필드..) 쿼리 완성 시키는 방식

Querydsl 장점

  • 고정된 SQL문이 아닌 조건에 맞게 동적으로 쿼리를 생성할 수 있습니다.
  • 비슷한 쿼리를 재사용할 수 있으며 제약 조건 조립 및 가독성을 향상시킬 수 있습니다.
  • 문자열이 아닌 자바 소스코드로 작성하기 때문에 컴파일 시점에 오류를 발견할 수 있습니다.
  • IDE의 도움을 받아서 자동 완성 기능을 이용할 수 있기 때문에 생산성을 향상시킬 수 있습니다.
  • 의존성 설치

implementation 'com.querydsl:querydsl-jpa:5.1.0'

자동으로 코드 만들어줌
annotationProcessor 'com.querydsl:querydsl-apt:5.1.0'

패키지를 자카르타로 인식하게 하도록...

build.gradle

...
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile

sourceSets {
	main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile){
	options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

clean.doLast {
	file(querydslDir.deleteDir())
}

자동으로 만들어짐!!

조건식에 필요한 메서드가 추가된다

객체를 얘를 가지고 접근!

  • 레포지토리 정의

QueryDslPredicateExecutor를 함께 상속 -> 기존 Repository 메서드에 Predicate가 매개변수인 메서드가 추가된다.

  • Q 클래스
    조건식 메서드를 가지고 사용
    eq: =(같다)
    lt: < (작다)
    loe: <=(작거나 같다)
    gt: > (크다)
    goe: >= (크거나 같다)

매개변수에 Predicate 있음 -> 조건식/ 판별식


여러 검색 조건을 만드는 경우

  • BooleanBuilder
    • and(Predicate..)
    • or(Predicate..): or조건은 and조건에 묶어서
    • not(Predicate..)

or, not도 마찬가지..
메서드 체이닝!


  • JPAQueryFactory
  • JPAQuery
profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글