[Spring Boot] JPA 페이징 처리

차해솔·2022년 1월 23일
2

스프링부트

목록 보기
3/5

JPA 페이징 처리

사용한 툴

  • spring-boot 2.6.3
  • spring-boot-starter-data-jpa
  • querydsl 1.0.10

환경세팅

build.gradle

buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}

plugins {
    id 'org.springframework.boot' version '2.6.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    implementation "com.querydsl:querydsl-apt:${queryDslVersion}"

    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

def querydslDir = "$buildDir/generated/querydsl"
querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}
sourceSets {
    main.java.srcDir querydslDir
}
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

application.yml

server:
  port: 8000

spring:

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/pagedemo?serverTimezone=Asia/Seoul
    username: root
    password: root1234
    hikari:
      maximum-pool-size: 20

  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      use-new-id-generator-mappings: false
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        default_batch_fetch_size: 1000

구조

코드

Entity

게시물 엔티티

유저 엔티티

유저와 게시물과는 1대다로 연결
유저 닉네임과 이메일은 유니크 설정

DTO

게시물리스트 DTO

생성자에서 엔티티 리스트를 DTO 리스트로 옮김
총 페이지와 총 게시물 제공

게시물리스트에 들어갈 세부 DTO

리스트에 보여줄 항목들만 넣음
제목, 조회수, 작성시간, 작성자 닉네임

Repository

게시물 repository

페이징 처리는 Pageable로 구현
fetchJoin으로 유저 정보까지 한 번에 조회
orderBy는 일단 boardId 순으로 설정
return은 Page< > 형식

Service

게시물 service

Page< > 형식으로 DB에서 꺼낸 후 DTO에 Builder로 넣음
getContent()로 List< Board > 꺼내기
getTotalElements()로 총 게시물 수 꺼내기(long)
getTotalPages()로 총 페이지 수 꺼내기(int)
ResponseEntity< >로 상태코드까지 리턴

Controller

컨트롤러

RestController로 데이터만 리턴
ResponseEntity< >로 리턴

결과 조회

board.http

.http 파일을 만들면 포스트맨처럼 api 요청 가능


아무런 값 없이 조회하면 size=20, page=0 으로 요청

size=10, page=2 로 조회



총 페이지수가 4에서 7로 늘어나는걸 보면 size 적용이 잘 된 모습
page는 0부터 시작하기에 2를 넣자 3페이지가 보임

마무리

모든 코드는 git에 있습니다.
https://github.com/stbpiza/pageDemo

김영한님의 JPA 강의를 많이 참고하였습니다.
감사합니다.

2개의 댓글

comment-user-thumbnail
2022년 1월 23일

멋져요

1개의 답글