Learn & Record
Spring Boot (Paging, 쿼리메서드와 @Query, 기존의 Repository와 Querydsl 연동하기) 본문
Spring Boot (Paging, 쿼리메서드와 @Query, 기존의 Repository와 Querydsl 연동하기)
Walker_ 2024. 5. 10. 11:011. 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에 코드 추가
공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.
부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.
읽어주셔서 감사합니다 :)