๐Ÿ” Kotlin ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ - ์™ธ๋ž˜ ํ‚ค(FK) ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™” ๋ฐฉ์‹ ๊ฐœ์„  (์‚ฝ์งˆ ๊ธฐ๋ก)

์—…๋ฐ์ดํŠธ:
2 ๋ถ„ ์†Œ์š”

๐Ÿ” 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 ๋ฌธ์ œ๋กœ ์ธํ•œ ํ…Œ์ŠคํŠธ ์‹คํŒจ ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ! โœ…

๊ฐœ์„  ์ฝ”๋“œ

๊นƒํ—ˆ๋ธŒ ์ฃผ์†Œ

ํƒœ๊ทธ: , , , , , , , ,

์นดํ…Œ๊ณ ๋ฆฌ: , ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ