Skip to content

๐Ÿ”ง[๊ธฐ๋Šฅ์ถ”๊ฐ€][DB] ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ Soft Delete ๊ตฌํ˜„ย #516

@Chuseok22

Description

@Chuseok22

๐Ÿ“ ํ˜„์žฌ ๋ฌธ์ œ์ 

  • ๋„๋ฉ”์ธ(์˜ˆ: ๊ณต์—ฐ์žฅ, ๊ณต์—ฐ ๋“ฑ)์— ๋Œ€ํ•œ Delete ๋กœ์ง์ด ๋ฏธ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.
  • ๋ฌผ๋ฆฌ ์‚ญ์ œ ์‹œ ์ด๋ ฅ ์ถ”์ /๋ณต๊ตฌ๊ฐ€ ์–ด๋ ค์›Œ ์šด์˜ ๋ฆฌ์Šคํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Hibernate์˜ @SoftDelete, @SQLDelete, @Where๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ˆ˜๋™์œผ๋กœ Soft Delete๋ฅผ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ค‘๋ณต ๊ฒ€์ฆ(validateConcertName โ†’ existsByConcertName)๊ณผ ์กฐํšŒ ์ฟผ๋ฆฌ๋“ค์ด โ€œ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐโ€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„ ํ–ฅํ›„ Soft Delete ๋„์ž… ์‹œ ์ถฉ๋Œ/๋…ธ์ถœ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ / ์ œ์•ˆ ๊ธฐ๋Šฅ

  • Soft Delete ๋งˆ์ปค ์ปฌ๋Ÿผ ์ถ”๊ฐ€

    • ์˜ต์…˜ A: isDeleted BOOLEAN DEFAULT false
    • ์˜ต์…˜ B: deletedAt TIMESTAMP WITH TIME ZONE (+ ํ•„์š” ์‹œ deletedBy UUID ๋˜๋Š” VARCHAR)
    • ๊ฒฐ์ • ํ•„์š”: ์œ„ A/B ์ค‘ ํƒ1(๋˜๋Š” ๋ณ‘ํ–‰). ์šด์˜/๊ฐ์‚ฌ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.
  • ์กฐํšŒ/๊ฒ€์ฆ ๊ฒฝ๋กœ ์ „๋ฉด ๋ฐ˜์˜

    • findConcertById, filteredConcertForAdmin, findConcertInfoByConcertIdForAdmin ๋“ฑ ๋ชจ๋“  ์กฐํšŒ ์ฟผ๋ฆฌ์— โ€œ์‚ญ์ œ ์•„๋‹˜โ€ ์กฐ๊ฑด ์ˆ˜๋™ ์ถ”๊ฐ€.
    • validateConcertName โ†’ โ€œ์‚ญ์ œ ์•„๋‹˜โ€ ์กฐ๊ฑด์„ ํฌํ•จํ•œ ์ค‘๋ณต ๊ฒ€์ฆ์œผ๋กœ ์ˆ˜์ •(์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋Š” ์ค‘๋ณต์œผ๋กœ ๋ณด์ง€ ์•Š์Œ).
  • Repository/์ฟผ๋ฆฌ ๋ฆฌํŒฉํ† ๋ง

    • ์˜ˆ: existsByConcertNameAndIsDeletedFalse(...), findByConcertIdAndIsDeletedFalse(...) ๋“ฑ ๋ช…์‹œ์  ๋ฉ”์„œ๋“œ ๋„์ž….
    • ConcertRepositoryCustom JPQL/QueryDSL์—๋„ isDeleted = false(๋˜๋Š” deletedAt IS NULL) ์กฐ๊ฑด ์ˆ˜๋™ ์ถ”๊ฐ€.
  • DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

    • Soft Delete ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ๋ฐ ์ธ๋ฑ์Šค ๋ณด๊ฐ•.

    • ๊ณ ์œ  ์ œ์•ฝ๊ณผ์˜ ์ถฉ๋Œ ๋ฐฉ์ง€(์ธ๋„ค์ผ/์ขŒ์„ ๋ฐฐ์น˜๋„ ๊ฒฝ๋กœ unique = true):

      • ๋™์ผ ๊ฒฝ๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ •์ฑ… ์—ฌ๋ถ€ ๊ฒฐ์ • ํ•„์š”.
      • ์žฌ์‚ฌ์šฉ ํ—ˆ์šฉ ์‹œ, โ€œํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ ํ•œ์ • ๊ณ ์œ โ€๊ฐ€ ํ•„์š”(์˜ˆ: ๋ถ€๋ถ„ ๊ณ ์œ  ์ธ๋ฑ์Šค ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ ๊ฒ€์ฆ).
  • API ์„ค๊ณ„

    • DELETE /admin/concerts/{concertId} (Soft Delete)
    • ๊ถŒํ•œ ์ฒดํฌ(๊ด€๋ฆฌ์ž ํ•œ์ •), ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ(์ด๋ฏธ ์‚ญ์ œ ์‹œ ์ ์ ˆํ•œ ์‘๋‹ต ๊ทœ์•ฝ ์ •์˜).
  • ํ…Œ์ŠคํŠธ/์šด์˜ ๊ฐ€์ด๋“œ

    • ๋‹จ์œ„/ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ: ์‚ญ์ œ/์กฐํšŒ/์ค‘๋ณต๊ฒ€์ฆ/์บ์‹œ/์ž„๋ฒ ๋”ฉ ์ƒํ˜ธ์ž‘์šฉ ๊ฒ€์ฆ.
    • ์šด์˜: ์‚ญ์ œ ํ›„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ/๊ด€๋ฆฌ์ž ๋ฆฌ์ŠคํŠธ์—์„œ ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ์„ ํ™•์ธ.

โš™๏ธ ์ž‘์—… ๋‚ด์šฉ

๐Ÿ™‹โ€โ™‚๏ธ ๋‹ด๋‹น์ž

  • ๋ฐฑ์—”๋“œ: @Chuseok22
  • ํ”„๋ก ํŠธ์—”๋“œ: ์ด๋ฆ„
  • ๋””์ž์ธ: ์ด๋ฆ„

Sub-issues

Metadata

Metadata

Assignees

Labels

์ž‘์—… ์ „์ž‘์—… ์‹œ์ž‘ ์ „ ์ค€๋น„์ƒํƒœ

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions