๐ 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 ๋ฌธ์ ๋ก ์ธํ ํ ์คํธ ์คํจ ์์ด ์์ ์ ์ผ๋ก ๋ฐ์ดํฐ ์ด๊ธฐํ ๊ฐ๋ฅ! โ
๋๊ธ๋จ๊ธฐ๊ธฐ