김뱅쓰
2023. 8. 13. 20:09
섹션 6. 네 번째 요구사항 추가하기 - Querydsl
섹션 7. 마지막 섹션
최종 결과물
https://github.com/hagisilm/Kotlin-basic
https://www.inflearn.com/course/java-to-kotlin-2/dashboard
실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링) - 인프
Java + Spring Boot로 만들어진 웹 애플리케이션을 Kotlin + Spring Boot로 리팩토링 하고 추가 요구사항을 구현합니다. 이 과정에서 Junit5, SQL, JPA, Querydsl 을 사용할 뿐 아니라, 설계 및 구현 관점에서 다양
www.inflearn.com
user querydsl(custom,impl)
package com.group.libraryapp.domain.user
interface UserRepositoryCustom {
fun findAllWithHistories(): List<User>
}
package com.group.libraryapp.domain.user
import com.group.libraryapp.domain.user.QUser.user
import com.group.libraryapp.domain.user.loanhistory.QUserLoanHistory.userLoanHistory
import com.querydsl.jpa.impl.JPAQueryFactory
class UserRepositoryCustomImpl(
private val queryFactory: JPAQueryFactory
) : UserRepositoryCustom {
override fun findAllWithHistories(): List<User> {
return queryFactory.select(user).distinct()
.from(user)
.leftJoin(userLoanHistory).on(userLoanHistory.user.id.eq(user.id)).fetchJoin()
.fetch()
}
}
book(다른 방식)
package com.group.libraryapp.repository.book
import com.group.libraryapp.domain.book.QBook.book
import com.group.libraryapp.dto.book.response.BookStatResponse
import com.querydsl.core.QueryFactory
import com.querydsl.core.types.Projections
import com.querydsl.jpa.impl.JPAQueryFactory
import org.hibernate.criterion.Projection
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Component
@Component
class BookQuerydslRepository(
private val queryFactory: JPAQueryFactory,
) {
fun getStats(): List<BookStatResponse> {
return queryFactory.select(
Projections.constructor(
BookStatResponse::class.java,
book.type,
)
)
.from(book)
.groupBy(book.type)
.fetch()
}
}
user (querydsl)
package com.group.libraryapp.repository.user.loanhistory
import com.group.libraryapp.domain.user.loanhistory.QUserLoanHistory.userLoanHistory
import com.group.libraryapp.domain.user.loanhistory.UserLoanHistory
import com.group.libraryapp.domain.user.loanhistory.UserLoanStatus
import com.querydsl.core.QueryFactory
import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.stereotype.Component
@Component
class UserLoanHistoryQuerydslRepository(
private val queryFactory: JPAQueryFactory
) {
fun find(bookName: String, status: UserLoanStatus? = null): UserLoanHistory? {
return queryFactory.select(userLoanHistory)
.from(userLoanHistory)
.where(
userLoanHistory.bookName.eq(bookName),
status?.let { userLoanHistory.status.eq(status) }
)
.limit(1)
.fetchOne()
}
fun count(status: UserLoanStatus): Long{
return queryFactory.select(userLoanHistory.id.count())
.from(userLoanHistory)
.where(
userLoanHistory.status.eq(status)
)
.fetchOne()?: 0L
}
}