ํ์ฌ ์ํฉ
ํ์ฌ ํ๋ก์ ํธ์์๋ ํ์ ํํด๋ฅผ 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๋ฅผ ์์ฑ
์ฌ๊ธฐ์ ์ค์ค๋ก ๋ฌธ์ ์ ๋ณธ์ง์ ํ๋ฆฌ๊ณ ์์์ ๊นจ๋ฌ์๋ค.
ํ ์ ์ฑ ์ผ๋ก ๋จผ์ ํ์ ํด์ผ ํ๋ ์ง๋ฌธ์ด๋ค.
๋ฌธ์ ์ ๋ณธ์ง์ ๋ค์ ์๊ฐํด๋ณด๋ฉด ์ด ๋ฌธ์ ๋ ๋จ์ํ “๊ธฐ์ ์ ์ผ๋ก ์ฌ๊ฐ์
์ด ๊ฐ๋ฅํ๊ฒ ํ์”๊ฐ ์๋๋ผ, ์ฌ๊ฐ์
์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ๋์ํด์ผ ํ ๊ฒ์ธ์ง(์ ์ฑ
) ๊ฒฐ์ ์ด ์ ํ๋์ด์ผ ํ๋ค.
- ์ฌ๊ฐ์
์ ํ์ฉํ๋๊ฐ?
- ํ์ฉํ๋ค๋ฉด ์ด๋ ์ ๋์ ์ ์ ๊ธฐ๊ฐ์ ์ค๊ฑด๊ฐ?
- ํํดํ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฑด๊ฐ?
- ...
์๊ฐํด๋ด์ผ ํ ์ ์ฑ
์ด ๊ต์ฅํ ๋ง๋ค.
์ด๋ฌํ ๋ถ๋ถ๋ค์ ๊ณ ๋ คํ์ง ์์์ฑ ๊ธฐ์ ์ ์ธ ๋ถ๋ถ์ผ๋ก๋ง ํด๊ฒฐ์ ํ๋ คํ๋ ๊ฒ์ด๋ค.
๊ฒฐ๋ก
ํ์ฌ ๊ตฌ์กฐ์์ ๋ฐ์ํ๋ “์ฌํํด ์ ๋ํฌ ์์ธ”๋ ๊ตฌํ ์ค์๋ผ๊ธฐ๋ณด๋ค, ํํด/์ฌ๊ฐ์
์ ์ฑ
์ ๋จผ์ ๋ฌธ์ ์ ๋ณธ์ง๋ก ์๊ฐํ์ง ๋ชปํด์ ์๊ธด ๋ฌธ์ ๋ค.
๋ฐ๋ผ์ ํ์์ ๋จผ์ “์ฌ๊ฐ์
์ ์ด๋ป๊ฒ ์ ์ํ ์ง(๋ณต๊ตฌ, ์ ๊ท ๋ฑ)”๋ฅผ ๋
ผ์ํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ํ๋จํ๋ค.

๊ทธ๋์ ํ์๋ค์๊ฒ ๋ ผ์๋ฅผ ์์ฒญํ๊ณ , ์ ์ฑ ์ ์ผ๋ก ์ ํ๊ธฐ์ ์๊ฐ์ด ์ผ๋ง ๋จ์ง์์ ํ์ฌ๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ญ์ ํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฒฐ์ ๋์๋ค.

๊ฐ๋ฐ์๋ ์์ ๋ ๋ชจ๋ฅด๊ฒ ๊ธฐ์ ์ ์ธ ํด๊ฒฐ ๋ฐฉ์์ ๋งค๋ชฐ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฑฐ ๊ฐ๋ค. ํ์ง๋ง, ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ๋ฌธ์ ์ ๋ณธ์ง์ ์ธ์ ๋ ์ฝ๋ ์์๋ง ์์ง ์์ผ๋ฉฐ ๋๋ก๋ ์ ์ฑ ์ ๋จผ์ ์ ์ํ์ง ์์ผ๋ฉด ์ด๋ค ๊ธฐ์ ์ ์ ํ๋ ์ ๋ต์ด ๋ ์ ์๋ค๋ ๊ฒ์ ์ค๊ฐํ๊ณ ์๋ค.
'๊ฐ๋ฐ > DND' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Spring REST Docs + Stoplight๋ก ํ ์คํธ ๊ธฐ๋ฐ API ๋ฌธ์ ๊ตฌ์ฑํ๊ธฐ (2) | 2026.02.24 |
|---|