pricelees 5658f6c31f [#34] 회원 / 인증 도메인 재정의 (#43)
<!-- 제목 양식 -->
<!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) -->

## 📝 관련 이슈 및 PR

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

##  작업 내용
<!-- 어떤 작업을 했는지 알려주세요! -->
- 회원 테이블과 관리자 테이블 분리 및 관리자 계정의 예약 기능 제거
- API 인증을 모두(Public) / 회원 전용(UserOnly) / 관리자 전용(AdminOnly) / 회원 + 관리자(Authenticated) 로 세분화해서 구분
- 관리자의 경우 API 접근 권한 세분화 등 인증 로직 개선
- 전체 리팩터링이 완료되어 레거시 코드 제거

## 🧪 테스트
<!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! -->
<img width="750" alt="스크린샷 2025-09-13 19.11.44.png" src="attachments/11e1a79c-9723-4843-839d-be6158d94130">

- 추가 & 변경된 모든 API에 대한 통합 테스트 진행

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

Reviewed-on: #43
Co-authored-by: pricelees <priceelees@gmail.com>
Co-committed-by: pricelees <priceelees@gmail.com>
2025-09-13 10:13:45 +00:00

73 lines
2.1 KiB
Kotlin

package roomescape.supports
import io.kotest.core.listeners.AfterSpecListener
import io.kotest.core.listeners.AfterTestListener
import io.kotest.core.listeners.BeforeSpecListener
import io.kotest.core.spec.Spec
import io.kotest.core.test.TestCase
import io.kotest.core.test.TestResult
import io.kotest.extensions.spring.testContextManager
import jakarta.persistence.EntityManager
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Component
@Component
class TestDatabaseUtil(
val entityManager: EntityManager,
val jdbcTemplate: JdbcTemplate,
) {
val tables: List<String> by lazy {
jdbcTemplate.query("SHOW TABLES") { rs, _ ->
rs.getString(1).lowercase()
}
}
fun initializeRegion() {
this::class.java.getResource("/schema/region-data.sql")?.readText()?.let {
jdbcTemplate.execute(it)
}
}
fun clear(mode: CleanerMode) {
entityManager.clear()
jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY FALSE")
tables.forEach {
if (mode == CleanerMode.EXCEPT_REGION && it == "region") {
return@forEach
}
jdbcTemplate.execute("TRUNCATE TABLE $it RESTART IDENTITY")
}
jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY TRUE")
}
}
enum class CleanerMode {
EXCEPT_REGION,
ALL
}
class DatabaseCleanerExtension: BeforeSpecListener, AfterTestListener, AfterSpecListener {
override suspend fun beforeSpec(spec: Spec) {
super.beforeSpec(spec)
getCleaner().initializeRegion()
}
override suspend fun afterTest(testCase: TestCase, result: TestResult) {
super.afterTest(testCase, result)
getCleaner().clear(CleanerMode.EXCEPT_REGION)
}
override suspend fun afterSpec(spec: Spec) {
super.afterSpec(spec)
getCleaner().clear(CleanerMode.ALL)
}
private suspend fun getCleaner(): TestDatabaseUtil {
return testContextManager().testContext
.applicationContext
.getBean(TestDatabaseUtil::class.java)
}
}