Dev/Spring

Spring Boot (Paging, 쿼리메서드와 @Query, 기존의 Repository와 Querydsl 연동하기)

Walker_ 2024. 5. 10. 11:01

1. Paging

@Test
public void testPaging() {
    Pageable pageable = PageRequest.of(0,10, Sort.by("bno").descending());
    Page<Board> result = boardRepository.findAll(pageable);
}

 - paging Test 코드를 작성

@Test
public void testPaging() {
    Pageable pageable = PageRequest.of(0, 10,
            Sort.by("bno").descending());
    Page<Board> result = boardRepository.findAll(pageable);

    log.info("total count: " + result.getTotalElements());
    log.info("total page: " + result.getTotalPages());
    log.info("page number: " + result.getNumber());
    log.info("page size: " + result.getSize());
    // prev next
    log.info(result.hasPrevious() + ": " + result.hasNext());

    List<Board> boardList = result.getContent();

    boardList.forEach(board -> log.info(board));
}

 - 추가적으로 코드 추가

 - 실행해서 로그로 정상 작동 확인

 

2. 쿼리메서드와 @Query

 - 쿼리 메서드 : 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능

 - @Query : SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능. JPQL.

 - Querydsl 등의 동적 쿼리 기능

 

// querydsl 추가
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

 - dependencies에 위 코드 추가

//querydsl 추가 시작 (선택 추가)

// === ⭐ QueryDsl 빌드 옵션 (선택) ===
def querydslDir = "$buildDir/generated/querydsl"

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

tasks.withType(JavaCompile) {
    options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir)
}

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

 - build.gradle 최하단에 위 코드 작성

 - 코끼리 눌러서 이상 없는 지 확인

 - 우측 Gradle 탭에서 compilejava 파일 찾기

 

 - 우클릭 > Run

 - Run 하면, 좌측 디렉토리 build 폴더 > domain 폴더에 > QBoard 파일 생성된 것 확인

 

3. 기존의 Repository와 Querydsl 연동하기

 - Querydsl을 이용할 인터페이스 선언

 - "인터페이스 + Imp"이라는 이름으로 클래스를 선언 - 이때 QuerydslRepositorySupport라는 부모 클래스를 지정하고 인터페이스를 구현

 - 기존의 Repository에는 부모 인터페이스로 Querydsl을 위한 인터페이스 지정

 

 - repository 패키지에 serach 폴더 생성 > BoardSearch 인터페이스 파일 생성

 

 - BoardSerachImpl 파일도 추가 생성

package com.example.spring_boot_project.repository.search;

import com.example.spring_boot_project.domain.Board;
import com.example.spring_boot_project.domain.QBoard;
import com.querydsl.jpa.JPQLQuery;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;

import java.util.List;

public class BoardSearchImpl extends QuerydslRepositorySupport implements BoardSearch {
    public BoardSearchImpl() {
        super(Board.class);
    }

    @Override
    public Page<Board> search1(Pageable pageable) {
        QBoard board = QBoard.board;
        JPQLQuery<Board> query = from(board);
        query.where(board.title.contains("1")); // where title like
        List<Board> list = query.fetch();
        long count = query.fetchCount();
        return null;
    }
}

 - BoardSearchImpl에 위 코드 작성

 

package com.example.spring_boot_project.repository;

import com.example.spring_boot_project.domain.Board;
import com.example.spring_boot_project.repository.search.BoardSearch;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long>, BoardSearch {

}

 - 기존에 있던 BoardRepository에 코드 추가

 


공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)