20240202 (금) 개인 주특기 플러스 주차 4일차

2024. 2. 2. 20:09TIL

오늘은 어제에 이어서 쿼리DSL 강의를 좀더 복습하면서

Practice 프로젝트를 1차적으로 완성시키고, 페이지 정렬기능, 제목기반 검색기능을 구현했다.

 

이 쿼리DSL도 신기하게 Impl 파일을 구현해서 실질적인 쿼리코드는 여기서 짜고 상속 받은 파일이 Repository 파일로 가서 동작을 처리하는 방식이다.

 

PostRepositoryImpl

package lsw.practice.domain.post.repository

import lsw.practice.domain.post.model.Post
import lsw.practice.domain.post.model.QPost
import lsw.practice.infra.querydsl.QueryDslSupport
import org.springframework.data.domain.Page
import org.springframework.data.domain.PageImpl
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Repository

@Repository
class PostRepositoryImpl: QueryDslSupport(), CustomPostRepository {

    private val post = QPost.post

    override fun searchPostListByTitle(title: String): List<Post> {
        return queryFactory.selectFrom(post)
            .where(post.title.containsIgnoreCase(title))
            .fetch()
    }

    override fun findByPageable(pageable: Pageable): Page<Post> {

        val totalCount = queryFactory.select(post.count()).from(post).fetchOne() ?: 0L

        val query = queryFactory.select(post)
            .offset(pageable.offset)
            .limit(pageable.pageSize.toLong())

        if (pageable.sort.isSorted) {
            when (pageable.sort.first()?.property) {
                "id" -> query.orderBy(post.id.asc())
                "title" -> query.orderBy(post.title.asc())
                "name" -> query.orderBy(post.name.asc())
                else -> query.orderBy(post.id.asc())
            }
        } else {
            query.orderBy(post.id.asc())
        }

        val contents = query.fetch()

        return PageImpl(contents, pageable, totalCount)
    }
}

 

위 부분이 Impl 파일

 

PostRepository

interface PostRepository: JpaRepository<Post, Long>, CustomPostRepository{ //요기에 추가해줌
}

 

CustomPostRepository

interface CustomPostRepository {
    fun searchPostListByTitle(title: String): List<Post>

    fun findByPageable(pageable: Pageable): Page<Post>
}

위 파일은 기존 PostRepository를 쓰듯이 메소드이름만 간단하게 적어놓으면 된다.

 

이후에는 일단 오늘분량만큼의 코드개선과제는 진행했기에 swagger에서 테스트좀 해주고 남는시간엔 인증/인가부분을 추가적으로 복습하면서 시간을 보냈다.


이번에 개인과제를 진행하면서 상당히 시간을 많이 주는데 이시간에 알차게 써야지 다음 프로젝트에서 막힘없이 진행할 수 있을것 같다.