- spring-boot 2.6.3
- spring-boot-starter-data-jpa
- querydsl 1.0.10
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
}
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
게시물 엔티티
유저 엔티티
유저와 게시물과는 1대다로 연결
유저 닉네임과 이메일은 유니크 설정
게시물리스트 DTO
생성자에서 엔티티 리스트를 DTO 리스트로 옮김
총 페이지와 총 게시물 제공
게시물리스트에 들어갈 세부 DTO
리스트에 보여줄 항목들만 넣음
제목, 조회수, 작성시간, 작성자 닉네임
게시물 repository
페이징 처리는 Pageable로 구현
fetchJoin으로 유저 정보까지 한 번에 조회
orderBy는 일단 boardId 순으로 설정
return은 Page< > 형식
게시물 service
Page< > 형식으로 DB에서 꺼낸 후 DTO에 Builder로 넣음
getContent()로 List< Board > 꺼내기
getTotalElements()로 총 게시물 수 꺼내기(long)
getTotalPages()로 총 페이지 수 꺼내기(int)
ResponseEntity< >로 상태코드까지 리턴
컨트롤러
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 강의를 많이 참고하였습니다.
감사합니다.
멋져요