๋ด๋ถ ๋๊ตฌ์ฉ ๊ฐ์ฌ ๋ก๊ทธ: ๊น๋ํ ๋ณ๊ฒฝ ์ด๋ ฅ ํจํด
๋ด๋ถ ๋๊ตฌ์ฉ ๊ฐ์ฌ ๋ก๊ทธ ์ค๋ฌด ๊ฐ์ด๋: CRUD ๋ณ๊ฒฝ๋ง๋ค ๋๊ฐ ์ธ์ ๋ฌด์์ ํ๋์ง ์ถ์ ํ๊ณ , ์์ ํ๊ฒ diff๋ฅผ ์ ์ฅํ๊ณ , ๊ด๋ฆฌ์ ํ๋ ํผ๋๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ.

๋ด๋ถ ๋๊ตฌ์ ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ํ์ํ ์ด์ (๊ทธ๋ฆฌ๊ณ ๋ณดํต ์คํจํ๋ ์ง์ )\n\n๋๋ถ๋ถ์ ํ์ ๋ฌด์ธ๊ฐ ์๋ชป๋ ๋ค์์ผ ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ณ ๊ฐ์ด ๋ณ๊ฒฝ์ ๋ถ์ํ๊ฑฐ๋, ์ฌ๋ฌด ์์น๊ฐ ๋ฐ๋๊ฑฐ๋, ๊ฐ์ฌ์๊ฐ โ๋๊ฐ ์น์ธํ๋์?โ๋ผ๊ณ ๋ฌป๋ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋์์ผ ์์ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์์คํฌํ, Slack ๋ฉ์์ง, ์ถ์ธก์ผ๋ก ๊ณผ๊ฑฐ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ค๊ณ ํ๊ฒ ๋ฉ๋๋ค.\n\n๋๋ถ๋ถ์ ๋ด๋ถ ์ฑ์์ "์ปดํ๋ผ์ด์ธ์ค์ ์ถฉ๋ถ"ํ๋ค๋ ๊ฒ์ ์๋ฒฝํ ํฌ๋ ์ ์์คํ
์ ์๋ฏธํ์ง ์์ต๋๋ค. ํต์ฌ์ ์์ ์ง๋ฌธ ์งํฉ์ ๋น ๋ฅด๊ณ ์ผ๊ด๋๊ฒ ๋ตํ ์ ์๋ ๊ฒ์
๋๋ค: ๋๊ฐ ๋ณ๊ฒฝํ๋๊ฐ, ์ด๋ค ๋ ์ฝ๋๊ฐ ์ํฅ์ ๋ฐ์๋๊ฐ, ๋ฌด์์ด ๋ฐ๋์๋๊ฐ, ์ธ์ ์ผ์ด๋ฌ๋๊ฐ, ์ด๋์ ๋ฐ์ํ๋๊ฐ(UI, ์ํฌํธ, API, ์๋ํ ๋ฑ). ๊ทธ ๋ช
ํ์ฑ์ด ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ์ ๋ขฐํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.\n\n๊ฐ์ฌ ๋ก๊ทธ๊ฐ ๋ณดํต ์คํจํ๋ ์ด์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ ๋ฒ์(coverage)์
๋๋ค. ๋จ์ ํธ์ง์๋ ์ด๋ ฅ์ด ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง, ์์
์ด ๋น ๋ฅด๊ฒ ์งํ๋๋ ์๊ฐ ๊ฒฉ์ฐจ๊ฐ ์๊น๋๋ค. ํํ ์์ธ์ ๋๋ ํธ์ง, ์ํฌํธ, ์์ฝ ์์
, ์ ์ ํ๋ฉด์ ์ฐํํ๋ ๊ด๋ฆฌ์ ์์
(๋น๋ฐ๋ฒํธ ์ฌ์ค์ , ์ญํ ๋ณ๊ฒฝ ๋ฑ), ๊ทธ๋ฆฌ๊ณ ์ญ์ (ํนํ ํ๋ ์ญ์ )์
๋๋ค.\n\n๋ํ ๋๋ฒ๊น
๋ก๊ทธ์ ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ์๋ ๊ฒ๋ ํํ ์คํจ์
๋๋ค. ๋๋ฒ๊ทธ ๋ก๊ทธ๋ ๊ฐ๋ฐ์๋ฅผ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค: ์๋๋ฝ๊ณ ๊ธฐ์ ์ ์ด๋ฉฐ ์ผ๊ด์ฑ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ฐ์ฌ ๋ก๊ทธ๋ ์ฑ
์์ฑ์ ์ํด ๋ง๋ค์ด์ง๋๋ค: ์ผ๊ด๋ ํ๋, ๋ช
ํํ ๋ฌธ๊ตฌ, ๋น๊ธฐ์ ์์๊ฒ๋ ๋ณด์ฌ์ค ์ ์๋ ์์ ๋ ํ์์ด ํ์ํฉ๋๋ค.\n\n์ค์ฉ์ ์ฌ๋ก: ์ง์ ๋งค๋์ ๊ฐ ๊ณ ๊ฐ์ ์๊ธ์ ๋ฅผ ๋ณ๊ฒฝํ ํ ์๋ํ๊ฐ ๋์ค์ ์ฒญ๊ตฌ ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค. ๋ง์ฝ "๊ณ ๊ฐ ์
๋ฐ์ดํธ"๋ง ๊ธฐ๋กํ๋ค๋ฉด ์ฌ๋์ด ํ ๊ฒ์ธ์ง ์ํฌํ๋ก๊ฐ ํ ๊ฒ์ธ์ง ์ํฌํธ๊ฐ ๋ฎ์ด์ด ๊ฒ์ธ์ง ๊ตฌ๋ถํ ์ ์์ต๋๋ค.\n\n## ๋๊ฐ, ๋ฌด์์, ์ธ์ ๋ฅผ ๋ตํ๋ ๊ฐ์ฌ ๋ก๊ทธ ํ๋\n\n์ข์ ๊ฐ์ฌ ๋ก๊น
์ ํ ๊ฐ์ง ๋ชฉํ์์ ์์ํฉ๋๋ค: ์ฌ๋์ด ํ ํญ๋ชฉ๋ง ์ฝ์ด๋ ์ถ์ธก ์์ด ๋ฌด์จ ์ผ์ด ์์๋์ง ์ดํดํ ์ ์์ด์ผ ํฉ๋๋ค.\n\n### ๋๊ฐ ํ๋๊ฐ\n\n๋ชจ๋ ๋ณ๊ฒฝ๋ง๋ค ๋ช
ํํ ํ์์(actor)๋ฅผ ์ ์ฅํ์ธ์. ๋๋ถ๋ถ์ ํ์ "์ฌ์ฉ์ ์์ด๋"์์ ๋ฉ์ถ์ง๋ง ๋ด๋ถ ๋๊ตฌ๋ ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค.\n\nํ์์ ์ ํ๊ณผ ์๋ณ์๋ฅผ ํฌํจํด ์ง์, ์๋น์ค ๊ณ์ , ์ธ๋ถ ํตํฉ์ ๊ตฌ๋ถํ ์ ์๊ฒ ํ์ธ์. ํ์ด๋ ํ
๋ํธ๊ฐ ์๋ค๋ฉด ์กฐ์ง ๋๋ ์ํฌ์คํ์ด์ค ID๋ ์ ์ฅํด ์ด๋ฒคํธ๊ฐ ์์ด์ง ์๋๋ก ํ์ธ์.\n\n### ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๊ณ ์ด๋ ๋ ์ฝ๋์ธ์ง\n\nํ๋(create, update, delete, restore)๊ณผ ๋์(target)์ ์บก์ฒํ์ธ์. "๋์"์ ์ฌ๋์ด ์ดํดํ๊ธฐ ์ฌ์ฐ๋ฉด์๋ ์ ํํด์ผ ํฉ๋๋ค: ํ
์ด๋ธ์ด๋ ์ํฐํฐ ์ด๋ฆ, ๋ ์ฝ๋ ID, ๊ทธ๋ฆฌ๊ณ ๋น ๋ฅธ ํ์ธ์ ์ํ ์งง์ ๋ ์ด๋ธ(์: ์ฃผ๋ฌธ ๋ฒํธ) ๋ฑ.\n\n์ค์ฉ์ ์ต์ ํ๋ ์งํฉ:\n\n- actor_type, actor_id (๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฅํ๋ฉด actor_display_name)\n- action ๋ฐ target_type, target_id\n- happened_at_utc (UTC๋ก ์ ์ฅ๋ ํ์์คํฌํ)\n- source (ํ๋ฉด, ์๋ํฌ์ธํธ, ์์
, ์ํฌํธ) ๋ฐ ip_address (ํ์ํ ๊ฒฝ์ฐ๋ง)\n- reason (๋ฏผ๊ฐํ ๋ณ๊ฒฝ์ ์ํ ์ ํ์ ์ฝ๋ฉํธ)\n\n### ์ธ์ ์ผ์ด๋ฌ๋๊ฐ\n\nํ์์คํฌํ๋ UTC๋ก ์ ์ฅํ์ธ์. ๋ฌด์กฐ๊ฑด. ๊ทธ๋ค์ ๊ด๋ฆฌ์ UI์์๋ ๋ทฐ์ด์ ๋ก์ปฌ ์๊ฐ์ผ๋ก ํ์ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒํ ์ค์ "๋ ์ฌ๋์ด ์๋ก ๋ค๋ฅธ ์๊ฐ์ ๋ดค๋ค"๋ ๋
ผ์์ ํผํ ์ ์์ต๋๋ค.\n\n์ญํ ๋ณ๊ฒฝ, ํ๋ถ, ๋ฐ์ดํฐ ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ ๊ณ ์ํ ์์
์ด ์์ผ๋ฉด "reason" ํ๋๋ฅผ ์ถ๊ฐํ์ธ์. "ํฐ์ผ 1842์์ ๋งค๋์ ๊ฐ ์น์ธ" ๊ฐ์ ์งง์ ๋ฉ๋ชจ๋ ๊ฐ์ฌ ํ์ ์ ๋จ์ํ ๋ก๊ทธ์์ ์ฆ๊ฑฐ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.\n\n## ๋ฐ์ดํฐ ๋ชจ๋ธ ์ ํ: ์ด๋ฒคํธ ๋ก๊ทธ vs ๋ฒ์ ์ด๋ ฅ\n\n์ฒซ ๋ฒ์งธ ์ค๊ณ ์ ํ์ ๋ณ๊ฒฝ ์ด๋ ฅ์ "์ง์ค"์ด ์ด๋์ ์๋๋์
๋๋ค. ๋๋ถ๋ถ์ ํ์ ๋ ๊ฐ์ง ๋ชจ๋ธ ์ค ํ๋๋ฅผ ์ ํํฉ๋๋ค: append-only ์ด๋ฒคํธ ๋ก๊ทธ ๋๋ ์ํฐํฐ๋ณ ๋ฒ์ ์ด๋ ฅ ํ
์ด๋ธ.\n\n### ์ต์
1: ์ด๋ฒคํธ ๋ก๊ทธ(append-only actions ํ
์ด๋ธ)\n\n์ด๋ฒคํธ ๋ก๊ทธ๋ ๋ชจ๋ ๋์์ ์๋ก์ด ํ์ผ๋ก ๊ธฐ๋กํ๋ ๋จ์ผ ํ
์ด๋ธ์
๋๋ค. ๊ฐ ํ์ ๋๊ฐ ํ๋์ง, ์ธ์ ์ผ์ด๋ฌ๋์ง, ์ด๋ค ์ํฐํฐ์ ์ํฅ์ ๋ฏธ์ณค๋์ง, ๊ทธ๋ฆฌ๊ณ ์ข
์ข
JSON ํํ์ ํ์ด๋ก๋๋ก ๋ณ๊ฒฝ ๋ด์ฉ์ ์ ์ฅํฉ๋๋ค.\n\n์ด ๋ชจ๋ธ์ ์ถ๊ฐํ๊ธฐ ๊ฐ๋จํ๊ณ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๋ฐ์ ํด๋ ์ ์ฐํฉ๋๋ค. ๋ํ ํ๋ ํผ๋์ ์์ฐ์ค๋ฝ๊ฒ ๋งคํ๋ฉ๋๋ค. ํผ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก "์ต์ ์ด๋ฒคํธ ์ฐ์ "์ด๊ธฐ ๋๋ฌธ์
๋๋ค.\n\n### ์ต์
2: ๋ฒ์ ์ด๋ ฅ(์ํฐํฐ๋ณ ๋ฒ์ )\n\n๋ฒ์ ์ด๋ ฅ ๋ฐฉ์์ Order_history๋ User_versions์ฒ๋ผ ์ํฐํฐ๋ณ ์ด๋ ฅ ํ
์ด๋ธ์ ๋ง๋ค์ด, ๊ฐ ์
๋ฐ์ดํธ๋ง๋ค ์ ์ฒด ์ค๋
์ท(๋๋ ๊ตฌ์กฐํ๋ ๋ณ๊ฒฝ ํ๋ ์งํฉ)์ ๋ฒ์ ๋ฒํธ์ ํจ๊ป ์ ์ฅํฉ๋๋ค.\n\n์ด ๋ฐฉ์์ ํน์ ์์ ์ ๋ณด๊ณ (์: "์ด ๋ ์ฝ๋๋ ์ง๋ ํ์์ผ์ ์ด๋ป๊ฒ ๋ณด์๋?")๋ฅผ ์ฝ๊ฒ ํ๊ณ , ๊ฐ ๋ ์ฝ๋์ ํ์๋ผ์ธ์ด ์์ฒด์ ์ผ๋ก ํฌํจ๋์ด ์์ด ๊ฐ์ฌ์์๊ฒ ๋ ๋ช
ํํ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค.\n\n์ค์ฉ์ ์ ํ ๊ฐ์ด๋:\n\n- ํ ๊ณณ์์ ๊ฒ์ํ๊ณ ์ถ๊ณ ํ๋ ํผ๋๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ ํํ์ธ์.\n- ๋ ์ฝ๋๋ณ ์์ ๋ทฐ๊ฐ ์์ฃผ ํ์ํ๋ค๋ฉด ๋ฒ์ ์ด๋ ฅ์ ์ ํํ์ธ์.\n- ์ ์ฅ ์ฉ๋์ด ๋ฌธ์ ๋ผ๋ฉด ํ๋ ์์ค์ diff๊ฐ ์๋ ์ด๋ฒคํธ ๋ก๊ทธ๊ฐ ์ ์ฒด ์ค๋
์ท๋ณด๋ค ๋ณดํต ๊ฐ๋ณ์ต๋๋ค.\n- ๋ณด๊ณ ๊ฐ ์ฃผ๋ชฉ์ ์ด๋ผ๋ฉด ๋ฒ์ ํ
์ด๋ธ์ด ์ด๋ฒคํธ ํ์ด๋ก๋๋ฅผ ํ์ฑํ๋ ๊ฒ๋ณด๋ค ์ฟผ๋ฆฌํ๊ธฐ ์ฌ์ธ ์ ์์ต๋๋ค.\n\n์ด๋ค ๋ชจ๋ธ์ ํํ๋ ๊ฐ์ฌ ํญ๋ชฉ์ ๋ถ๋ณ(immutable)์ผ๋ก ์ ์งํ์ธ์: ์
๋ฐ์ดํธ๋ ์ญ์ ์์. ๋ญ๊ฐ ์๋ชป๋์๋ค๋ฉด ์ ์ ์ฌ์ค์ ์ค๋ช
ํ๋ ์ ํญ๋ชฉ์ ์ถ๊ฐํ์ธ์.\n\n๋ํ correlation_id(๋๋ operation id) ์ถ๊ฐ๋ฅผ ๊ณ ๋ คํ์ธ์. ํ ์ฌ์ฉ์ ์ก์
์ด ์ฌ๋ฌ ๋ณ๊ฒฝ์ ์ด๋ฐํ๋ ๊ฒฝ์ฐ(์: "์ฌ์ฉ์ ๋นํ์ฑํ"๊ฐ ์ฌ์ฉ์ ์
๋ฐ์ดํธ, ์ธ์
ํด์ , ๋๊ธฐ ์ค ์์
์ทจ์๋ฅผ ๋์์ ๋ฐ์์ํฌ ์ ์์) ๊ณต์ ๋ correlation id๋ก ํด๋น ํ๋ค์ ํ๋์ ์ฝ๊ธฐ ์ฌ์ด ์์
์ผ๋ก ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.\n\n## ์ญ์ ์ ๋๋ ํธ์ง์ ํฌํจํด CRUD ๋์์ ์ ๋ขฐ์ฑ ์๊ฒ ์บก์ฒํ๊ธฐ\n\n์ ๋ขฐ์ฑ ์๋ ๊ฐ์ฌ ๋ก๊น
์ ๊ท์น ํ๋๋: ๋ชจ๋ ์ฐ๊ธฐ๋ ๊ฐ์ฌ ์ด๋ฒคํธ๋ ์์ฑํ๋ ๋จ์ผ ๊ฒฝ๋ก๋ฅผ ํตํด ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ์ผ๋ถ ์
๋ฐ์ดํธ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
, ์ํฌํธ, ๋น ๋ฅธ ํธ์ง ํ๋ฉด์ ํตํด ์ ์ ์ ์ฅ ํ๋ฆ์ ์ฐํํ๋ฉด ๋ก๊ทธ์ ๊ตฌ๋ฉ์ด ์๊น๋๋ค.\n\n์์ฑ์ ๊ฒฝ์ฐ ํ์์์ ์ถ์ฒ(UI, API, ์ํฌํธ)๋ฅผ ๊ธฐ๋กํ์ธ์. ์ํฌํธ๋ ๋๊ฐ ํ๋์ง๋ฅผ ์์ฃผ ์๋ ๊ณณ์ด๋ฏ๋ก, ํ์ผ์ด๋ ํตํฉ์์ ์๋๋ผ๋ ๋ช
์์ "performed by" ๊ฐ์ ์ ์ฅํ์ธ์. ๋ํ ์ด๊ธฐ ๊ฐ(์ ์ฒด ์ค๋
์ท ๋๋ ํต์ฌ ํ๋ ์งํฉ)์ ์ ์ฅํด ๊ทธ ๋ ์ฝ๋๊ฐ ์ ์กด์ฌํ๋์ง ์ค๋ช
ํ ์ ์๊ฒ ํ์ธ์.\n\n์
๋ฐ์ดํธ๋ ๋ ๊น๋ค๋กญ์ต๋๋ค. ๋ณ๊ฒฝ๋ ํ๋๋ง ๊ธฐ๋กํ ์ ์๊ณ (์๊ณ ์ฝ๊ธฐ ์ฌ์, ๋น ๋ฆ), ๋๋ ๊ฐ ์ ์ฅ ํ ์ ์ฒด ์ค๋
์ท์ ๋ณด๊ดํ ์ ์์ต๋๋ค(๋์ค์ ์ฟผ๋ฆฌํ๊ธฐ ๊ฐ๋จํ์ง๋ง ๋ฌด๊ฒ๋ค). ์ค์ฉ์ ์ค๊ฐ ๋ฐฉ๋ฒ์ ์ผ๋ฐ ํธ์ง์๋ diff๋ฅผ ์ ์ฅํ๊ณ , ๊ถํ, ์ํ ์ ๋ณด, ๊ฐ๊ฒฉ ๊ท์น ๊ฐ์ ๋ฏผ๊ฐ ๊ฐ์ฒด์ ๋ํด์๋ง ์ค๋
์ท์ ๋ณด๊ดํ๋ ๊ฒ์
๋๋ค.\n\n์ญ์ ๋ ์ฆ๊ฑฐ๋ฅผ ์ง์ฐ๋ฉด ์ ๋ฉ๋๋ค. ์ํํธ ์ญ์ (is_deleted ํ๋๊ทธ + ๊ฐ์ฌ ํญ๋ชฉ)๋ฅผ ์ ํธํ์ธ์. ํ๋ ์ญ์ ๊ฐ ํ์ํ๋ฉด ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ๋จผ์ ๊ธฐ๋กํ๊ณ ๋ ์ฝ๋์ ์ค๋
์ท์ ํฌํจํด ๋ฌด์์ด ์ ๊ฑฐ๋์๋์ง ์ฆ๋ช
ํ ์ ์๊ฒ ํ์ธ์.\n\n๋ณต์์ ์์ฒด ํ๋์ผ๋ก ์ทจ๊ธํ์ธ์. "Restore"๋ "Update"์ ๊ฐ์ง ์์ผ๋ฉฐ, ๋ถ๋ฆฌํ๋ฉด ๊ฒํ ์ ์ปดํ๋ผ์ด์ธ์ค ๊ฒ์ฆ์ด ํจ์ฌ ์ฌ์์ง๋๋ค.\n\n๋๋ ํธ์ง์ ๊ฒฝ์ฐ "500๊ฐ ๋ ์ฝ๋ ์
๋ฐ์ดํธ" ๊ฐ์ ๋ชจํธํ ๋จ์ผ ํญ๋ชฉ์ ํผํ์ธ์. ๋์ค์ "์ด๋ค ๋ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋?"์ ๋ตํ ์ ์์ ๋งํผ์ ์ธ๋ถ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค. ์ค์ฉ์ ํจํด์ ์์ ์ด๋ฒคํธ(parent event)์ ๋ ์ฝ๋๋ณ ์์ ์ด๋ฒคํธ(child events)๋ฅผ ํจ๊ป ๊ธฐ๋กํ๋ ๊ฒ์
๋๋ค:\n\n- ์์ ์ด๋ฒคํธ: ํ์์, ์ฌ์ฉํ ๋๊ตฌ/ํ๋ฉด, ์ฌ์ฉํ ํํฐ, ๋ฐฐ์น ํฌ๊ธฐ\n- ๋ ์ฝ๋๋ณ ์์ ์ด๋ฒคํธ: ๋ ์ฝ๋ ID, before/after(๋๋ ๋ณ๊ฒฝ๋ ํ๋), ๊ฒฐ๊ณผ(success/fail)\n- ์ ํ์ : ๊ณตํต๋ ์ด์ (reason) ํ๋(์ ์ฑ
์
๋ฐ์ดํธ, ์ ๋ฆฌ, ๋ง์ด๊ทธ๋ ์ด์
)\n\n์: ์ง์ ๋ฆฌ๋๊ฐ 120๊ฐ์ ํฐ์ผ์ ์ผ๊ด ์ข
๋ฃํฉ๋๋ค. ์์ ํญ๋ชฉ์ ํํฐ(์: status=open, older than 30 days)๋ฅผ ์บก์ฒํ๊ณ ๊ฐ ํฐ์ผ์ ์ํ open -> closed๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ ํญ๋ชฉ์ ๊ฐ์ง๋๋ค.\n\n## ์ ์ฅ ๊ณต๊ฐ๊ณผ ๊ฐ์ธ์ ๋ณด ๋ฌธ์ ์์ด ๋ณ๊ฒฝ ๋ด์ฉ์ ์ ์ฅํ๊ธฐ\n\n๊ฐ์ฌ ๋ก๊ทธ๋ ๋๋ฌด ๋ง์ ๊ฒ(์ ์ฒด ๋ ์ฝ๋ ์๊ตฌ ์ ์ฅ) ๋๋ ๋๋ฌด ์ ์ ๊ฒ(๋จ์ง "์ฌ์ฉ์ ํธ์ง") ๋ ์ค ํ๋๊ฐ ๋๋ฉด ๊ธ๋ฐฉ ์ธ๋ชจ์์ด์ง๋๋ค. ๋ชฉํ๋ ์ปดํ๋ผ์ด์ธ์ค์ ๋ฐฉ์ด์ ์ด๊ณ ๊ด๋ฆฌ์๊ฐ ์ฝ๊ธฐ ์ฌ์ด ๊ธฐ๋ก์ ๋ง๋๋ ๊ฒ์
๋๋ค.\n\n์ค์ฉ์ ๊ธฐ๋ณธ๊ฐ์ ๋๋ถ๋ถ์ ์
๋ฐ์ดํธ์ ๋ํด ํ๋ ์์ค์ diff๋ฅผ ์ ์ฅํ๋ ๊ฒ์
๋๋ค. ๋ณ๊ฒฝ๋ ํ๋๋ง, before์ after ๊ฐ์ ์ ์ฅํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฅ ๊ณต๊ฐ์ ์ค์ด๊ณ ํ๋ ํผ๋๋ฅผ ์ค์บํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค: "Status: Pending -> Approved"๋ ๊ฑฐ๋ํ ๋ธ๋กญ๋ณด๋ค ํจ์ฌ ๋ช
ํํฉ๋๋ค.\n\n์ค์ ์๊ฐ(์์ฑ, ์ญ์ , ์ฃผ์ ์ํฌํ๋ก ์ ํ)์ ๋ํด ์ ์ฒด ์ค๋
์ท์ ๋ณด๊ดํ์ธ์. ์ค๋
์ท์ ๋ฌด๊ฒ์ง๋ง "์ญ์ ๋๊ธฐ ์ ๊ณ ๊ฐ ํ๋กํ์ด ์ ํํ ์ด๋ ๋?"๋ผ๋ ์ง๋ฌธ์ ๋๋นํ ์ ์๊ฒ ํฉ๋๋ค.\n\n๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๋ง์คํน ๊ท์น์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ์ฌ ํ
์ด๋ธ์ด ๋น๋ฐ๋ก ๊ฐ๋ํ ๋ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฉ๋๋ค. ์ผ๋ฐ ๊ท์น:\n\n- ๋น๋ฐ๋ฒํธ, API ํ ํฐ, ๊ฐ์ธ ํค๋ ์ ๋ ์ ์ฅํ์ง ๋ง์ธ์(๋จ์ํ "๋ณ๊ฒฝ๋จ"์ผ๋ก ๊ธฐ๋ก)\n- ์ด๋ฉ์ผ/์ ํ ๋ฒํธ ๊ฐ์ ๊ฐ์ธ ๋ฐ์ดํฐ๋ ๋ถ๋ถ ๋ง์คํนํ๊ฑฐ๋ ํด์๋ก ์ ์ฅํ์ธ์\n- ๋ฉ๋ชจ๋ ์์ ํ
์คํธ ํ๋๋ ์งง์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ "๋ณ๊ฒฝ๋จ" ํ๋๊ทธ๋ฅผ ์ ์ฅํ์ธ์\n- ๊ด๋ จ ๊ฐ์ฒด ์ ์ฒด๋ฅผ ๋ณต์ฌํ์ง ๋ง๊ณ ์ฐธ์กฐ(user_id, order_id)๋ฅผ ๊ธฐ๋กํ์ธ์\n\n์คํค๋ง ๋ณ๊ฒฝ๋ ๊ฐ์ฌ ์ด๋ ฅ์ ๋ง์น ์ ์์ต๋๋ค. ํ๋๊ฐ ๋์ค์ ์ด๋ฆ์ด ๋ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋ฉด "unknown field" ๊ฐ์ ์์ ํ ํด๋ฐฑ๊ณผ ์๋ ํ๋ ํค๋ฅผ ์ ์ฅํ์ธ์. ์ญ์ ๋ ํ๋๋ ๋ง์ง๋ง ์๋ ค์ง ๊ฐ์ ๋ณด๊ดํ๋ "schema์์ ์ ๊ฑฐ๋ ํ๋"๋ก ํ์ํด ํผ๋์ ์ ์ง์ฑ์ ์ ์งํ์ธ์.\n\n๋ง์ง๋ง์ผ๋ก ํญ๋ชฉ์ ์ฌ๋์ด ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋์ธ์. ์์ ํค(assignee_id) ์์ ํ์์ฉ ๋ ์ด๋ธ("ํ ๋น์")์ ์ ์ฅํ๊ณ ๊ฐ(date, ํตํ, ์ํ ์ด๋ฆ)์ ํ์ํํ์ธ์.\n\n## ๋จ๊ณ๋ณ ํจํด: ์ฑ ํ๋ฆ์ ๊ฐ์ฌ ๋ก๊น
๊ตฌํํ๊ธฐ\n\n์ ๋ขฐํ ์ ์๋ ๊ฐ์ฌ ์ถ์ ์ ๋ ๋ง์ด ๋ก๊ทธํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋์๋ ๋ฐ๋ณต ๊ฐ๋ฅํ ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ผ ๋๋ ์ํฌํธ๊ฐ ๊ธฐ๋ก๋์ง ์์๋ค๊ฑฐ๋ ๋ชจ๋ฐ์ผ ํธ์ง์ด ์ต๋ช
์ฒ๋ผ ๋ณด์ด๋ ๊ตฌ๋ฉ์ ํผํ ์ ์์ต๋๋ค.\n\n### 1) ๊ฐ์ฌ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํ ๋ฒ ์ ์ํ์ธ์\n\n๋ฐ์ดํฐ ๋ชจ๋ธ์์ ์์ํด ์ด๋ค ๋ณ๊ฒฝ๋ ์ค๋ช
ํ ์ ์๋ ์์ ํ
์ด๋ธ ์งํฉ์ ๋ง๋์ธ์.\n\n๋จ์ํ๊ฒ ์ ์งํ์ธ์: ์ด๋ฒคํธ์ฉ ํ ํ
์ด๋ธ, ๋ณ๊ฒฝ๋ ํ๋์ฉ ํ๋, ๊ทธ๋ฆฌ๊ณ ์์ ํ์์ ์ปจํ
์คํธ.\n\n- audit_event: id, entity_type, entity_id, action(create/update/delete/restore), created_at, request_id\n- audit_event_item: id, audit_event_id, field_name, old_value, new_value\n- actor_context(๋๋ audit_event์ ํ๋๋ค): actor_type(user/system), actor_id, actor_email, ip, user_agent\n\n### 2) ํ๋์ ๊ณต์ ๋ "์ฐ๊ธฐ + ๊ฐ์ฌ(Write + Audit)" ํ์ ํ๋ก์ธ์ค๋ฅผ ์ถ๊ฐํ์ธ์\n\n์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค์ด์:\n\n1) ์ํฐํฐ ์ด๋ฆ, ์ํฐํฐ ID, ์ก์
, before/after ๊ฐ์ ๋ฐ์ต๋๋ค.\n2) ๋น์ฆ๋์ค ๋ณ๊ฒฝ์ ๋ฉ์ธ ํ
์ด๋ธ์ ์๋๋ค.\n3) audit_event ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.\n4) ๋ณ๊ฒฝ๋ ํ๋๋ฅผ ๊ณ์ฐํด audit_event_item ํ์ ์ฝ์
ํฉ๋๋ค.\n\n๊ท์น์ ์๊ฒฉํฉ๋๋ค: ๋ชจ๋ ์ฐ๊ธฐ ๊ฒฝ๋ก๋ ์ด ๋์ผํ ํ์ ํ๋ก์ธ์ค๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ UI ๋ฒํผ, API ์๋ํฌ์ธํธ, ์์ฝ ์๋ํ, ํตํฉ์ด ๋ชจ๋ ํฌํจ๋ฉ๋๋ค.\n\n### 3) ์๋ฒ์์ ํ์์์ ์๊ฐ์ ์์ฑํ์ธ์\n\n๋ธ๋ผ์ฐ์ ๋ฅผ "๋๊ฐ"์ "์ธ์ "๋ก ์ ๋ขฐํ์ง ๋ง์ธ์. ์ธ์ฆ ์ธ์
์์ ํ์์๋ฅผ ์ฝ๊ณ , ํ์์คํฌํ๋ ์๋ฒ ์ธก์์ ์์ฑํ์ธ์. ๋ง์ฝ ์๋ํ๊ฐ ์คํ๋๋ฉด actor_type์ system์ผ๋ก ์ค์ ํ๊ณ ์์
์ด๋ฆ์ ํ์์ ๋ ์ด๋ธ๋ก ์ ์ฅํ์ธ์.\n\n### 4) ํ๋์ ๊ตฌ์ฒด์ ์๋๋ฆฌ์ค๋ก ํ
์คํธํ์ธ์\n\n๋จ์ผ ๋ ์ฝ๋(์: ๊ณ ๊ฐ ํฐ์ผ)๋ฅผ ๊ณจ๋ผ ์์ฑ, ๋ ํ๋(status์ assignee) ํธ์ง, ์ญ์ , ๋ณต์์ ํด๋ณด์ธ์. ๊ฐ์ฌ ํผ๋์๋ ๋ค์ฏ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ณด์ฌ์ผ ํ๊ณ , ํธ์ง ์ด๋ฒคํธ ์๋์๋ ๋ ๊ฐ์ ์
๋ฐ์ดํธ ํญ๋ชฉ์ด ์์ผ๋ฉฐ, ํ์์์ ํ์์คํฌํ๊ฐ ๋งค๋ฒ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฑ์์ ธ์ผ ํฉ๋๋ค.\n\n## ์ฌ๋์ด ์ค์ ๋ก ์ฌ์ฉํ ์ ์๋ ๊ด๋ฆฌ์ ํ๋ ํผ๋ ๊ตฌ์ถ\n\n๊ฐ์ฌ ๋ก๊ทธ๋ ๋๊ตฐ๊ฐ ๋น ๋ฅด๊ฒ ์ฝ์ ์ ์์ด์ผ๋ง ์ ์ฉํฉ๋๋ค. ๊ด๋ฆฌ์ ํผ๋์ ๋ชฉํ๋ ๊ฐ๋จํฉ๋๋ค: ํ๋์ "๋ฌด์จ ์ผ์ด ์์๋?"๋ฅผ ๋ตํ๊ณ , ์ํ ๋ ์์ JSON์ ๋น ์ ธ๋ค์ง ์๊ณ ๋ ๊น์ด ๋ณผ ์ ์๊ฒ ํ๋ ๊ฒ์
๋๋ค.\n\nํ์๋ผ์ธ ๋ ์ด์์์ผ๋ก ์์ํ์ธ์: ์ต์ ์, ์ด๋ฒคํธ๋น ํ ์ค, ๊ทธ๋ฆฌ๊ณ Created, Updated, Deleted, Restored ๊ฐ์ ๋ช
ํํ ๋์ฌ ์ฌ์ฉ. ๊ฐ ํ์ ํ์์(์ฌ๋ ๋๋ ์์คํ
), ๋์(๋ ์ฝ๋ ์ ํ + ์ฌ๋์ด ์ดํดํ๊ธฐ ์ฌ์ด ์ด๋ฆ), ์๊ฐ ํ์๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.\n\n์ค์ฉ์ ํ ํฌ๋งท:\n\n- ๋์ฌ + ๊ฐ์ฒด: "Updated Customer: Acme Co."\n- ํ์์: "Maya (Support)" ๋๋ "System: Nightly Sync"\n- ์๊ฐ: ์ ๋ ํ์์คํฌํ(ํ์์กด ํฌํจ)\n- ๋ณ๊ฒฝ ์์ฝ: "status: Pending -> Approved, limit: 5,000 -> 7,500"\n- ํ๊ทธ: Updated, Deleted, Integration, Job\n\n"๋ฌด์์ด ๋ฐ๋์๋"๋ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ์ธ์. ์ธ๋ผ์ธ์ผ๋ก 13๊ฐ ํ๋๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ๋๋ฆด๋ค์ด ํจ๋(๋๋ก์ด/๋ชจ๋ฌ)์์ ์ ์ฒด ์ธ๋ถ์ ๋ณด(before/after ๊ฐ, ์์ฒญ ์ถ์ฒ, ์ด์ /์ฝ๋ฉํธ)๋ฅผ ๋ณผ ์ ์๊ฒ ํ์ธ์.\n\nํํฐ๋ง์ ์ฒซ ์ฃผ๊ฐ ์ง๋๋ฉด ํผ๋๋ฅผ ์ ์ฉํ๊ฒ ๋ง๋๋ ํต์ฌ์
๋๋ค. ์ค์ ์ง๋ฌธ์ ๋ง๋ ํํฐ์ ์ง์คํ์ธ์:\n\n- ํ์์(์ฌ์ฉ์ ๋๋ ์์คํ
)\n- ๊ฐ์ฒด ์ ํ(Customers, Orders, Permissions ๋ฑ)\n- ์ก์
์ ํ(Create/Update/Delete/Restore)\n- ๋ ์ง ๋ฒ์\n- ํ
์คํธ ๊ฒ์(๋ ์ฝ๋ ์ด๋ฆ ๋๋ ID)\n\n์ฐ๊ฒฐ(๋งํฌ)์ ๊ถํ์ด ํ์ฉ๋ ๋๋ง ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ทฐ์ด๊ฐ ํด๋น ๋ ์ฝ๋์ ์ ๊ทผํ ์ ์๋ค๋ฉด "View record" ๋์์ ๋ณด์ฌ์ฃผ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ์์ ํ ์๋ฆฌํ์์(์: "Restricted record")๋ฅผ ํ์ํด๋ ๊ฐ์ฌ ํญ๋ชฉ์ ๊ทธ๋๋ก ๋ณด์ด๊ฒ ํ์ธ์.\n\n์์คํ
์์
์ ๋ช
ํํ ํ์ํ์ธ์. ์์ฝ ์์
๊ณผ ํตํฉ์ ๊ตฌ๋ถํด์ ๊ด๋ฆฌ์๋ค์ด "Dana๊ฐ ์ญ์ ํ๋๊ฐ"์ "Nightly billing sync๊ฐ ์
๋ฐ์ดํธํ๋๊ฐ"๋ฅผ ํ๋์ ๊ตฌ๋ถํ ์ ์๊ฒ ํ์ธ์.\n\n## ๊ฐ์ฌ ๋ฐ์ดํฐ์ ๋ํ ๊ถํ๊ณผ ๊ฐ์ธ์ ๋ณด ๊ท์น\n\n๊ฐ์ฌ ๋ก๊ทธ๋ ์ฆ๊ฑฐ์ด๊ธฐ๋ ํ์ง๋ง ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ด๊ธฐ๋ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์์์ ๋ณ๋์ ์ ํ์ฒ๋ผ ์ทจ๊ธํ์ธ์: ๋ช
ํํ ์ ๊ทผ ๊ท์น, ๋ช
ํํ ์ ํ, ๊ฐ์ธ์ ๋ณด์ ์ ์คํ ์ฒ๋ฆฌ.\n\n๋๊ฐ ๋ฌด์์ ๋ณผ ์ ์๋์ง ๊ฒฐ์ ํ์ธ์. ์ผ๋ฐ์ ์ธ ๋ถํ ์์๋: ์์คํ
๊ด๋ฆฌ์์๊ฒ๋ ์ ์ฒด ์ ๊ทผ์ ํ์ฉ, ๋ถ์ ๋งค๋์ ๋ ์์ ์ ํ ์ด๋ฒคํธ๋ง, ๋ ์ฝ๋ ์์ ์๋ ์์ ์ด ์ด๋ฏธ ์ ๊ทผํ ์ ์๋ ๋ ์ฝ๋์ ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ๋ง ๋ณด๊ธฐ, ๊ฐ์ฌ/์ปดํ๋ผ์ด์ธ์ค๋ ์ฝ๊ธฐ ์ ์ฉ์ ๋ด๋ณด๋ด๊ธฐ ํ์ฉ, ๊ธฐํ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ทผ ๊ธ์ง ๋ฑ์
๋๋ค. ํ๋ ํผ๋๋ฅผ ๋
ธ์ถํ๋ค๋ฉด ์คํฌ๋ฆฐ๋ฟ ์๋๋ผ ๋ชจ๋ ํ์ ๋์ผํ ๊ท์น์ ์ ์ฉํ์ธ์.\n\n๋ฉํฐํ
๋ํธ๋ ๊ต์ฐจ ๋ถ์ ๋๊ตฌ์์๋ ํ ์์ค ๊ฐ์์ฑ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๊ฐ์ฌ ํ
์ด๋ธ์ ๋น์ฆ๋์ค ๋ฐ์ดํฐ์ ๋์ผํ ์ค์ฝํ ํค(tenant_id, department_id, project_id)๋ฅผ ๊ฐ์ ธ์ผ ์ผ๊ด๋๊ฒ ํํฐ๋งํ ์ ์์ต๋๋ค. ์: ์ง์ ๋งค๋์ ๋ ์์ ์ ํ์ ์๋ ํฐ์ผ ๋ณ๊ฒฝ์ ๋ณผ ์ ์์ง๋ง HR์ ๊ธ์ฌ ์กฐ์ ์ ๋ณผ ์ ์์ด์ผ ํฉ๋๋ค.\n\n์ค์ฉ์ ์ ์ฑ
์์:\n\n- Admin: ํ
๋ํธ ๋ฐ ๋ถ์ ์ ์ฒด ์ ๊ทผ ๊ฐ๋ฅ\n- Manager: department_id ๋๋ project_id๋ก ์ ํ๋ ๊ฐ์ฌ ์ ๊ทผ\n- Record owner: ์์ ์ด ๋ณผ ์ ์๋ ๋ ์ฝ๋์ ํํด ์ ๊ทผ\n- Auditor/compliance: ์ฝ๊ธฐ ์ ์ฉ, ๋ด๋ณด๋ด๊ธฐ ํ์ฉ, ํธ์ง ๊ธ์ง\n- ๊ธฐํ: ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ทผ ๊ธ์ง\n\n๊ฐ์ธ์ ๋ณด๋ ๋ ๋ฒ์งธ ์ ๋ฐ์
๋๋ค. ๋ฌด์จ ์ผ์ด ์์๋์ง๋ฅผ ์ฆ๋ช
ํ ๋งํผ์ ์ ์ฅํ๋ ๋ก๊ทธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณต์ฌ๋ณธ์ด ๋์ง ์๋๋ก ํ์ธ์. SSN, ์๋ฃ ๋
ธํธ, ๊ฒฐ์ ์ ๋ณด ๊ฐ์ ๋ฏผ๊ฐ ํ๋๋ ์ญ์ ๋๋ ๋ง์คํน์ ์ ํธํ์ธ์. ์๋ฅผ ๋ค์ด ์ด๋ฉ์ผ ๋ณ๊ฒฝ์ ์ค์ ๊ฐ์ ๋ง์คํนํด ๊ธฐ๋กํ๊ฑฐ๋ ๊ฒ์ฆ์ฉ ํด์๋ฅผ ์ ์ฅํ์ธ์.\n\n๋ณด์ ์ด๋ฒคํธ๋ ๋น์ฆ๋์ค ๋ ์ฝ๋ ๋ณ๊ฒฝ๊ณผ ๋ถ๋ฆฌํ์ธ์. ๋ก๊ทธ์ธ ์๋, MFA ์ฌ์ค์ , API ํค ์์ฑ, ์ญํ ๋ณ๊ฒฝ ๋ฑ์ ๋ ์๊ฒฉํ ์ ๊ทผ๊ณผ ๋ ๊ธด ๋ณด์กด ๊ธฐ๊ฐ์ ๊ฐ์ง security_audit ์คํธ๋ฆผ์ผ๋ก ๋ณด๋ด๊ณ , ๋น์ฆ๋์ค ํธ์ง(status ์
๋ฐ์ดํธ, ์น์ธ, ์ํฌํ๋ก ๋ณ๊ฒฝ)์ ์ผ๋ฐ ๊ฐ์ฌ ์คํธ๋ฆผ์ ๋๋ ๊ฒ ์ข์ต๋๋ค.\n\n๋๊ตฐ๊ฐ ๊ฐ์ธ ๋ฐ์ดํฐ ์ญ์ ๋ฅผ ์์ฒญํ๋ฉด ์ ์ฒด ๊ฐ์ฌ ์ถ์ ์ ์ง์ฐ์ง ๋ง์ธ์. ๋์ :\n\n- ์ฌ์ฉ์ ํ๋กํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ต๋ช
ํ\n- ๋ก๊ทธ์ ํ์์ ์๋ณ์๋ ์์ ์ ๊ฐ๋ช
(์: "deleted-user-123")์ผ๋ก ๋์ฒด\n- ๊ฐ์ธ ๋ฐ์ดํฐ๋ก ์ ์ฅ๋ ํ๋ ๊ฐ์ ํธ์ง(๋ ๋์ก์
)\n- ์ปดํ๋ผ์ด์ธ์ค๋ฅผ ์ํด ํ์์คํฌํ, ์ก์
์ ํ, ๋ ์ฝ๋ ์ฐธ์กฐ๋ ๋ณด๊ด\n\n## ๋ณด์กด, ๋ฌด๊ฒฐ์ฑ, ์ฑ๋ฅ(์ปดํ๋ผ์ด์ธ์ค ๊ด์ )\n\n์ ์ฉํ ๊ฐ์ฌ ๋ก๊ทธ๋ ๋จ์ํ "์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ๋ค"์ ๊ทธ์น์ง ์์ต๋๋ค. ์ปดํ๋ผ์ด์ธ์ค์์๋ ์ธ ๊ฐ์ง๋ฅผ ์ฆ๋ช
ํด์ผ ํฉ๋๋ค: ๋ฐ์ดํฐ๋ฅผ ์ถฉ๋ถํ ์ค๋ ๋ณด๊ดํ๋์ง, ์ฌํ์ ๋ณ๊ฒฝ๋์ง ์์๋์ง, ์์ฒญ ์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋์ง์
๋๋ค.\n\n### ๋ณด์กด: ์ค๋ช
ํ ์ ์๋ ์ ์ฑ
์ ์ ํ์ธ์\n\n์ํ ์์ค์ ๋ง๋ ๋จ์ํ ๊ท์น์ผ๋ก ์์ํ์ธ์. ๋ง์ ํ์ ์ผ์ ๋ฌธ์ ํด๊ฒฐ์ ์ํด 90์ผ, ๋ด๋ถ ์ปดํ๋ผ์ด์ธ์ค๋ฅผ ์ํด 13๋
, ๊ท์ ๊ฐ ์๋ ๋ ์ฝ๋์ ๋ํด์๋ง ๋ ์ค๋ ๋ณด๊ดํ๋ ๋ฐฉ์์ ์ ํํฉ๋๋ค. ์ธ์ ์นด์ดํธ๊ฐ ๋ฆฌ์
๋๋์ง(๋ณดํต: ์ด๋ฒคํธ ์๊ฐ)์ ์ ์ธ ํญ๋ชฉ(์: ๋ณด๊ดํ๋ฉด ์ ๋๋ ํ๋๋ฅผ ํฌํจํ ๋ก๊ทธ)์ ๋ฌธ์ํํ์ธ์.\n\nํ๊ฒฝ๋ณ๋ก ๋ณด์กด ๊ธฐ๊ฐ์ ๋ค๋ฅด๊ฒ ์ค์ ํ์ธ์. ํ๋ก๋์
๋ก๊ทธ๋ ๋ณดํต ๊ฐ์ฅ ๊ธธ๊ฒ ๋ณด์กดํด์ผ ํ๊ณ , ํ
์คํธ ๋ก๊ทธ๋ ๊ฑฐ์ ๋ณด๊ดํ ํ์๊ฐ ์์ต๋๋ค.\n\n### ๋ฌด๊ฒฐ์ฑ: ๋ณ์กฐ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋์ธ์\n\n๊ฐ์ฌ ๋ก๊ทธ๋ฅผ append-only๋ก ์ทจ๊ธํ์ธ์. ํ์ ์
๋ฐ์ดํธํ๊ฑฐ๋ ์ผ๋ฐ ๊ด๋ฆฌ์๊ฐ ์ญ์ ํ์ง ๋ชปํ๊ฒ ํ์ธ์. ์ญ์ ๊ฐ ์ ๋ง ํ์ํ๋ฉด(๋ฒ์ ์์ฒญ, ๋ฐ์ดํฐ ์ ๋ฆฌ) ๊ทธ ์์
์์ฒด๋ ๋ณ๋์ ์ด๋ฒคํธ๋ก ๊ธฐ๋กํ์ธ์.\n\n์ค์ฉ์ ํจํด:\n\n- ์๋ฒ๋ง ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ณ ํด๋ผ์ด์ธํธ๋ ์ฐ์ง ์์\n- ์ผ๋ฐ ์ญํ ์๊ฒ๋ ๊ฐ์ฌ ํ
์ด๋ธ์ ๋ํ UPDATE/DELETE ๊ถํ ์์\n- ๋๋ฌผ๊ฒ ์ ๋ฆฌ ์์
์ ์ํ ๋ณ๋์ "break glass" ์ญํ ์กด์ฌ\n- ์ฃผ๊ธฐ์ ์ธ ๋ด๋ณด๋ด๊ธฐ ์ค๋
์ท์ ๋ฉ์ธ ์ฑ DB ์ธ๋ถ์ ์ ์ฅ\n\n### ๋ด๋ณด๋ด๊ธฐ, ์ฑ๋ฅ, ๋ชจ๋ํฐ๋ง\n\n๊ฐ์ฌ์๋ ์ข
์ข
CSV๋ JSON์ ์์ฒญํฉ๋๋ค. ๋ ์ง ๋ฒ์์ ๊ฐ์ฒด ์ ํ(์: Invoice, User, Ticket)์ผ๋ก ํํฐ๋งํด ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๊ณํํ์ธ์. ๊ทธ๋์ผ ๊ฐ์ฅ ๋ฐ์ ์๊ฐ์ DB๋ฅผ ์์์
์ผ๋ก ์ฟผ๋ฆฌํ์ง ์๊ฒ ๋ฉ๋๋ค.\n\n์ฑ๋ฅ์ ์ํด ๊ฒ์ ํจํด์ ๋ง์ถฐ ์ธ๋ฑ์คํ์ธ์:\n\n- created_at (์๊ฐ ๋ฒ์ ์ฟผ๋ฆฌ)\n- object_type + object_id (๋จ์ผ ๋ ์ฝ๋์ ์ ์ฒด ์ด๋ ฅ)\n- actor_id (๋๊ฐ ๋ฌด์จ ์ผ์ ํ๋์ง)\n\n๋ฌด์ ์คํจ(silent failure)๋ฅผ ์ฃผ์ํ์ธ์. ๊ฐ์ฌ ์์ฑ์ด ์คํจํ๋ฉด ์ฆ๊ฑฐ๋ฅผ ์๊ฒ ๋์ง๋ง ์ข
์ข
์์ง ๋ชปํฉ๋๋ค. ๊ฐ๋จํ ์๋ฆผ์ ์ถ๊ฐํ์ธ์: ์ฑ์ด ์ฐ๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ๊ฐ์ฌ ์ด๋ฒคํธ๊ฐ ์ผ์ ๊ธฐ๊ฐ 0์ผ๋ก ๋จ์ด์ง๋ฉด ์์ ์์๊ฒ ์๋ฆฌ๊ณ ์ค๋ฅ๋ฅผ ํฌ๊ฒ ๊ธฐ๋กํฉ๋๋ค.\n\n## ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ๋ฌด์ฉ์ง๋ฌผ๋ก ๋ง๋๋ ํํ ์ค์๋ค\n\n๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์๊ฐ์ ๋ญ๋นํ๋ ๋ฐฉ๋ฒ์ ์ค์ ์ง๋ฌธ(๋๊ฐ, ๋ฌด์์, ์ธ์ , ์ด๋์)์ ๋ตํ์ง ๋ชปํ๋ ๋ง์ ํ์ ์์งํ๋ ๊ฒ์
๋๋ค.\n\nํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋ฆฌ๊ฑฐ๋ง ๋ฏฟ๋ ํจ์ ์
๋๋ค. ํธ๋ฆฌ๊ฑฐ๋ ํ์ด ๋ฐ๋์๋ค๋ ๊ฒ์ ๊ธฐ๋กํ ์ ์์ง๋ง ๋น์ฆ๋์ค ์ปจํ
์คํธ(์ฌ์ฉ์๊ฐ ์ด๋ค ํ๋ฉด์ ์ฌ์ฉํ๋์ง, ์ด๋ค ์์ฒญ์ด ์์ธ์ธ์ง, ์ด๋ค ์ญํ ์ ๊ฐ์ก๋์ง, ์ ์ ํธ์ง์ธ์ง ์๋ ๊ท์น์ธ์ง)๋ ์์ฃผ ๋์นฉ๋๋ค.\n\n๊ฐ์ฅ ์์ฃผ ์ปดํ๋ผ์ด์ธ์ค์ ์ฌ์ฉ์ฑ์ ๋ง์น๋ ์ค์๋ค:\n\n- ๋น๋ฐ๋ฒํธ ์ฌ์ค์ , ํ ํฐ, ๊ฐ์ธ ๋
ธํธ ๊ฐ์ ๋ฏผ๊ฐ ํ์ด๋ก๋๋ฅผ ์ ์ฒด ๊ธฐ๋กํ๋ ๊ฒ ๋์ ์ต์ํ์ diff์ ์์ ํ ์๋ณ์๋ฅผ ๊ธฐ๋กํ์ง ์์\n- ํ์คํ ๋ฆฌ๋ฅผ "์์ "ํ๋ ค๊ณ ๊ฐ์ฌ ๊ธฐ๋ก์ ํธ์ง ๋๋ ์ญ์ ํ ์ ์๊ฒ ๋๋ ๊ฒ\n- CSV ์ํฌํธ, ํตํฉ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
๊ฐ์ ๋นUI ์ฐ๊ธฐ ๊ฒฝ๋ก๋ฅผ ์๋ ๊ฒ\n- "Updated", "Edit", "Change", "Modify"์ฒ๋ผ ์ผ๊ด์ฑ ์๋ ์ก์
์ด๋ฆ์ ์ฌ์ฉํด ํผ๋๊ฐ ๋์กํด์ง๋ ๊ฒ\n- ๋ณ๊ฒฝ ์ ๊ฐ์ฒด ID๋ง ๊ธฐ๋กํ๊ณ ๋น์์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๊ฐ์ฒด ์ด๋ฆ์ ๊ธฐ๋กํ์ง ์๋ ๊ฒ(์ด๋ฆ์ ๋์ค์ ๋ฐ๋ ์ ์์)\n\n์ด๋ฒคํธ ์ฉ์ด์ง์ ์ผ์ฐ ํ์คํํ์ธ์(์: user.created, user.updated, invoice.voided, access.granted) ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ฐ๊ธฐ ๊ฒฝ๋ก๊ฐ ํ๋์ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๋๋ก ์๊ตฌํ์ธ์. ๊ฐ์ฌ ๋ฐ์ดํฐ๋ ์ฐ๊ธฐ-ํ๋ฒ(write-once)์ผ๋ก ์ทจ๊ธํ์ธ์: ๋๊ตฐ๊ฐ ์๋ชป ๋ณ๊ฒฝํ๋ค๋ฉด ํ์คํ ๋ฆฌ๋ฅผ ๋ค์ ์ฐ์ง ๋ง๊ณ ์ ์ ์ ์ก์
์ ๊ธฐ๋กํ์ธ์.\n\n## ๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ ๋ฐ ๋ค์ ๋จ๊ณ\n\n์๋ฃ๋ผ ๋ถ๋ฅด๊ธฐ ์ ์ ๋ช ๊ฐ์ง ๋น ๋ฅธ ๊ฒ์ฌ๋ฅผ ํ์ธ์. ์ข์ ๊ฐ์ฌ ๋ก๊ทธ๋ ์ต๊ณ ์ ์๋ฏธ์์ ์ง๋ฃจํฉ๋๋ค: ์์ ํ๊ณ , ์ผ๊ด๋๋ฉฐ, ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค.\n\nํ
์คํธ ํ๊ฒฝ์์ ํ์ค์ ์ธ ๋ฐ์ดํฐ๋ก ๋ค์์ ํ์ธํ์ธ์:\n\n- ๋ชจ๋ ์์ฑ, ์
๋ฐ์ดํธ, ์ญ์ , ๋ณต์, ๋๋ ํธ์ง์ ์ํฅ์ ๋ฐ๋ ๊ฐ ๋ ์ฝ๋์ ๋ํด ์ ํํ ํ๋์ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ฑ(๋๋ฝ ์์, ์ค๋ณต ์์)\n- ๋ชจ๋ ์ด๋ฒคํธ์ ํ์์(์ฌ์ฉ์ ๋๋ ์์คํ
), ํ์์คํฌํ(UTC), ์ก์
, ์์ ๋ ๊ฐ์ฒด ์ฐธ์กฐ(ํ์
+ ID)๊ฐ ํฌํจ๋จ\n- "๋ฌด์์ด ๋ณ๊ฒฝ๋๋" ๋ทฐ๋ ์ฝ๊ธฐ ์ฌ์: ํ๋ ์ด๋ฆ์ด ๋ช
ํํ๊ณ old/new ๊ฐ์ด ํ์๋๋ฉฐ ๋ฏผ๊ฐ ํ๋๋ ๋ง์คํน ๋๋ ์์ฝ๋จ\n- ๊ด๋ฆฌ์๋ ์๊ฐ ๋ฒ์, ํ์์, ์ก์
, ๊ฐ์ฒด๋ก ํ๋ ํผ๋๋ฅผ ํํฐ๋งํ๊ณ ๊ฒํ ๋ฅผ ์ํด ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ผ ์ ์์\n- ๋ก๊ทธ๋ ๋ณ์กฐํ๊ธฐ ์ด๋ ต๊ฒ ์ค๊ณ๋จ: ๋๋ถ๋ถ ์ญํ ์ ๋ํด ์ฐ๊ธฐ ์ ์ฉ์ด๊ณ , ๊ฐ์ฌ ๋ก๊ทธ ์์ฒด์ ๋ณ๊ฒฝ์ ์ฐจ๋จ๋๊ฑฐ๋ ๋ณ๋๋ก ๊ฐ์ฌ๋จ\n\n๋ด๋ถ ๋๊ตฌ๋ฅผ AppMaster (appmaster.io)๋ก ๊ตฌ์ถํ๋ค๋ฉด, UI ์ก์
, API ์๋ํฌ์ธํธ, ์ํฌํธ, ์๋ํ๋ฅผ ๋์ผํ Business Process ํจํด์ ํตํด ๋ผ์ฐํ
ํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ๋์ผํ ํ๋ฆ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋์ด๋ ์ค์ฉ์ ๋ฐฉ๋ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ฉด๊ณผ ์ํฌํ๋ก๊ฐ ๋ฐ๋์ด๋ CRUD ๊ฐ์ฌ ์ถ์ ์ด ์ผ๊ด๋๊ฒ ์ ์ง๋ฉ๋๋ค.\n\nํ๋์ ์ค์ํ ์ํฌํ๋ก(ํฐ์ผ, ์น์ธ, ์ฒญ๊ตฌ ๋ณ๊ฒฝ ๋ฑ)๋ก ์๊ฒ ์์ํด ํ๋ ํผ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ , ๋ชจ๋ ์ฐ๊ธฐ ๊ฒฝ๋ก๊ฐ ์์ธก ๊ฐ๋ฅํ๊ณ ๊ฒ์ ๊ฐ๋ฅํ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ผ ๋๊น์ง ํ์ฅํ์ธ์.
security_audit ์คํธ๋ฆผ์ผ๋ก ๋ณด๋ด๊ณ , ๋น์ฆ๋์ค ํธ์ง(status ์
๋ฐ์ดํธ, ์น์ธ, ์ํฌํ๋ก ๋ณ๊ฒฝ)์ ์ผ๋ฐ ๊ฐ์ฌ ์คํธ๋ฆผ์ ๋๋ ๊ฒ ์ข์ต๋๋ค.\n\n๋๊ตฐ๊ฐ ๊ฐ์ธ ๋ฐ์ดํฐ ์ญ์ ๋ฅผ ์์ฒญํ๋ฉด ์ ์ฒด ๊ฐ์ฌ ์ถ์ ์ ์ง์ฐ์ง ๋ง์ธ์. ๋์ :\n\n- ์ฌ์ฉ์ ํ๋กํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ต๋ช
ํ\n- ๋ก๊ทธ์ ํ์์ ์๋ณ์๋ ์์ ์ ๊ฐ๋ช
(์: "deleted-user-123")์ผ๋ก ๋์ฒด\n- ๊ฐ์ธ ๋ฐ์ดํฐ๋ก ์ ์ฅ๋ ํ๋ ๊ฐ์ ํธ์ง(๋ ๋์ก์
)\n- ์ปดํ๋ผ์ด์ธ์ค๋ฅผ ์ํด ํ์์คํฌํ, ์ก์
์ ํ, ๋ ์ฝ๋ ์ฐธ์กฐ๋ ๋ณด๊ด\n\n## ๋ณด์กด, ๋ฌด๊ฒฐ์ฑ, ์ฑ๋ฅ(์ปดํ๋ผ์ด์ธ์ค ๊ด์ )\n\n์ ์ฉํ ๊ฐ์ฌ ๋ก๊ทธ๋ ๋จ์ํ "์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ๋ค"์ ๊ทธ์น์ง ์์ต๋๋ค. ์ปดํ๋ผ์ด์ธ์ค์์๋ ์ธ ๊ฐ์ง๋ฅผ ์ฆ๋ช
ํด์ผ ํฉ๋๋ค: ๋ฐ์ดํฐ๋ฅผ ์ถฉ๋ถํ ์ค๋ ๋ณด๊ดํ๋์ง, ์ฌํ์ ๋ณ๊ฒฝ๋์ง ์์๋์ง, ์์ฒญ ์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋์ง์
๋๋ค.\n\n### ๋ณด์กด: ์ค๋ช
ํ ์ ์๋ ์ ์ฑ
์ ์ ํ์ธ์\n\n์ํ ์์ค์ ๋ง๋ ๋จ์ํ ๊ท์น์ผ๋ก ์์ํ์ธ์. ๋ง์ ํ์ ์ผ์ ๋ฌธ์ ํด๊ฒฐ์ ์ํด 90์ผ, ๋ด๋ถ ์ปดํ๋ผ์ด์ธ์ค๋ฅผ ์ํด 1์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋ด๋ถ ๋๊ตฌ๊ฐ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด ๊ฐ๋ฅํ ๋นจ๋ฆฌ ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ์ธ์. ์ฒซ ๋ถ์์ด๋ ๊ฐ์ฌ ์๊ตฌ๋ ๋ณดํต ์์๋ณด๋ค ๋นจ๋ฆฌ ์ต๋๋ค. ๋์ค์ ๊ณผ๊ฑฐ ์ด๋ ฅ์ ์ฑ์ฐ๋ ค ํ๋ฉด ๋๋ถ๋ถ ์ถ์ธก์ ์์กดํ๊ฒ ๋ฉ๋๋ค.
์ ์ฉํ ๊ฐ์ฌ ๋ก๊ทธ๋ ๋๊ฐ ํ๋์ง, ์ด๋ค ๋ ์ฝ๋์ ์ํฅ์ ์คฌ๋์ง, ๋ฌด์์ด ๋ณ๊ฒฝ๋๋์ง, ์ธ์ ์ผ์ด๋ฌ๋์ง, ์ด๋์ ์๋์ง(UI, API, ์ํฌํธ, ์์ ๋ฑ)๋ฅผ ๋น ๋ฅด๊ฒ ๋ตํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด ์ค ํ๋๋ผ๋ ๋น ๋ฅด๊ฒ ๋ตํ ์ ์๋ค๋ฉด ๋ก๊ทธ๋ ์ ๋ขฐ๋ฐ๊ธฐ ์ด๋ ต์ต๋๋ค.
๋๋ฒ๊ทธ ๋ก๊ทธ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ฒ์ด๋ฉฐ ์ข ์ข ์๋๋ฝ๊ณ ์ผ๊ด์ฑ์ด ์์ต๋๋ค. ๊ฐ์ฌ ๋ก๊ทธ๋ ์ฑ ์์ฑ์ ์ํ ๊ฒ์ผ๋ก, ์ผ๊ด๋ ํ๋, ๋ช ํํ ๋ฌธ๊ตฌ, ๋น๊ธฐ์ ์๋ ์ฝ์ ์ ์๋ ์์ ๋ ํ์์ด ํ์ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ณด์ด๋ ํธ์ง์ ๋ก๊ทธ์ ๋จ์ง๋ง, ํ์ค ํธ์ง ํ๋ฉด ๋ฐ์์ ๋ฐ์ํ๋ ๋ณ๊ฒฝ(๋๋ ํธ์ง, ์ํฌํธ, ์์ฝ ์์ , ๊ด๋ฆฌ์ ๋จ์ถ ์์ , ์ญ์ ๋ฑ)์ด ๋๋ฝ๋ ๋ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์คํจํฉ๋๋ค. ์ด๋ฌํ ๋นํ์ค ๊ฒฝ๋ก๋ฅผ ๋์น์ง ์๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
ํ์์ ์ ํ๊ณผ ์๋ณ์๋ฅผ ์ ์ฅํ์ธ์. ๋จ์ํ ์ฌ์ฉ์ ID๋ง ๊ธฐ๋กํ๋ฉด ์ง์๊ณผ ์์คํ
์์
, ์๋น์ค ๊ณ์ , ์ธ๋ถ ํตํฉ์ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ๊ทธ๋์ actor_type๊ณผ actor_id๋ฅผ ํจ๊ป ๊ธฐ๋กํ๋ฉด ๋๊ฐ ํ๋์ง ๋ช
ํํด์ง๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ํ์์คํฌํ๋ฅผ UTC๋ก ์ ์ฅํ๊ณ , ๊ด๋ฆฌ์ UI์์๋ ๋ทฐ์ด ๋ก์ปฌ ์๊ฐ์ผ๋ก ํ์ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒํ ์ค์ ๋ฐ์ํ๋ ์๊ฐ๋ ํผ๋์ ํผํ ์ ์์ต๋๋ค.
๊ฒ์์ ํ ๊ณณ์์ ํ๊ณ ํ๋ ํผ๋๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด append-only ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์. ํน์ ๋ ์ฝ๋์ ์์ ๋ณ ๋ทฐ๊ฐ ์์ฃผ ํ์ํ๋ค๋ฉด ๋ฒ์ ์ด๋ ฅ(per-entity version)์ ์ ํํ์ธ์. ๋ง์ ์ฑ์์๋ ํ๋ ์์ค์ diff๋ฅผ ๊ฐ์ถ ์ด๋ฒคํธ ๋ก๊ทธ๊ฐ ์ ์ฅ ๊ณต๊ฐ ์ธก๋ฉด์์ ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ฆ๊ฑฐ๋ฅผ ์ง์ฐ์ง ์์ผ๋ ค๋ฉด ์ํํธ ์ญ์ ๋ฅผ ์ ํธํ์ธ์(is_deleted ํ๋๊ทธ์ ๊ฐ์ฌ ํญ๋ชฉ). ํ๋ ์ญ์ ๊ฐ ๋ฐ๋์ ํ์ํ๋ค๋ฉด ๋จผ์ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ๊ณ ์ญ์ ๋ ๋ ์ฝ๋์ ์ค๋
์ท์ ํฌํจํ์ธ์.
์ ๋ฐ์ดํธ๋ ๋๋ถ๋ถ ํ๋ ์์ค์ diff๋ฅผ ์ ์ฅํ๊ณ , ์์ฑ ๋๋ ์ญ์ ๊ฐ์ ์ค์ํ ์๊ฐ์๋ ์ ์ฒด ์ค๋ ์ท์ ๋ณด๊ดํ๋ ๊ฒ์ด ์ค์ฉ์ ์ ๋๋ค. ๋ฏผ๊ฐํ ํ๋๋ ๋ณ๊ฒฝ๋ง ๊ธฐ๋กํ๊ณ ์ค์ ๊ฐ์ ์ ์ฅํ์ง ์๊ฑฐ๋ ๋ง์คํนํ์ธ์.
๋ชจ๋ ์ฐ๊ธฐ ๊ฒฝ๋ก๊ฐ ์ค์ ๋ก ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋๋ก ํ๋์ ๊ณต์ ๋ "์ฐ๊ธฐ + ๊ฐ์ฌ(Write + Audit)" ๊ฒฝ๋ก๋ฅผ ๋ง๋์ธ์. UI, API, ์ํฌํธ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ฑ ๋ชจ๋ ์ฐ๊ธฐ ์์ ์ด ์ด ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ฒ ๊ฐ์ ํ๋ฉด ๋๋ฝ์ด ์ค์ด๋ญ๋๋ค.


