pricelees 5fe1427fc1 [#30] 코드 구조 개선 (#31)
<!-- 제목 양식 -->
<!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) -->

## 📝 관련 이슈 및 PR

**PR과 관련된 이슈 번호**
- #30

##  작업 내용
<!-- 어떤 작업을 했는지 알려주세요! -->
- ReservationService를 읽기(Find) / 쓰기(Write) 서비스로 분리
- 모든 도메인에 repository를 사용하는 Finder, Writer, Validator 도입 -> ReservationService에 있는 조회, 검증, 쓰기 작업을 별도의 클래스로 분리하기 위함이었고, 이 과정에서 다른 도메인에도 도입함.

## 🧪 테스트
<!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! -->
새로 추가된 기능 & 클래스는 모두 테스트 추가하였고, 작업 후 전체 테스트 완료

## 📚 참고 자료 및 기타
<!-- 참고한 자료, 또는 논의할 사항이 있다면 알려주세요! -->

Reviewed-on: #31
Co-authored-by: pricelees <priceelees@gmail.com>
Co-committed-by: pricelees <priceelees@gmail.com>
2025-08-06 10:16:08 +00:00

58 lines
2.1 KiB
Kotlin

package roomescape.theme.util
import jakarta.persistence.EntityManager
import org.springframework.transaction.support.TransactionTemplate
import roomescape.member.infrastructure.persistence.MemberEntity
import roomescape.reservation.infrastructure.persistence.ReservationStatus
import roomescape.theme.infrastructure.persistence.ThemeEntity
import roomescape.time.infrastructure.persistence.TimeEntity
import roomescape.util.MemberFixture
import roomescape.util.ReservationFixture
import roomescape.util.ThemeFixture
import roomescape.util.TimeFixture
import java.time.LocalDate
import java.time.LocalTime
class TestThemeDataHelper(
val entityManager: EntityManager,
val transactionTemplate: TransactionTemplate?
) {
/**
* GET /themes/most-reserved-last-week API와 관련 Repository 테스트에 사용
* @param name: 테마 이름
* @param reservedCount: 이 테마가 예약된 횟수
* @param date: reservedCount 개의 예약을 만들 때 사용할 날짜
*/
fun createThemeWithReservations(name: String, reservedCount: Int, date: LocalDate): ThemeEntity =
if (transactionTemplate == null) {
createAndGet(name, reservedCount, date)
} else {
transactionTemplate.execute { createAndGet(name, reservedCount, date) }!!
}
fun createAndGet(name: String, reservedCount: Int, date: LocalDate): ThemeEntity {
val themeEntity: ThemeEntity = ThemeFixture.create(name = name).also { entityManager.persist(it) }
val member: MemberEntity = MemberFixture.create().also { entityManager.persist(it) }
for (i in 1..reservedCount) {
val time: TimeEntity = TimeFixture.create(
startAt = LocalTime.now().plusMinutes(i.toLong())
).also { entityManager.persist(it) }
ReservationFixture.create(
date = date,
theme = themeEntity,
member = member,
time = time,
status = ReservationStatus.entries.random()
).also { entityManager.persist(it) }
}
entityManager.flush()
entityManager.clear()
return themeEntity
}
}