๐ Kotlin ํ ์คํธ ํ๊ฒฝ - ์ธ๋ ํค(FK) ๋ฌธ์ ํด๊ฒฐ ๋ฐ ํ ์ด๋ธ ์ด๊ธฐํ ๋ฐฉ์ ๊ฐ์ (์ฝ์ง ๊ธฐ๋ก)
๐ Kotlin ํ ์คํธ ํ๊ฒฝ - ์ธ๋ ํค(FK) ๋ฌธ์ ํด๊ฒฐ ๋ฐ ํ ์ด๋ธ ์ด๊ธฐํ ๋ฐฉ์ ๊ฐ์
๐ 1. ๋ฌธ์ ์ํฉ
๐น ๊ธฐ์กด ํ ์คํธ ํ๊ฒฝ์์ ๋ฐ์ํ FK ๋ฌธ์
- ๊ธฐ์กด ์ฝ๋
(Kotlin) ํ ์คํธ ํ๊ฒฝ์์ ํ ์ด๋ธ ์ด๊ธฐํ ๋ฌธ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ (์ฝ์ง ๊ธฐ๋ก)
mapleServiceTest
๋ฅผ ์คํํ ๋UserTable
์ด ์ธ๋ ํค(FK)๋ก ์ค์ ๋๋ฉด์ ์ญ์ ์์ ๋ฌธ์ ๋ฐ์SchemaUtils.drop(UserTable)
์ ์คํํ๋ ค๊ณ ํ ๋, FK ์ ์ฝ ์กฐ๊ฑด ๋๋ฌธ์ ์ญ์ ๋์ง ์๋ ๋ฌธ์ ๋ฐ์- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ ์คํธ ๋ฐ์ดํฐ ์ ๋ฆฌ ๋ฐฉ์ ๋ณ๊ฒฝ ํ์
๐ 2. ๊ธฐ์กด ๋ฐฉ์์ ๋ฌธ์ ์
๐น ๊ธฐ์กด @AfterEach
์์ SchemaUtils.drop()
์ ์ฌ์ฉํ๋ ๋ฌธ์
@AfterEach
fun tearDown() {
transaction {
SchemaUtils.drop(UserTable) // FK ์ ์ฝ ์กฐ๊ฑด ๋๋ฌธ์ ์คํจ ๊ฐ๋ฅ
}
}
โ ๋ฌธ์ ๋ฐ์ ์ด์
UserTable
์ดMapleUserTable
๊ณผ FK ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์์drop(UserTable)
์ ํ๋ ค๋ฉด FK ๊ด๊ณ๊ฐ ํด์ ๋์ด์ผ ํ๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก FK ์ค์ ์ด ํ์ฑํ๋์ด ์์ด ์ญ์ ๋ถ๊ฐ๋ฅ- ์ฆ, ์ฐธ์กฐํ๋ ํ
์ด๋ธ(
MapleUserTable
)์ ๋จผ์ ์ญ์ ํด์ผ FK ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์
๐ 3. ํด๊ฒฐ ๋ฐฉ๋ฒ - deleteAll()
์ ํ์ฉํ ๋ฐ์ดํฐ ์ด๊ธฐํ
๐น FK ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๋ก์ด ํ ์คํธ ํ๊ฒฝ ์ค์
@BeforeAll
fun setUp() {
transaction(database) {
SchemaUtils.create(UserTable, MapleUserTable)
}
userRepository = UserRepository(database)
mapleRepository = MapleRepository(database)
mapleService = MapleService(config, client, mapleRepository, userRepository)
}
@AfterEach
fun tearDown() {
transaction(database) {
MapleUserTable.deleteAll() // FK๋ฅผ ๊ฐ์ง ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ญ์
UserTable.deleteAll() // ์ดํ FK ๋์ ํ
์ด๋ธ ๋ฐ์ดํฐ ์ญ์
}
}
@AfterAll
fun tearDownAll() {
transaction {
SchemaUtils.drop(MapleUserTable) // FK๋ฅผ ๊ฐ์ง ํ
์ด๋ธ์ ๋จผ์ ์ญ์
SchemaUtils.drop(UserTable) // ์ดํ FK ๋์ ํ
์ด๋ธ ์ญ์
}
}
๐ 4. ํต์ฌ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ ์ด์
๐น 1๏ธโฃ deleteAll()
์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ง ์ญ์
@AfterEach
fun tearDown() {
transaction(database) {
MapleUserTable.deleteAll() // FK๋ฅผ ๊ฐ์ง ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ญ์
UserTable.deleteAll() // ์ดํ FK ๋์ ํ
์ด๋ธ ๋ฐ์ดํฐ ์ญ์
}
}
โ ์ด์
deleteAll()
์ ํ ์ด๋ธ์ ์ญ์ ํ๋ ๊ฒ์ด ์๋๋ผ, ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ - ์ฆ, FK ๊ด๊ณ๊ฐ ๋จ์ ์์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์
- ํ ์คํธ ์คํ ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ฉด์๋, ํ ์ด๋ธ ์์ฒด๋ ์ ์ง
๐น 2๏ธโฃ @AfterAll
์์ SchemaUtils.drop()
์ ํธ์ถ
@AfterAll
fun tearDownAll() {
transaction {
SchemaUtils.drop(MapleUserTable) // FK๋ฅผ ๊ฐ์ง ํ
์ด๋ธ์ ๋จผ์ ์ญ์
SchemaUtils.drop(UserTable) // ์ดํ FK ๋์ ํ
์ด๋ธ ์ญ์
}
}
โ ์ด์
drop()
์ ํ ์ด๋ธ ์์ฒด๋ฅผ ์ญ์ ํ๋๋ฐ, FK๊ฐ ์๋ ๊ฒฝ์ฐ ๋จผ์ ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ์ญ์ ํด์ผ ํจMapleUserTable
์ดUserTable
์ ์ฐธ์กฐํ๋ฏ๋ก, ๋จผ์ ์ญ์ ํ ํUserTable
์ ์ญ์ ํด์ผ ์ค๋ฅ ๋ฐฉ์ง ๊ฐ๋ฅ
๐ 5. deleteAll()
vs drop()
์ฐจ์ด์
๊ธฐ๋ฅ | deleteAll() |
drop() |
---|---|---|
๋์ ๋ฐฉ์ | ํ ์ด๋ธ ๋ด ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ (ํ ์ด๋ธ ์ ์ง) | ํ ์ด๋ธ ์์ฒด๋ฅผ ์ญ์ |
FK ๊ด๊ณ ๋ฌธ์ | FK๊ฐ ์์ด๋ ์ฌ์ฉ ๊ฐ๋ฅ | FK ๊ด๊ณ๊ฐ ์์ผ๋ฉด ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ |
์ฑ๋ฅ | ๋น ๋ฆ (๋ฐ์ดํฐ๋ง ์ญ์ ) | ์๋์ ์ผ๋ก ๋๋ฆผ (ํ ์ด๋ธ ์ญ์ ํ ๋ค์ ์์ฑ ํ์) |
์ฌ์ฉ ์์ | ๊ฐ๋ณ ํ ์คํธ ์คํ ํ ๋ฐ์ดํฐ ์ด๊ธฐํ ์ | ํ ์คํธ ์ข ๋ฃ ํ ์ ์ฒด ํ ์ด๋ธ ์ญ์ ์ |
๐ 6. ๊ฒฐ๋ก
๐ FK ์ ์ฝ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ SchemaUtils.drop()
๋์ deleteAll()
์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ง ์ญ์ ํ๋ ๊ฒ์ด ๋ ์์ ์
๐ ํ
์คํธ ์คํ ์ค์๋ deleteAll()
์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ด๊ธฐํ, ํ
์คํธ ์ข
๋ฃ ํ drop()
์ ํ์ฉํ์ฌ ํ
์ด๋ธ ์ญ์
๐ FK ์ ์ฝ ์กฐ๊ฑด์ ๊ณ ๋ คํ์ฌ ํ
์ด๋ธ ์ญ์ ์์๋ฅผ ์กฐ์ ํด์ผ ๋ฌธ์ ๋ฐ์์ ๋ฐฉ์งํ ์ ์์
๐ ์ด์ FK ๋ฌธ์ ๋ก ์ธํ ํ ์คํธ ์คํจ ์์ด ์์ ์ ์ผ๋ก ๋ฐ์ดํฐ ์ด๊ธฐํ ๊ฐ๋ฅ! โ
๋๊ธ๋จ๊ธฐ๊ธฐ