20240207 (수) 개인 주특기 플러스 7일차

2024. 2. 7. 19:34TIL

오늘은 테스트코드를 작성하고 2시쯤에 있는 쿼리DSL 특강을 듣고서 동적쿼리에 대해서도 작성해보았다.

확실히 뭐랄까 그냥 강의 자료같은 것만 보면서 따라하는건 좀 어렵고 시연같은걸 보고 한번 따라해보면 생각보다 술술 풀렸다.

 

우선 PostControllerTest

package lsw.practice.domain.post.controller


import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import io.kotest.core.spec.style.DescribeSpec
import io.kotest.extensions.spring.SpringExtension
import io.kotest.matchers.shouldBe
import io.mockk.clearAllMocks
import io.mockk.every
import io.mockk.junit5.MockKExtension
import io.mockk.mockk
import lsw.practice.domain.post.dto.PostResponse
import lsw.practice.domain.post.service.PostService
import lsw.practice.infra.security.jwt.JwtPlugin
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import java.time.LocalDateTime

@SpringBootTest
@AutoConfigureMockMvc
@ExtendWith(MockKExtension::class)
class PostControllerTest @Autowired constructor(
    private val mockMvc: MockMvc, private val jwtPlugin: JwtPlugin,
): DescribeSpec({
    extensions(SpringExtension)

    afterContainer {
        clearAllMocks()
    }

    val postService = mockk<PostService>()

    describe("GET /posts/{id}") {
        context("존재하는 ID를 요청할 때") {
            it ("200 status code를 응답한다.") {
                val postId = 1L

                every { postService.getPost(any()) } returns PostResponse(
                    id = postId,
                    title = "test",
                    content = "test_content",
                    name = "username",
                    comments = mutableListOf()
                )

                val jwtToken = jwtPlugin.generateAccessToken(
                    subject = "1",
                    email = "test@gmail.com",
                    role = "USER"
                )
                val result = mockMvc.perform(
                    get ("/posts/$postId")
                        .header("Authorization", "Bearer $jwtToken")
                ).andReturn()

                result.response.status shouldBe 200

                val responseDto = jacksonObjectMapper().readValue(
                    result.response.contentAsString,
                    PostResponse::class.java
                )

                responseDto.id shouldBe postId
            }
        }
    }
})

이건 아직 어떤 코드가 어느역할을 하는지 자세하게 알진 못해서 좀더 공부해봐야겠다.

 

searchPostList

override fun searchPostList(title: String?, name: String?): List<Post> {
    val builder = BooleanBuilder()
    if (title != null) {
        builder.and(post.title.eq(title))
    }
    if (name != null) {
        builder.and(post.name.eq(name))
    }

    return queryFactory
        .selectFrom(post)
        .where(builder)
        .fetch()
}

 

동적쿼리부분은 생각보다 쉬웠다. BooleanBuilder 덕분인것 같다.

 


남는시간엔 JPA 심화강의를 들어보면서 지냈다.

요즘에 오히려 공부를 자율에 맡기니까 집중이 잘 안되는 느낌이다. 차라리 프로젝트 같은걸 진행하는게 나한텐는 조금더 맞는것 같기도..