From a4e94bbcd621ad5d1f3eb513e002632217a08d79 Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Wed, 24 Jan 2024 15:13:07 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat:=20Banner=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/petqua/domain/banner/Banner.kt | 16 ++++++++++++++++ .../com/petqua/domain/banner/BannerRepository.kt | 6 ++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/kotlin/com/petqua/domain/banner/Banner.kt create mode 100644 src/main/kotlin/com/petqua/domain/banner/BannerRepository.kt diff --git a/src/main/kotlin/com/petqua/domain/banner/Banner.kt b/src/main/kotlin/com/petqua/domain/banner/Banner.kt new file mode 100644 index 00000000..d8ba690f --- /dev/null +++ b/src/main/kotlin/com/petqua/domain/banner/Banner.kt @@ -0,0 +1,16 @@ +package com.petqua.domain.banner + +import com.petqua.common.domain.BaseEntity +import jakarta.persistence.* + +@Entity +class Banner( + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + val id: Long = 0L, + + @Column(nullable = false) + val imageUrl: String, + + @Column(nullable = false) + val linkUrl: String, +) : BaseEntity() diff --git a/src/main/kotlin/com/petqua/domain/banner/BannerRepository.kt b/src/main/kotlin/com/petqua/domain/banner/BannerRepository.kt new file mode 100644 index 00000000..2488bcc2 --- /dev/null +++ b/src/main/kotlin/com/petqua/domain/banner/BannerRepository.kt @@ -0,0 +1,6 @@ +package com.petqua.domain.banner + +import org.springframework.data.jpa.repository.JpaRepository + +interface BannerRepository: JpaRepository { +} From d9997e4697ebe9a3947a3116c2a0b442b760a95d Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Wed, 24 Jan 2024 15:25:36 +0900 Subject: [PATCH 02/14] =?UTF-8?q?chore:=20Spring=20Cache=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + .../petqua/common/cofig/CacheConfiguration.kt | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/kotlin/com/petqua/common/cofig/CacheConfiguration.kt diff --git a/build.gradle.kts b/build.gradle.kts index 4a26d57e..8a9b5db7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { implementation("com.linecorp.kotlin-jdsl:jpql-dsl:3.3.0") implementation("com.linecorp.kotlin-jdsl:jpql-render:3.3.0") + implementation("org.springframework.boot:spring-boot-starter-cache") runtimeOnly("com.mysql:mysql-connector-j") runtimeOnly("com.h2database:h2") testImplementation("org.springframework.boot:spring-boot-starter-test") diff --git a/src/main/kotlin/com/petqua/common/cofig/CacheConfiguration.kt b/src/main/kotlin/com/petqua/common/cofig/CacheConfiguration.kt new file mode 100644 index 00000000..ae1bb709 --- /dev/null +++ b/src/main/kotlin/com/petqua/common/cofig/CacheConfiguration.kt @@ -0,0 +1,20 @@ +package com.petqua.common.cofig + +import org.springframework.cache.CacheManager +import org.springframework.cache.annotation.EnableCaching +import org.springframework.cache.concurrent.ConcurrentMapCacheManager +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + + +@EnableCaching +@Configuration +class CacheConfiguration { + + @Bean + fun cacheManager(): CacheManager { + val cacheManager = ConcurrentMapCacheManager() + cacheManager.setCacheNames(listOf("banners")) + return cacheManager + } +} From 78df0f37f7d944a842d79acade9c7fcf56cf2b85 Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Wed, 24 Jan 2024 17:15:03 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20Banner=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 + .../petqua/application/banner/BannerDtos.kt | 24 ++++++++++ .../application/banner/BannerService.kt | 20 ++++++++ .../application/banner/BannerServiceTest.kt | 47 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 src/main/kotlin/com/petqua/application/banner/BannerDtos.kt create mode 100644 src/main/kotlin/com/petqua/application/banner/BannerService.kt create mode 100644 src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt diff --git a/build.gradle.kts b/build.gradle.kts index 8a9b5db7..5a7d6d0d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,8 +30,10 @@ dependencies { implementation("com.linecorp.kotlin-jdsl:jpql-render:3.3.0") implementation("org.springframework.boot:spring-boot-starter-cache") + runtimeOnly("com.mysql:mysql-connector-j") runtimeOnly("com.h2database:h2") + testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("io.kotest:kotest-runner-junit5:5.4.2") testImplementation("io.kotest:kotest-assertions-core:5.4.2") diff --git a/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt b/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt new file mode 100644 index 00000000..b542b5b8 --- /dev/null +++ b/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt @@ -0,0 +1,24 @@ +package com.petqua.application.banner + +import com.petqua.domain.banner.Banner +import java.time.LocalDateTime + +data class FindBannerResult( + val id: Long, + val imageUrl: String, + val linkUrl: String, + val createAt: LocalDateTime, + val updateAt: LocalDateTime, +) { + companion object { + fun from(banner: Banner): FindBannerResult { + return FindBannerResult( + id = banner.id, + imageUrl = banner.imageUrl, + linkUrl = banner.linkUrl, + createAt = banner.createdAt, + updateAt = banner.updatedAt, + ) + } + } +} diff --git a/src/main/kotlin/com/petqua/application/banner/BannerService.kt b/src/main/kotlin/com/petqua/application/banner/BannerService.kt new file mode 100644 index 00000000..5e5cf56e --- /dev/null +++ b/src/main/kotlin/com/petqua/application/banner/BannerService.kt @@ -0,0 +1,20 @@ +package com.petqua.application.banner + +import com.petqua.domain.banner.BannerRepository +import org.springframework.cache.annotation.Cacheable +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Transactional +@Service +class BannerService( + private val bannerRepository: BannerRepository, +) { + + @Cacheable("banners") + @Transactional(readOnly = true) + fun getBannerList(): List { + val banners = bannerRepository.findAll() + return banners.map { FindBannerResult.from(it) } + } +} diff --git a/src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt b/src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt new file mode 100644 index 00000000..bb1bcbad --- /dev/null +++ b/src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt @@ -0,0 +1,47 @@ +package com.petqua.application.banner + +import com.petqua.domain.banner.Banner +import com.petqua.domain.banner.BannerRepository +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import org.mockito.Mockito.atMost +import org.mockito.Mockito.verify +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE +import org.springframework.boot.test.mock.mockito.SpyBean +import org.springframework.test.context.TestConstructor +import org.springframework.test.context.TestConstructor.AutowireMode.ALL + +@TestConstructor(autowireMode = ALL) +@SpringBootTest(webEnvironment = NONE) +class BannerServiceTest( + private var bannerService: BannerService, + @SpyBean private var bannerRepository: BannerRepository, +) : BehaviorSpec({ + + Given("Banner 조회 테스트") { + bannerRepository.saveAll( + listOf( + Banner(imageUrl = "imageUrlA", linkUrl = "linkUrlA"), + Banner(imageUrl = "imageUrlB", linkUrl = "linkUrlB"), + Banner(imageUrl = "imageUrlC", linkUrl = "linkUrlC"), + ) + ) + + When("Banner를 전체 조회 하면") { + val results = bannerService.getBannerList() + + Then("모든 Banner가 조회 된다") { + results.size shouldBe 3 + } + } + + When("Banner가 캐싱 되어 있으면") { + repeat(5) { bannerService.getBannerList() } + + Then("퀴리가 발생 하지 않는다") { + verify(bannerRepository, atMost(1)).findAll() + } + } + } +}) From e4116e028bdbd8a937c88441813fcc4b6f812ddf Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Wed, 24 Jan 2024 17:40:45 +0900 Subject: [PATCH 04/14] =?UTF-8?q?feat:=20Banner=20=EC=A1=B0=ED=9A=8C=20API?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/banner/BannerController.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/kotlin/com/petqua/presentation/banner/BannerController.kt diff --git a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt new file mode 100644 index 00000000..7f027579 --- /dev/null +++ b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt @@ -0,0 +1,21 @@ +package com.petqua.presentation.banner + +import com.petqua.application.banner.BannerService +import com.petqua.application.banner.FindBannerResult +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/banner") +@RestController +class BannerController( + private val bannerService: BannerService +) { + + @GetMapping + fun getBanners(): ResponseEntity> { + val bannerList = bannerService.getBannerList() + return ResponseEntity.ok(bannerList) + } +} From 417bf039d10cbd589786513bc38a582c2ca7250c Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 14:09:28 +0900 Subject: [PATCH 05/14] =?UTF-8?q?test:=20Banner=20Api=20test=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../banner/BannerControllerTest.kt | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt diff --git a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt new file mode 100644 index 00000000..6a9f8dff --- /dev/null +++ b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt @@ -0,0 +1,58 @@ +package com.petqua.presentation.banner + +import com.petqua.application.banner.FindBannerResult +import com.petqua.domain.banner.Banner +import com.petqua.domain.banner.BannerRepository +import com.petqua.test.DataCleaner +import io.kotest.core.spec.style.BehaviorSpec +import io.restassured.RestAssured +import io.restassured.module.kotlin.extensions.Extract +import io.restassured.module.kotlin.extensions.Given +import io.restassured.module.kotlin.extensions.Then +import io.restassured.module.kotlin.extensions.When +import org.assertj.core.api.Assertions.assertThat +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT +import org.springframework.boot.test.web.server.LocalServerPort +import org.springframework.http.HttpStatus + +@SpringBootTest(webEnvironment = RANDOM_PORT) +class BannerControllerTest( + @LocalServerPort private val port: Int, + private val bannerRepository: BannerRepository, + private val dataCleaner: DataCleaner, +) : BehaviorSpec({ + + RestAssured.port = port + + Given("배너가 등록되어 있다.") { + val banner = bannerRepository.saveAll( + listOf( + Banner(imageUrl = "imageUrlC", linkUrl = "linkUrlA"), + Banner(imageUrl = "imageUrlB", linkUrl = "linkUrlB") + ) + ) + + When("배너 목록을 조회한다.") { + val response = Given { + log().all() + } When { + get("/banner") + } Then { + log().all() + } Extract { + response() + } + + Then("배너 목록을 응답한다.") { + val findBannerResponse = response.`as`(Array::class.java) + assertThat(response.statusCode).isEqualTo(HttpStatus.OK.value()) + assertThat(findBannerResponse.size).isEqualTo(2) + } + } + } + + afterContainer { + dataCleaner.clean() + } +}) From 7c74c6bf1d098f95fe7dc5eacb2551891ba61dbb Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 14:10:56 +0900 Subject: [PATCH 06/14] =?UTF-8?q?test:=20Api=20test=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../banner/BannerControllerTest.kt | 65 ++++++++----------- .../kotlin/com/petqua/test/ApiTestConfig.kt | 24 +++++++ 2 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 src/test/kotlin/com/petqua/test/ApiTestConfig.kt diff --git a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt index 6a9f8dff..c2ebd9b4 100644 --- a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt +++ b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt @@ -3,56 +3,43 @@ package com.petqua.presentation.banner import com.petqua.application.banner.FindBannerResult import com.petqua.domain.banner.Banner import com.petqua.domain.banner.BannerRepository -import com.petqua.test.DataCleaner -import io.kotest.core.spec.style.BehaviorSpec -import io.restassured.RestAssured +import com.petqua.test.ApiTestConfig import io.restassured.module.kotlin.extensions.Extract import io.restassured.module.kotlin.extensions.Given import io.restassured.module.kotlin.extensions.Then import io.restassured.module.kotlin.extensions.When import org.assertj.core.api.Assertions.assertThat -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT -import org.springframework.boot.test.web.server.LocalServerPort import org.springframework.http.HttpStatus -@SpringBootTest(webEnvironment = RANDOM_PORT) class BannerControllerTest( - @LocalServerPort private val port: Int, - private val bannerRepository: BannerRepository, - private val dataCleaner: DataCleaner, -) : BehaviorSpec({ - - RestAssured.port = port - - Given("배너가 등록되어 있다.") { - val banner = bannerRepository.saveAll( - listOf( - Banner(imageUrl = "imageUrlC", linkUrl = "linkUrlA"), - Banner(imageUrl = "imageUrlB", linkUrl = "linkUrlB") + private val bannerRepository: BannerRepository +) : ApiTestConfig() { + init { + Given("배너가 등록되어 있다.") { + val banner = bannerRepository.saveAll( + listOf( + Banner(imageUrl = "imageUrlC", linkUrl = "linkUrlA"), + Banner(imageUrl = "imageUrlB", linkUrl = "linkUrlB") + ) ) - ) - When("배너 목록을 조회한다.") { - val response = Given { - log().all() - } When { - get("/banner") - } Then { - log().all() - } Extract { - response() - } + When("배너 목록을 조회한다.") { + val response = Given { + log().all() + } When { + get("/banner") + } Then { + log().all() + } Extract { + response() + } - Then("배너 목록을 응답한다.") { - val findBannerResponse = response.`as`(Array::class.java) - assertThat(response.statusCode).isEqualTo(HttpStatus.OK.value()) - assertThat(findBannerResponse.size).isEqualTo(2) + Then("배너 목록을 응답한다.") { + val findBannerResponse = response.`as`(Array::class.java) + assertThat(response.statusCode).isEqualTo(HttpStatus.OK.value()) + assertThat(findBannerResponse.size).isEqualTo(2) + } } } } - - afterContainer { - dataCleaner.clean() - } -}) +} diff --git a/src/test/kotlin/com/petqua/test/ApiTestConfig.kt b/src/test/kotlin/com/petqua/test/ApiTestConfig.kt new file mode 100644 index 00000000..13ca24a2 --- /dev/null +++ b/src/test/kotlin/com/petqua/test/ApiTestConfig.kt @@ -0,0 +1,24 @@ +package com.petqua.test + +import io.kotest.core.spec.style.BehaviorSpec +import io.restassured.RestAssured +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT +import org.springframework.boot.test.web.server.LocalServerPort + +@SpringBootTest(webEnvironment = RANDOM_PORT) +abstract class ApiTestConfig : BehaviorSpec() { + + @LocalServerPort + protected val port: Int = RestAssured.port + + @Autowired + private lateinit var dataCleaner: DataCleaner + + init { + afterContainer { + dataCleaner.clean() + } + } +} From 0b66947e7b3d9819de12f67eb82e35b814f32ce5 Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 14:18:47 +0900 Subject: [PATCH 07/14] =?UTF-8?q?chore:=20=EB=B0=B0=ED=8F=AC=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95=20-=20ddl-auto=20option=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20table=20=EC=83=9D=EC=84=B1=20-=20docker=20compose?= =?UTF-8?q?=EC=8B=9C=20=EC=9D=B4=EC=A0=84=20Image=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy-prod.yml | 9 ++++----- backend-submodule | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index fa32a202..04fa5fdc 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -45,9 +45,9 @@ jobs: tags: ${{ secrets.DOCKER_HUB_REPOSITORY }}:prod deployment: - runs-on: ubuntu-latest - needs: [ build-docker-image-and-push ] - steps: + runs-on: ubuntu-latest + needs: [ build-docker-image-and-push ] + steps: - name: Deploy uses: appleboy/ssh-action@master with: @@ -57,6 +57,5 @@ jobs: script: | echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin cd api/bin/ - sudo docker compose down + sudo docker compose down --rmi all sudo docker compose up -d - sudo docker image prune -af diff --git a/backend-submodule b/backend-submodule index 12a8c565..b5ec60b2 160000 --- a/backend-submodule +++ b/backend-submodule @@ -1 +1 @@ -Subproject commit 12a8c565130a65970918652f072a99e725d400df +Subproject commit b5ec60b26fa6290ba546f852da297abe0a892ad1 From bec1f0ba9eae8ce6e2b276c95f88f24b9809561e Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 14:19:26 +0900 Subject: [PATCH 08/14] =?UTF-8?q?chore:=20CI=20scope=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20-=20only=20push?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle-CI.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/gradle-CI.yml b/.github/workflows/gradle-CI.yml index c997a05f..f035724f 100644 --- a/.github/workflows/gradle-CI.yml +++ b/.github/workflows/gradle-CI.yml @@ -2,8 +2,6 @@ name: CI With Pull Request on: push: - pull_request: - types: [opened, reopened] jobs: build: From 28769f2031ed3cb16ccad1a61fcccbaea7a9b50c Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 14:44:30 +0900 Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20Api=20resource=20url=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/petqua/presentation/banner/BannerController.kt | 2 +- .../com/petqua/presentation/banner/BannerControllerTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt index 7f027579..6db49ea7 100644 --- a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt +++ b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController -@RequestMapping("/banner") +@RequestMapping("/banners") @RestController class BannerController( private val bannerService: BannerService diff --git a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt index c2ebd9b4..4668bb0f 100644 --- a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt +++ b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt @@ -27,7 +27,7 @@ class BannerControllerTest( val response = Given { log().all() } When { - get("/banner") + get("/banners") } Then { log().all() } Extract { From b938c23bfcc295a2f4bddd45d9d00953f27a1672 Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 14:46:15 +0900 Subject: [PATCH 10/14] =?UTF-8?q?style:=20method,=20dto=20naming=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/petqua/application/banner/BannerDtos.kt | 6 +++--- .../kotlin/com/petqua/application/banner/BannerService.kt | 4 ++-- .../com/petqua/presentation/banner/BannerController.kt | 6 +++--- .../com/petqua/application/banner/BannerServiceTest.kt | 7 ++----- .../com/petqua/presentation/banner/BannerControllerTest.kt | 4 ++-- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt b/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt index b542b5b8..cb1fcce2 100644 --- a/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt +++ b/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt @@ -3,7 +3,7 @@ package com.petqua.application.banner import com.petqua.domain.banner.Banner import java.time.LocalDateTime -data class FindBannerResult( +data class BannerResponse( val id: Long, val imageUrl: String, val linkUrl: String, @@ -11,8 +11,8 @@ data class FindBannerResult( val updateAt: LocalDateTime, ) { companion object { - fun from(banner: Banner): FindBannerResult { - return FindBannerResult( + fun from(banner: Banner): BannerResponse { + return BannerResponse( id = banner.id, imageUrl = banner.imageUrl, linkUrl = banner.linkUrl, diff --git a/src/main/kotlin/com/petqua/application/banner/BannerService.kt b/src/main/kotlin/com/petqua/application/banner/BannerService.kt index 5e5cf56e..5020fbb8 100644 --- a/src/main/kotlin/com/petqua/application/banner/BannerService.kt +++ b/src/main/kotlin/com/petqua/application/banner/BannerService.kt @@ -13,8 +13,8 @@ class BannerService( @Cacheable("banners") @Transactional(readOnly = true) - fun getBannerList(): List { + fun readAll(): List { val banners = bannerRepository.findAll() - return banners.map { FindBannerResult.from(it) } + return banners.map { BannerResponse.from(it) } } } diff --git a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt index 6db49ea7..67da9a6a 100644 --- a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt +++ b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt @@ -1,7 +1,7 @@ package com.petqua.presentation.banner +import com.petqua.application.banner.BannerResponse import com.petqua.application.banner.BannerService -import com.petqua.application.banner.FindBannerResult import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping @@ -14,8 +14,8 @@ class BannerController( ) { @GetMapping - fun getBanners(): ResponseEntity> { - val bannerList = bannerService.getBannerList() + fun readAll(): ResponseEntity> { + val bannerList = bannerService.readAll() return ResponseEntity.ok(bannerList) } } diff --git a/src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt b/src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt index bb1bcbad..94bcbcfe 100644 --- a/src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt +++ b/src/test/kotlin/com/petqua/application/banner/BannerServiceTest.kt @@ -9,10 +9,7 @@ import org.mockito.Mockito.verify import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE import org.springframework.boot.test.mock.mockito.SpyBean -import org.springframework.test.context.TestConstructor -import org.springframework.test.context.TestConstructor.AutowireMode.ALL -@TestConstructor(autowireMode = ALL) @SpringBootTest(webEnvironment = NONE) class BannerServiceTest( private var bannerService: BannerService, @@ -29,7 +26,7 @@ class BannerServiceTest( ) When("Banner를 전체 조회 하면") { - val results = bannerService.getBannerList() + val results = bannerService.readAll() Then("모든 Banner가 조회 된다") { results.size shouldBe 3 @@ -37,7 +34,7 @@ class BannerServiceTest( } When("Banner가 캐싱 되어 있으면") { - repeat(5) { bannerService.getBannerList() } + repeat(5) { bannerService.readAll() } Then("퀴리가 발생 하지 않는다") { verify(bannerRepository, atMost(1)).findAll() diff --git a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt index 4668bb0f..7b2e1f2b 100644 --- a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt +++ b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt @@ -1,6 +1,6 @@ package com.petqua.presentation.banner -import com.petqua.application.banner.FindBannerResult +import com.petqua.application.banner.BannerResponse import com.petqua.domain.banner.Banner import com.petqua.domain.banner.BannerRepository import com.petqua.test.ApiTestConfig @@ -35,7 +35,7 @@ class BannerControllerTest( } Then("배너 목록을 응답한다.") { - val findBannerResponse = response.`as`(Array::class.java) + val findBannerResponse = response.`as`(Array::class.java) assertThat(response.statusCode).isEqualTo(HttpStatus.OK.value()) assertThat(findBannerResponse.size).isEqualTo(2) } From 3160c34296fe4c3de2968d5aa85f3c4575e92595 Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 15:04:04 +0900 Subject: [PATCH 11/14] =?UTF-8?q?style:=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=EC=97=90=20=EC=9E=90=EB=A3=8C=ED=98=95=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/petqua/presentation/banner/BannerController.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt index 67da9a6a..9366010c 100644 --- a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt +++ b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt @@ -15,7 +15,7 @@ class BannerController( @GetMapping fun readAll(): ResponseEntity> { - val bannerList = bannerService.readAll() - return ResponseEntity.ok(bannerList) + val response = bannerService.readAll() + return ResponseEntity.ok(response) } } From c3422fc101efbd860bcd4b133e9552b642606fa6 Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 15:04:28 +0900 Subject: [PATCH 12/14] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=9D=91=EB=8B=B5=20=ED=95=84=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/petqua/application/banner/BannerService.kt | 1 + .../com/petqua/application/banner/{ => dto}/BannerDtos.kt | 7 +------ .../com/petqua/presentation/banner/BannerController.kt | 2 +- .../com/petqua/presentation/banner/BannerControllerTest.kt | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) rename src/main/kotlin/com/petqua/application/banner/{ => dto}/BannerDtos.kt (64%) diff --git a/src/main/kotlin/com/petqua/application/banner/BannerService.kt b/src/main/kotlin/com/petqua/application/banner/BannerService.kt index 5020fbb8..4a969203 100644 --- a/src/main/kotlin/com/petqua/application/banner/BannerService.kt +++ b/src/main/kotlin/com/petqua/application/banner/BannerService.kt @@ -1,5 +1,6 @@ package com.petqua.application.banner +import com.petqua.application.banner.dto.BannerResponse import com.petqua.domain.banner.BannerRepository import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Service diff --git a/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt b/src/main/kotlin/com/petqua/application/banner/dto/BannerDtos.kt similarity index 64% rename from src/main/kotlin/com/petqua/application/banner/BannerDtos.kt rename to src/main/kotlin/com/petqua/application/banner/dto/BannerDtos.kt index cb1fcce2..960d0647 100644 --- a/src/main/kotlin/com/petqua/application/banner/BannerDtos.kt +++ b/src/main/kotlin/com/petqua/application/banner/dto/BannerDtos.kt @@ -1,14 +1,11 @@ -package com.petqua.application.banner +package com.petqua.application.banner.dto import com.petqua.domain.banner.Banner -import java.time.LocalDateTime data class BannerResponse( val id: Long, val imageUrl: String, val linkUrl: String, - val createAt: LocalDateTime, - val updateAt: LocalDateTime, ) { companion object { fun from(banner: Banner): BannerResponse { @@ -16,8 +13,6 @@ data class BannerResponse( id = banner.id, imageUrl = banner.imageUrl, linkUrl = banner.linkUrl, - createAt = banner.createdAt, - updateAt = banner.updatedAt, ) } } diff --git a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt index 9366010c..c52c0cfa 100644 --- a/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt +++ b/src/main/kotlin/com/petqua/presentation/banner/BannerController.kt @@ -1,7 +1,7 @@ package com.petqua.presentation.banner -import com.petqua.application.banner.BannerResponse import com.petqua.application.banner.BannerService +import com.petqua.application.banner.dto.BannerResponse import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping diff --git a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt index 7b2e1f2b..e0e54cc3 100644 --- a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt +++ b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt @@ -1,6 +1,6 @@ package com.petqua.presentation.banner -import com.petqua.application.banner.BannerResponse +import com.petqua.application.banner.dto.BannerResponse import com.petqua.domain.banner.Banner import com.petqua.domain.banner.BannerRepository import com.petqua.test.ApiTestConfig From 9db679352e7bed821106c592a80cae23894ba3a7 Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 15:07:51 +0900 Subject: [PATCH 13/14] =?UTF-8?q?style:=20static=20import=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/petqua/domain/banner/Banner.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/petqua/domain/banner/Banner.kt b/src/main/kotlin/com/petqua/domain/banner/Banner.kt index d8ba690f..c83e6a42 100644 --- a/src/main/kotlin/com/petqua/domain/banner/Banner.kt +++ b/src/main/kotlin/com/petqua/domain/banner/Banner.kt @@ -1,7 +1,11 @@ package com.petqua.domain.banner import com.petqua.common.domain.BaseEntity -import jakarta.persistence.* +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id @Entity class Banner( From 18ffcc589214bd9a4df9bf7fbdb3f4e96b8b75dc Mon Sep 17 00:00:00 2001 From: TaeyeonRoyce Date: Fri, 26 Jan 2024 15:09:56 +0900 Subject: [PATCH 14/14] =?UTF-8?q?test:=20SoftAssertions=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../petqua/presentation/banner/BannerControllerTest.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt index e0e54cc3..7461cbf6 100644 --- a/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt +++ b/src/test/kotlin/com/petqua/presentation/banner/BannerControllerTest.kt @@ -8,7 +8,7 @@ import io.restassured.module.kotlin.extensions.Extract import io.restassured.module.kotlin.extensions.Given import io.restassured.module.kotlin.extensions.Then import io.restassured.module.kotlin.extensions.When -import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.SoftAssertions.assertSoftly import org.springframework.http.HttpStatus class BannerControllerTest( @@ -36,8 +36,11 @@ class BannerControllerTest( Then("배너 목록을 응답한다.") { val findBannerResponse = response.`as`(Array::class.java) - assertThat(response.statusCode).isEqualTo(HttpStatus.OK.value()) - assertThat(findBannerResponse.size).isEqualTo(2) + + assertSoftly { + it.assertThat(response.statusCode).isEqualTo(HttpStatus.OK.value()) + it.assertThat(findBannerResponse.size).isEqualTo(2) + } } } }