[#18] 코드 정리 및 일부 컨벤션 통일 #19

Merged
pricelees merged 24 commits from refactor/#18 into main 2025-07-22 09:05:31 +00:00
86 changed files with 23 additions and 45 deletions
Showing only changes of commit ee38a01ad6 - Show all commits

View File

@ -5,11 +5,9 @@ import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.http.converter.HttpMessageNotReadableException import org.springframework.http.converter.HttpMessageNotReadableException
import org.springframework.web.HttpRequestMethodNotSupportedException
import org.springframework.web.bind.MethodArgumentNotValidException import org.springframework.web.bind.MethodArgumentNotValidException
import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.RestControllerAdvice import org.springframework.web.bind.annotation.RestControllerAdvice
import org.springframework.web.client.ResourceAccessException
import roomescape.common.dto.response.CommonErrorResponse import roomescape.common.dto.response.CommonErrorResponse
@RestControllerAdvice @RestControllerAdvice

View File

@ -54,7 +54,6 @@ class PaymentService(
canceledAt = cancelInfo.canceledAt canceledAt = cancelInfo.canceledAt
).also { canceledPaymentRepository.save(it) } ).also { canceledPaymentRepository.save(it) }
@Transactional @Transactional
fun createCanceledPaymentByReservationId(reservationId: Long): PaymentCancelRequest { fun createCanceledPaymentByReservationId(reservationId: Long): PaymentCancelRequest {
val paymentKey: String = paymentRepository.findPaymentKeyByReservationId(reservationId) val paymentKey: String = paymentRepository.findPaymentKeyByReservationId(reservationId)

View File

@ -98,7 +98,6 @@ class ReservationService(
reservationRepository.save(it) reservationRepository.save(it)
}.toRetrieveResponse() }.toRetrieveResponse()
private fun validateMemberAlreadyReserve(themeId: Long?, timeId: Long?, date: LocalDate?, memberId: Long?) { private fun validateMemberAlreadyReserve(themeId: Long?, timeId: Long?, date: LocalDate?, memberId: Long?) {
val spec: Specification<ReservationEntity> = ReservationSearchSpecification() val spec: Specification<ReservationEntity> = ReservationSearchSpecification()
.sameMemberId(memberId) .sameMemberId(memberId)

View File

@ -49,7 +49,6 @@ class ReservationWithPaymentService(
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun isNotPaidReservation(reservationId: Long): Boolean = !paymentService.isReservationPaid(reservationId) fun isNotPaidReservation(reservationId: Long): Boolean = !paymentService.isReservationPaid(reservationId)
fun updateCanceledTime( fun updateCanceledTime(
paymentKey: String, paymentKey: String,
canceledAt: OffsetDateTime canceledAt: OffsetDateTime

View File

@ -27,7 +27,6 @@ class TimeService(
HttpStatus.BAD_REQUEST HttpStatus.BAD_REQUEST
) )
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findAll(): TimeRetrieveListResponse = timeRepository.findAll().toRetrieveListResponse() fun findAll(): TimeRetrieveListResponse = timeRepository.findAll().toRetrieveListResponse()

View File

@ -12,10 +12,10 @@ import org.springframework.web.bind.annotation.RequestParam
import roomescape.auth.web.support.Admin import roomescape.auth.web.support.Admin
import roomescape.auth.web.support.LoginRequired import roomescape.auth.web.support.LoginRequired
import roomescape.common.dto.response.CommonApiResponse import roomescape.common.dto.response.CommonApiResponse
import roomescape.reservation.web.TimeWithAvailabilityListResponse
import roomescape.reservation.web.TimeCreateRequest import roomescape.reservation.web.TimeCreateRequest
import roomescape.reservation.web.TimeCreateResponse import roomescape.reservation.web.TimeCreateResponse
import roomescape.reservation.web.TimeRetrieveListResponse import roomescape.reservation.web.TimeRetrieveListResponse
import roomescape.reservation.web.TimeWithAvailabilityListResponse
import java.time.LocalDate import java.time.LocalDate
@Tag(name = "4. 예약 시간 API", description = "예약 시간을 조회 / 추가 / 삭제할 때 사용합니다.") @Tag(name = "4. 예약 시간 API", description = "예약 시간을 조회 / 추가 / 삭제할 때 사용합니다.")

View File

@ -1,7 +1,6 @@
package roomescape.reservation.infrastructure.persistence package roomescape.reservation.infrastructure.persistence
import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonIgnore
import io.swagger.v3.oas.annotations.media.Schema
import jakarta.persistence.* import jakarta.persistence.*
import roomescape.member.infrastructure.persistence.MemberEntity import roomescape.member.infrastructure.persistence.MemberEntity
import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeEntity

View File

@ -8,8 +8,8 @@ import roomescape.auth.web.support.MemberId
import roomescape.common.dto.response.CommonApiResponse import roomescape.common.dto.response.CommonApiResponse
import roomescape.common.exception.RoomescapeException import roomescape.common.exception.RoomescapeException
import roomescape.payment.infrastructure.client.PaymentApproveRequest import roomescape.payment.infrastructure.client.PaymentApproveRequest
import roomescape.payment.infrastructure.client.TossPaymentClient
import roomescape.payment.infrastructure.client.PaymentApproveResponse import roomescape.payment.infrastructure.client.PaymentApproveResponse
import roomescape.payment.infrastructure.client.TossPaymentClient
import roomescape.payment.web.PaymentCancelRequest import roomescape.payment.web.PaymentCancelRequest
import roomescape.reservation.business.ReservationService import roomescape.reservation.business.ReservationService
import roomescape.reservation.business.ReservationWithPaymentService import roomescape.reservation.business.ReservationWithPaymentService

View File

@ -30,7 +30,6 @@ class ThemeService(
fun findAll(): ThemesResponse = themeRepository.findAll() fun findAll(): ThemesResponse = themeRepository.findAll()
.toResponse() .toResponse()
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findMostReservedThemes(count: Int): ThemesResponse { fun findMostReservedThemes(count: Int): ThemesResponse {
val today = LocalDate.now() val today = LocalDate.now()

View File

@ -46,7 +46,6 @@ fun ThemeEntity.toResponse(): ThemeResponse = ThemeResponse(
thumbnail = this.thumbnail thumbnail = this.thumbnail
) )
@Schema(name = "테마 목록 조회 응답", description = "모든 테마 목록 조회 응답시 사용됩니다.") @Schema(name = "테마 목록 조회 응답", description = "모든 테마 목록 조회 응답시 사용됩니다.")
data class ThemesResponse( data class ThemesResponse(
@field:Schema(description = "모든 테마 목록") @field:Schema(description = "모든 테마 목록")

View File

@ -17,7 +17,6 @@ import roomescape.member.infrastructure.persistence.MemberRepository
import roomescape.util.JwtFixture import roomescape.util.JwtFixture
import roomescape.util.MemberFixture import roomescape.util.MemberFixture
class AuthServiceTest : BehaviorSpec({ class AuthServiceTest : BehaviorSpec({
val memberRepository: MemberRepository = mockk() val memberRepository: MemberRepository = mockk()
val memberService: MemberService = MemberService(memberRepository) val memberService: MemberService = MemberService(memberRepository)

View File

@ -1,6 +1,5 @@
package roomescape.payment.infrastructure.client package roomescape.payment.infrastructure.client
import roomescape.payment.infrastructure.client.PaymentApproveRequest
import roomescape.payment.web.PaymentCancelRequest import roomescape.payment.web.PaymentCancelRequest
import kotlin.math.roundToLong import kotlin.math.roundToLong

View File

@ -12,8 +12,8 @@ import roomescape.reservation.web.MyReservationRetrieveResponse
import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeEntity
import roomescape.util.PaymentFixture import roomescape.util.PaymentFixture
import roomescape.util.ReservationFixture import roomescape.util.ReservationFixture
import roomescape.util.TimeFixture
import roomescape.util.ThemeFixture import roomescape.util.ThemeFixture
import roomescape.util.TimeFixture
@DataJpaTest @DataJpaTest
class ReservationRepositoryTest( class ReservationRepositoryTest(

View File

@ -10,8 +10,8 @@ import roomescape.member.infrastructure.persistence.MemberEntity
import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeEntity
import roomescape.util.MemberFixture import roomescape.util.MemberFixture
import roomescape.util.ReservationFixture import roomescape.util.ReservationFixture
import roomescape.util.TimeFixture
import roomescape.util.ThemeFixture import roomescape.util.ThemeFixture
import roomescape.util.TimeFixture
import java.time.LocalDate import java.time.LocalDate
@DataJpaTest @DataJpaTest

View File

@ -18,9 +18,9 @@ import roomescape.reservation.infrastructure.persistence.ReservationRepository
import roomescape.reservation.infrastructure.persistence.TimeEntity import roomescape.reservation.infrastructure.persistence.TimeEntity
import roomescape.reservation.infrastructure.persistence.TimeRepository import roomescape.reservation.infrastructure.persistence.TimeRepository
import roomescape.util.ReservationFixture import roomescape.util.ReservationFixture
import roomescape.util.TimeFixture
import roomescape.util.RoomescapeApiTest import roomescape.util.RoomescapeApiTest
import roomescape.util.ThemeFixture import roomescape.util.ThemeFixture
import roomescape.util.TimeFixture
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalTime import java.time.LocalTime

View File

@ -7,8 +7,8 @@ import roomescape.reservation.infrastructure.persistence.TimeEntity
import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeEntity
import roomescape.util.MemberFixture import roomescape.util.MemberFixture
import roomescape.util.ReservationFixture import roomescape.util.ReservationFixture
import roomescape.util.TimeFixture
import roomescape.util.ThemeFixture import roomescape.util.ThemeFixture
import roomescape.util.TimeFixture
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalTime import java.time.LocalTime

View File

@ -9,22 +9,15 @@ import org.hamcrest.Matchers.equalTo
import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.web.server.LocalServerPort import org.springframework.boot.test.web.server.LocalServerPort
import org.springframework.transaction.support.TransactionTemplate import org.springframework.transaction.support.TransactionTemplate
import roomescape.theme.business.ThemeService
import roomescape.theme.util.TestThemeCreateUtil import roomescape.theme.util.TestThemeCreateUtil
import roomescape.util.CleanerMode import roomescape.util.CleanerMode
import roomescape.util.DatabaseCleanerExtension import roomescape.util.DatabaseCleanerExtension
import java.time.LocalDate import java.time.LocalDate
import kotlin.random.Random import kotlin.random.Random
/**
* GET /themes/most-reserved-last-week API 테스트
* 상세 테스트는 Repository 테스트에서 진행
* 날짜 범위, 예약 수만 검증
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class MostReservedThemeAPITest( class MostReservedThemeApiTest(
@LocalServerPort val port: Int, @LocalServerPort val port: Int,
val themeService: ThemeService,
val transactionTemplate: TransactionTemplate, val transactionTemplate: TransactionTemplate,
val entityManager: EntityManager, val entityManager: EntityManager,
) : FunSpec({ ) : FunSpec({
@ -53,59 +46,55 @@ class MostReservedThemeAPITest(
} }
} }
context("가장 많이 예약된 테마를 조회할 때, ") { context("지난 주 가장 많이 예약된 테마 API") {
val endpoint = "/themes/most-reserved-last-week" val endpoint = "/themes/most-reserved-last-week"
test("갯수를 입력하지 않으면 10개를 반환한다.") {
test("count 파라미터가 없으면 10개를 반환한다") {
Given { Given {
port(port) port(port)
} When { } When {
get(endpoint) get(endpoint)
} Then { } Then {
log().all()
statusCode(200) statusCode(200)
body("data.themes.size()", equalTo(10)) body("data.themes.size()", equalTo(10))
} }
} }
test("입력된 갯수가 조회된 갯수보다 크면 조회된 갯수만큼 반환한다.") { test("조회된 테마가 count보다 적으면 조회된 만큼 반환한다") {
val count = 15 val count = 15
Given { Given {
port(port) port(port)
} When {
param("count", count) param("count", count)
get("/themes/most-reserved-last-week") } When {
get(endpoint)
} Then { } Then {
log().all()
statusCode(200) statusCode(200)
body("data.themes.size()", equalTo(10)) body("data.themes.size()", equalTo(10))
} }
} }
test("입력된 갯수가 조회된 갯수보다 작으면 입력된 갯수만큼 반환한다.") { test("조회된 테마가 count보다 많으면 count만큼 반환한다") {
val count = 5 val count = 5
Given { Given {
port(port) port(port)
} When {
param("count", count) param("count", count)
get("/themes/most-reserved-last-week") } When {
get(endpoint)
} Then { } Then {
log().all()
statusCode(200) statusCode(200)
body("data.themes.size()", equalTo(count)) body("data.themes.size()", equalTo(count))
} }
} }
test("7일 전 부터 1일 전 까지 예약된 테마를 대상으로 한다.") { test("지난 7일 동안의 예약만 집계한다") {
// 현재 저장된 데이터는 지난 7일간 예약된 테마 10개와 8일 전 예약된 테마 1개 // 8일 전에 예약된 테마는 집계에서 제외되어야 한다.
// 8일 전 예약된 테마는 제외되어야 하므로, 10개가 조회되어야 한다.
val count = 11 val count = 11
Given { Given {
port(port) port(port)
} When {
param("count", count) param("count", count)
get("/themes/most-reserved-last-week") } When {
get(endpoint)
} Then { } Then {
log().all()
statusCode(200) statusCode(200)
body("data.themes.size()", equalTo(10)) body("data.themes.size()", equalTo(10))
} }

View File

@ -4,10 +4,10 @@ import roomescape.auth.infrastructure.jwt.JwtHandler
import roomescape.auth.web.LoginRequest import roomescape.auth.web.LoginRequest
import roomescape.member.infrastructure.persistence.MemberEntity import roomescape.member.infrastructure.persistence.MemberEntity
import roomescape.member.infrastructure.persistence.Role import roomescape.member.infrastructure.persistence.Role
import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity
import roomescape.payment.infrastructure.persistence.PaymentEntity
import roomescape.payment.infrastructure.client.PaymentApproveRequest import roomescape.payment.infrastructure.client.PaymentApproveRequest
import roomescape.payment.infrastructure.client.PaymentApproveResponse import roomescape.payment.infrastructure.client.PaymentApproveResponse
import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity
import roomescape.payment.infrastructure.persistence.PaymentEntity
import roomescape.payment.web.PaymentCancelRequest import roomescape.payment.web.PaymentCancelRequest
import roomescape.payment.web.PaymentCancelResponse import roomescape.payment.web.PaymentCancelResponse
import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.infrastructure.persistence.ReservationEntity