๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ/DND

ํšŒ์›ํƒˆํ‡ด๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ• ๊นŒ

ํ˜„์žฌ ์ƒํ™ฉ

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํšŒ์› ํƒˆํ‡ด๋ฅผ Soft Delete๋กœ ๊ตฌ์„ฑํ•ด๋†“์•˜๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ '์†Œ๋น„ ์‹ฌํŒ'์ด ์œ ์ € ๊ฐ„ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์ด๋‹ค๋ณด๋‹ˆ ์•„์ง ๊ฐœ๋ฐœ ์ „์— ์œ ์ €๋ฅผ Hard Delete ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์ดํŽ™ํŠธ๋ฅผ ์˜ˆ์ƒํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ •์ฑ…์ ์œผ๋กœ ํƒˆํ‡ดํ•œ ํšŒ์› ๊ฐ„ ์†Œ๋น„ ์‹ฌํŒ์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค„์ง€, ๋ณด์—ฌ์ฃผ์ง€ ์•Š์„์ง€ ์ •ํ•˜์ง€๋„ ์•Š์•˜๊ณ  ๋ณด์—ฌ์ค€๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค˜์•ผ ํ• ์ง€ ๋“ฑ์˜ ๊ฒฐ์ •์ด ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.

๊ทธ๋ž˜์„œ Soft Delete๋กœ ํšŒ์› ํƒˆํ‡ด๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์–ดํ•ด๋†“๋Š” ๊ฒƒ์ด ์ถ”ํ›„ ์ •์ฑ…๊ณผ ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„๋ฅผ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค ์ƒ๊ฐํ–ˆ๋‹ค.

์œ ์ € ์—”ํ‹ฐํ‹ฐ์— ์•„๋ž˜ ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ํšŒ์›ํƒˆํ‡ด ๋กœ์ง์„ ์ž‘์„ฑํ–ˆ๋‹ค.

@Table(uniqueConstraints = {
    @UniqueConstraint(
        name = "uk_user_provider_provider_id",
        columnNames = {"provider", "provider_id", "is_deleted"}
    )
})
@SQLRestriction("is_deleted = 0")



@SQLRestriction("is_deleted = 0")๋ฅผ ์‚ฌ์šฉํ•ด, ๊ธฐ๋ณธ ์กฐํšŒ ์‹œ ํƒˆํ‡ดํ•œ ์œ ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ œ์™ธ๋˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์„œ๋น„์Šค ์ฝ”๋“œ์—์„œ๋Š” '์‚ญ์ œ ์—ฌ๋ถ€'๋ฅผ ์ง์ ‘ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ

๋ฌธ์ œ๋Š” ํšŒ์›๊ฐ€์ž… -> ํƒˆํ‡ด -> ํšŒ์›๊ฐ€์ž… -> ํƒˆํ‡ด(์œ ๋‹ˆํฌ ์˜ˆ์™ธ๐Ÿ’ฅ)๋ผ๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์›์ธ ๋ถ„์„

ํ˜„์žฌ ์œ ์ €๋Š” Soft Delete๋ฅผ ์œ„ํ•ด is_deleted ์ปฌ๋Ÿผ์„ ๋‘๊ณ , ์กฐํšŒ ์‹œ์—๋Š” `@SQLRestriction("is_deleted = 0")`๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ์œ ์ €๋งŒ ๊ธฐ๋ณธ ์กฐํšŒ๋˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.

๋˜ํ•œ ์žฌ๊ฐ€์ž…์„ ์œ„ํ•ด ์œ ๋‹ˆํฌ ์ œ์•ฝ์„ (provider, provider_id, is_deleted)๋กœ ํ™•์žฅํ–ˆ๋‹ค. ์ด ๊ตฌ์กฐ์—์„œ๋Š” ๋‹ค์Œ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
- ํ™œ์„ฑ ์œ ์ €: (google, 123, 0) 1๊ฐœ๋งŒ ์กด์žฌ ๊ฐ€๋Šฅ
- ํƒˆํ‡ด ์œ ์ €: (google, 123, 1) ๋˜ํ•œ 1๊ฐœ๋งŒ ์กด์žฌ ๊ฐ€๋Šฅ

์ฆ‰ ํƒˆํ‡ด๋ฅผ ํ•œ ๋ฒˆ ํ•œ ๋’ค์—๋Š” (provider, provider_id, 1) ๋ ˆ์ฝ”๋“œ๊ฐ€ DB์— ๋‚จ์•„์žˆ๊ฒŒ ๋˜๊ณ , ๋‹ค์‹œ ๊ฐ€์ž…ํ•˜๋ฉด (provider, provider_id, 0)์ด ์ƒˆ๋กœ ์ƒ๊ธด๋‹ค.

์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ํƒˆํ‡ดํ•˜๋ฉด, ์ƒˆ๋กœ ๊ฐ€์ž…ํ•œ ํ™œ์„ฑ ์œ ์ €๊ฐ€ (provider, provider_id, 1)๋กœ ๋ณ€๊ฒฝ๋˜๋ ค๊ณ  ํ•˜๋Š” ์ˆœ๊ฐ„ ์ด๋ฏธ ๊ธฐ์กด์— ์žˆ๋˜ ํƒˆํ‡ด ๋ ˆ์ฝ”๋“œ์™€ ์œ ๋‹ˆํฌ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.
- ํšŒ์›๊ฐ€์ž…: (p, id, 0) ์ƒ์„ฑ
- ํƒˆํ‡ด: (p, id, 1)๋กœ ๋ณ€๊ฒฝ (OK)
- ์žฌ๊ฐ€์ž…: (p, id, 0) ์ƒˆ๋กœ ์ƒ์„ฑ (OK)
- ์žฌํƒˆํ‡ด: ์ƒˆ ํ™œ์„ฑ ์œ ์ €๋ฅผ (p, id, 1)๋กœ ๋ณ€๊ฒฝํ•˜๋ ค ํ•จ → ๊ธฐ์กด (p, id, 1)์ด ์ด๋ฏธ ์กด์žฌ → ์œ ๋‹ˆํฌ ์˜ˆ์™ธ ๐Ÿ’ฅ

๊ฒฐ๊ตญ ์ง€๊ธˆ ์Šคํ‚ค๋งˆ๋Š” “๋™์ผ provider/providerId์— ๋Œ€ํ•ด ํƒˆํ‡ด ์ด๋ ฅ์€ ์ตœ๋Œ€ 1๊ฐœ๋งŒ ์œ ์ง€”๋ผ๋Š” ์ œ์•ฝ์„ ๋งŒ๋“ค๊ณ  ์žˆ๊ณ , ์„œ๋น„์Šค ํ”Œ๋กœ์šฐ(์žฌ๊ฐ€์ž…/์žฌํƒˆํ‡ด)์™€ ์ถฉ๋Œํ•œ๋‹ค.


ํ•ด๊ฒฐ ๋ฐฉํ–ฅ

์ฒ˜์Œ์—” ๊ธฐ์ˆ ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค.

 

A) Soft delete ๋ ˆ์ฝ”๋“œ๋ฅผ “์œ ์ง€ํ•˜์ง€ ์•Š๊ณ ” ์žฌ๊ฐ€์ž… ์‹œ ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณต๊ตฌํ•œ๋‹ค.

์ด ๋ฐฉ์‹์€ ๊ฐ™์€ provider/providerId๋กœ ๊ฐ€์ž…ํ•˜๋ฉด ์‹ ๊ทœ row๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ๊ธฐ์กด ํƒˆํ‡ด ์œ ์ € ์ •๋ณด๋ฅผ ์ฐพ์•„์„œ is_deleted=false, deleted_at=null๋กœ ๋˜๋Œ๋ ค ๋ณต๊ตฌํ•œ๋‹ค.

์ด๋Ÿฌ๋ฉด ์• ์ดˆ์— row๊ฐ€ 2๊ฐœ๊ฐ€ ๋˜์ง€ ์•Š์•„ (provider, provider_id, is_deleted) ์œ ๋‹ˆํฌ ์ถฉ๋Œ์ด ์›์ฒœ์ ์œผ๋กœ ์•ˆ ์ƒ๊ธฐ๊ธฐ์— ์œ ๋‹ˆํฌ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, “๊ณผ๊ฑฐ ๊ณ„์ •๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์‹ ๊ทœ ์œ ์ €” ๊ฐœ๋…์„ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค.

B) ์žฌ๊ฐ€์ž… ํ›„ ํƒˆํ‡ด ์‹œ ๊ธฐ์กด ํƒˆํ‡ด ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ํƒˆํ‡ด ํ›„ ์žฌ๊ฐ€์ž…์„ ํ–ˆ์œผ๋‚˜, ๋‹ค์‹œ ํ•œ๋ฒˆ ํƒˆํ‡ด๋ฅผ ํ•œ๋‹ค๋ฉด ์ด์ „์— ์กด์žฌํ•˜๋˜ ํƒˆํ‡ด ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ํ™œ์„ฑ ์‚ฌ์šฉ์ž์™€ ํ•˜๋‚˜์˜ ํƒˆํ‡ด ๊ธฐ๋ก์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ์•„์ง ๊ฐœ๋ฐœ ์ „์ธ '์†Œ๋น„ ์‹ฌํŒ' ๊ธฐ๋Šฅ์—์„œ์˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์ดํŽ™ํŠธ๋ฅผ ์˜ˆ์ƒํ•  ์ˆ˜ ์—†๋‹ค.

C) ์ด๋ ฅ์„ ํ†ตํ•ด์„œ๋งŒ ํƒˆํ‡ด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

๊ธฐ์กด์˜ user ํ…Œ์ด๋ธ”์€ “ํ˜„์žฌ ์ƒํƒœ”๋งŒ ๊ฐ€์ง€๊ณ , ํƒˆํ‡ด ์ด๋ฒคํŠธ๋Š” user_withdraw_history์— insert๋กœ ๋‚จ๊ธด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์œ ์ € ์žฌ๊ฐ€์ž…/์žฌํƒˆํ‡ด๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด๋„ ์œ ๋‹ˆํฌ ์ œ์•ฝ๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ ํƒˆํ‡ด์— ๋Œ€ํ•œ ์ด๋ ฅ์„ ๋”ฐ๋กœ ๋‚จ๊ธฐ๊ธฐ์— ์œ ์ €๋ฅผ ์ถ”์ ํ•˜๊ธฐ๋„ ํŽธํ•˜๋‹ค.

์˜ˆ์‹œ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
- ํƒˆํ‡ด ์‹œ: user.is_deleted=true, deleted_at=now()
- ๋™์‹œ์—: user_withdraw_history์— (user_id, provider, provider_id, deleted_at …) insert
- ์žฌ๊ฐ€์ž… ์‹œ
    - 7์ผ ์ด๋‚ด๋ฉด ๋ณต๊ตฌ(๋‹ค์‹œ is_deleted=false)
    - 7์ผ ์ดํ›„๋ฉด ๊ธฐ์กด user๋ฅผ ์‚ญ์ œ ํ›„ ์‹ ๊ทœ user๋ฅผ ์ƒ์„ฑ

์—ฌ๊ธฐ์„œ ์Šค์Šค๋กœ ๋ฌธ์ œ์˜ ๋ณธ์งˆ์„ ํ๋ฆฌ๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜๋‹ค.


ํŒ€ ์ •์ฑ…์œผ๋กœ ๋จผ์ € ํ™•์ •ํ•ด์•ผ ํ•˜๋Š” ์งˆ๋ฌธ์ด๋‹ค.

๋ฌธ์ œ์˜ ๋ณธ์งˆ์„ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ “๊ธฐ์ˆ ์ ์œผ๋กœ ์žฌ๊ฐ€์ž…์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ž”๊ฐ€ ์•„๋‹ˆ๋ผ, ์žฌ๊ฐ€์ž… ์‹œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•ด์•ผ ํ•  ๊ฒƒ์ธ์ง€(์ •์ฑ…) ๊ฒฐ์ •์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

- ์žฌ๊ฐ€์ž…์„ ํ—ˆ์šฉํ•˜๋Š”๊ฐ€?
- ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ์–ด๋А ์ •๋„์˜ ์œ ์˜ˆ ๊ธฐ๊ฐ„์„ ์ค„๊ฑด๊ฐ€?
- ํƒˆํ‡ดํ•œ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ๊ฑด๊ฐ€?
- ...

์ƒ๊ฐํ•ด๋ด์•ผ ํ•  ์ •์ฑ…์ด ๊ต‰์žฅํžˆ ๋งŽ๋‹ค. 

์ด๋Ÿฌํ•œ ๋ถ€๋ถ„๋“ค์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€์ฑ„ ๊ธฐ์ˆ ์ ์ธ ๋ถ€๋ถ„์œผ๋กœ๋งŒ ํ•ด๊ฒฐ์„ ํ•˜๋ คํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค.


๊ฒฐ๋ก 

ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” “์žฌํƒˆํ‡ด ์œ ๋‹ˆํฌ ์˜ˆ์™ธ”๋Š” ๊ตฌํ˜„ ์‹ค์ˆ˜๋ผ๊ธฐ๋ณด๋‹ค, ํƒˆํ‡ด/์žฌ๊ฐ€์ž… ์ •์ฑ…์„ ๋จผ์ € ๋ฌธ์ œ์˜ ๋ณธ์งˆ๋กœ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•ด์„œ ์ƒ๊ธด ๋ฌธ์ œ๋‹ค.

๋”ฐ๋ผ์„œ ํŒ€์—์„œ ๋จผ์ € “์žฌ๊ฐ€์ž…์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ• ์ง€(๋ณต๊ตฌ, ์‹ ๊ทœ ๋“ฑ)”๋ฅผ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

 

 

๊ทธ๋ž˜์„œ ํŒ€์›๋“ค์—๊ฒŒ ๋…ผ์˜๋ฅผ ์š”์ฒญํ–ˆ๊ณ , ์ •์ฑ…์ ์œผ๋กœ ์ •ํ•˜๊ธฐ์—” ์‹œ๊ฐ„์ด ์–ผ๋งˆ ๋‚จ์ง€์•Š์•„ ํ˜„์žฌ๋Š” ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒฐ์ •๋˜์—ˆ๋‹ค.

 

 

๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ๋„ ๋ชจ๋ฅด๊ฒŒ ๊ธฐ์ˆ ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์— ๋งค๋ชฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€ ๊ฑฐ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ๋ฌธ์ œ์˜ ๋ณธ์งˆ์€ ์–ธ์ œ๋‚˜ ์ฝ”๋“œ ์•ˆ์—๋งŒ ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๋•Œ๋กœ๋Š” ์ •์ฑ…์„ ๋จผ์ € ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ๊ธฐ์ˆ ์  ์„ ํƒ๋„ ์ •๋‹ต์ด ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์‹ค๊ฐํ•˜๊ณ  ์žˆ๋‹ค.