From 99917df6003230c58033dcf184059c3f0455cf0a Mon Sep 17 00:00:00 2001 From: pricelees Date: Thu, 2 Oct 2025 21:02:20 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A1=9C=EC=BB=AC=20=EB=B0=8F=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20mysql=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=EB=B0=8F=20=EC=95=A0=ED=94=8C=EB=A6=AC=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=A2=85=EB=A3=8C=EC=8B=9C=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20truncate=20=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/LocalDatabaseCleaner.kt | 33 +++++++++++++++++++ .../src/main/resources/application-local.yaml | 14 +++----- .../sangdol/data/DefaultDataInitializer.kt | 4 +-- .../roomescape/supports/TestDatabaseUtil.kt | 14 +++++--- ...-test-mysql.yaml => application-data.yaml} | 0 .../src/test/resources/application-test.yaml | 10 +++--- 6 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 service/src/main/kotlin/com/sangdol/roomescape/common/config/LocalDatabaseCleaner.kt rename service/src/test/resources/{application-test-mysql.yaml => application-data.yaml} (100%) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/common/config/LocalDatabaseCleaner.kt b/service/src/main/kotlin/com/sangdol/roomescape/common/config/LocalDatabaseCleaner.kt new file mode 100644 index 00000000..b3e30f88 --- /dev/null +++ b/service/src/main/kotlin/com/sangdol/roomescape/common/config/LocalDatabaseCleaner.kt @@ -0,0 +1,33 @@ +package com.sangdol.roomescape.common.config + +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import jakarta.annotation.PreDestroy +import jakarta.transaction.Transactional +import org.springframework.context.annotation.Profile +import org.springframework.jdbc.core.JdbcTemplate +import org.springframework.stereotype.Component + +private val log: KLogger = KotlinLogging.logger {} + +@Component +@Profile("local") +class LocalDatabaseCleaner( + private val jdbcTemplate: JdbcTemplate +) { + @PreDestroy + @Transactional + fun clearAll() { + log.info { "[LocalDatabaseCleaner] 데이터베이스 초기화 시작" } + jdbcTemplate.execute("SET FOREIGN_KEY_CHECKS = 0") + + jdbcTemplate.query("SHOW TABLES") { rs, _ -> + rs.getString(1).lowercase() + }.forEach { + jdbcTemplate.execute("TRUNCATE TABLE $it") + } + + jdbcTemplate.execute("SET FOREIGN_KEY_CHECKS = 1") + log.info { "[LocalDatabaseCleaner] 데이터베이스 초기화 완료" } + } +} diff --git a/service/src/main/resources/application-local.yaml b/service/src/main/resources/application-local.yaml index 880a61c1..095736d2 100644 --- a/service/src/main/resources/application-local.yaml +++ b/service/src/main/resources/application-local.yaml @@ -5,20 +5,16 @@ spring: format_sql: true hibernate: ddl-auto: validate - h2: - console: - enabled: true - path: /h2-console datasource: hikari: - jdbc-url: jdbc:h2:mem:database - driver-class-name: org.h2.Driver - username: sa - password: + jdbc-url: jdbc:mysql://localhost:23306/roomescape_local + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: init sql: init: mode: always - schema-locations: classpath:schema/schema-h2.sql + schema-locations: classpath:schema/schema-mysql.sql data-locations: classpath:schema/region-data.sql security: diff --git a/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt b/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt index 04f7ab1c..aa1ac10e 100644 --- a/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt +++ b/service/src/test/kotlin/com/sangdol/data/DefaultDataInitializer.kt @@ -1,10 +1,10 @@ package com.sangdol.data import com.sangdol.common.persistence.IDGenerator +import com.sangdol.common.persistence.TransactionExecutionUtil import com.sangdol.roomescape.admin.infrastructure.persistence.AdminEntity import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType -import com.sangdol.common.persistence.TransactionExecutionUtil import com.sangdol.roomescape.payment.infrastructure.common.* import com.sangdol.roomescape.reservation.infrastructure.persistence.ReservationStatus import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus @@ -32,7 +32,7 @@ import java.time.LocalDateTime import java.time.LocalTime import java.time.OffsetDateTime -@ActiveProfiles("test", "test-mysql") +@ActiveProfiles("test", "data") abstract class AbstractDataInitializer( val semaphore: Semaphore = Semaphore(permits = 10), ) : FunSpecSpringbootTest( diff --git a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt index 60e4d851..74f9285e 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/supports/TestDatabaseUtil.kt @@ -23,22 +23,26 @@ class TestDatabaseUtil( } fun initializeRegion() { - this::class.java.getResource("/schema/region-data.sql")?.readText()?.let { - jdbcTemplate.execute(it) + jdbcTemplate.queryForObject("SELECT EXISTS (SELECT 1 FROM region LIMIT 1)", Boolean::class.java)!!.also { isRegionTableEmpty -> + if (!isRegionTableEmpty) { + this::class.java.getResource("/schema/region-data.sql")?.readText()?.let { regionInsertSql -> + jdbcTemplate.execute(regionInsertSql) + } + } } } fun clear(mode: CleanerMode) { entityManager.clear() - jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY FALSE") + jdbcTemplate.execute("SET FOREIGN_KEY_CHECKS = 0") tables.forEach { if (mode == CleanerMode.EXCEPT_REGION && it == "region") { return@forEach } - jdbcTemplate.execute("TRUNCATE TABLE $it RESTART IDENTITY") + jdbcTemplate.execute("TRUNCATE TABLE $it") } - jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY TRUE") + jdbcTemplate.execute("SET FOREIGN_KEY_CHECKS = 1") } } diff --git a/service/src/test/resources/application-test-mysql.yaml b/service/src/test/resources/application-data.yaml similarity index 100% rename from service/src/test/resources/application-test-mysql.yaml rename to service/src/test/resources/application-data.yaml diff --git a/service/src/test/resources/application-test.yaml b/service/src/test/resources/application-test.yaml index 914bb277..ae8ee583 100644 --- a/service/src/test/resources/application-test.yaml +++ b/service/src/test/resources/application-test.yaml @@ -10,14 +10,14 @@ spring: ddl-auto: validate datasource: hikari: - jdbc-url: jdbc:h2:mem:test - driver-class-name: org.h2.Driver - username: sa - password: + jdbc-url: jdbc:mysql://localhost:23306/roomescape_local + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: init sql: init: mode: always - schema-locations: classpath:schema/schema-h2.sql + schema-locations: classpath:schema/schema-mysql.sql security: jwt: