๊ด๋ฆฌ์ ํจ๋์ ํ๋๋ณ ๋ณ๊ฒฝ ์ด๋ ฅ UX
๊ด๋ฆฌ์ ํจ๋์ ํ๋๋ณ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋น ๋ฅด๊ฒ ํ์ธํ๊ณ ํํฐ๋งํ๋ฉฐ ๋ณต์ํ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค. ๋ณ๊ฒฝ(diff), ์ด๋ฒคํธ, ์์ ์ ์ํ UX ๋ฐ ์คํค๋ง ํจํด.

์ ๊ด๋ฆฌ์ ํจ๋์์ ๋ณ๊ฒฝ ์ด๋ ฅ์ด ๋ฌด์๋๋๊ฐ
๋๋ถ๋ถ์ ๊ด๋ฆฌ์ ์ฌ์ฉ์๊ฐ ์ด๋ ฅ์ ๋ฌด์ํ๋ ์ด์ ๋ ๊ด์ฌ์ด ์์ด์๊ฐ ์๋๋๋ค. ์์ก์ ๋ณด์(์ ๋ณด)์ ๋นํด ๋๋ฌด ๋ง์ ์ฃผ์๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ณ ๊ฐ์ด ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ฃผ๋ฌธ์ด ๋ฉ์ถฐ ์์ ๋ ๋๊ฐ ๊ธด ํ์์ "updated" ์ด๋ฒคํธ ๋ชฉ๋ก์ ์ฝ์ ์ฌ์ ๊ฐ ์๊ฒ ์ต๋๊น.
์ฝ๊ธฐ ์ฌ์ด ํ๋ ๋จ์ ๋ณ๊ฒฝ ์ด๋ ฅ์ ์ฌ๋๋ค์ด ์ด๋ฏธ ๊ฐ์ง ์ง๋ฌธ์ ๋ตํ ๋ ์๋ฆฌ๋ฅผ ์ฐจ์งํฉ๋๋ค:
- ๋๊ฐ ๋ณ๊ฒฝํ๋๊ฐ(๊ทธ๋ฆฌ๊ณ ํ์ํ๋ค๋ฉด ์ด๋์ ํ๋๊ฐ)
- ๋ฌด์์ด ๋ณ๊ฒฝ๋์๋๊ฐ(ํ๋ ์ด๋ฆ๊ณผ ์ด์ /์ดํ)
- ์ธ์ ๋ฐ์ํ๋๊ฐ(์ด๋ค ์๊ฐ๋์ธ์ง ํฌํจ)
- ์ ๋ณ๊ฒฝ๋์๋๊ฐ(์ด์ , ํฐ์ผ, ์๋ํ ์ด๋ฆ ๋๋ ํํธ)
๋๋ถ๋ถ์ ๋ก๊ทธ๋ ์ ์ด๋ ํ ๊ฐ์ง๋ ์คํจํฉ๋๋ค. ํํ ์คํจ ๋ชจ๋๋ ๋ ธ์ด์ฆ์ ๋๋ค: ์ ์ฅํ ๋๋ง๋ค 20๊ฐ์ ํญ๋ชฉ์ด ์๊ธฐ๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ๋งค๋ถ ๋ฌดํดํ ํ์์คํฌํ๋ฅผ ์ ์ผ๋ฉฐ, ์์คํ ํ๋ก์ธ์ค๊ฐ ์ฌ๋์ ํ๋์ฒ๋ผ ๋ณด์ ๋๋ค. diff๋ ์ข ์ข ๋ชจํธํ๊ธฐ๋ ํฉ๋๋ค. "status changed"๋ ๋ณด์ด์ง๋ง "Pending -> Approved"์ฒ๋ผ ๊ตฌ์ฒด์ ์ด์ง ์๊ฑฐ๋, JSON ๋ฉ์ด๋ฆฌ๋ง ์๊ณ ์ด๋๋ฅผ ๋ด์ผ ํ ์ง ๋จ์๊ฐ ์๊ธฐ๋ ํฉ๋๋ค.
๋ฌธ๋งฅ์ด ๋น ์ง๋ฉด ๋์ ๋๋ค. ์ด๋ค ์ํฌํ๋ก์ฐ๊ฐ ๋ณ๊ฒฝ์ ํธ๋ฆฌ๊ฑฐํ๋์ง, ์๋์ธ์ง ์๋ํ์ธ์ง, ๋ ํ๋๊ฐ ํจ๊ป ๋ฐ๋ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์์ธก ๊ฐ๋ฅํฉ๋๋ค. ํ์ ๊ฐ์ฌ ์ถ์ ์ ์ ๋ขฐํ์ง ์๊ฒ ๋๊ณ ์ถ์ธกํ๊ฑฐ๋ ์ฌ๋์๊ฒ ๋ฌป๊ฑฐ๋ ์์ ์ ๋ค์ ํ๊ฒ ๋ฉ๋๋ค. ๋ณต์ ์์ ์ด ์ถ๊ฐ๋๋ฉด ์ํ์ด ์ปค์ง๋๋ค.
์ข์ ์ด๋ ฅ์ ์ง์ ์๊ฐ์ ์ค์ด๊ณ ๋ฐ๋ณต ์ค์๋ฅผ ๋ง์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋น ๋ฅด๊ฒ ์ด์ /์ดํ๋ฅผ ํ์ธํ ์ ์์ด ๋ณต์์ด ์์ ํ๋ค๊ณ ๋๋ผ๊ฒ ํฉ๋๋ค. ๊ฐ์ฌ UI๋ฅผ ๋๋ฒ๊ทธ ํ๋ฉด์ผ๋ก ์ทจ๊ธํ์ง ๋ง๊ณ , ์๋ฐ ์์์ ์ค์บํ๊ธฐ ์ฝ๊ฒ ์ค๊ณํ์ธ์.
ํ ์ผ์ ๊ธฐ์ค์ผ๋ก ์์ํ์ธ์
์ฝ๊ธฐ ์ฌ์ด ์ด๋ ฅ์ ํ ๊ฐ์ง ๊ฒฐ์ ์์ ์์ํฉ๋๋ค: ๋ฌด์ธ๊ฐ ์๋ชป๋์์ ๋ ๋๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ. "๋ชจ๋"๋ ์ญํ ์ด ์๋๋๋ค. ๋ง์ ๊ด๋ฆฌ์ ํจ๋์์ ๊ฐ์ ๊ฐ์ฌ ๋ทฐ๊ฐ ์ง์, ์ด์, ๊ด๋ฆฌ์์๊ฒ ๊ฐ์ ๋ก ์ ๊ณต๋๋ฉฐ ๊ฒฐ๊ตญ ๋๊ตฌ์๊ฒ๋ ๋์์ด ๋์ง ์์ต๋๋ค.
์ฃผ์ ์ฌ์ฉ์๋ฅผ ์ ํ๊ณ ๊ทธ๋ค์ด ์ด๋ค ์ ๋ณด๋ฅผ ์ป์ด์ผ ๋ ๋๋์ง ์ ์ํ์ธ์:
- ์ง์ํ์ ๊ณ ๊ฐ์๊ฒ ์ค๋ช ํ ์ ์๋ ๋ช ํํ ์ด์ผ๊ธฐ๊ฐ ํ์ํฉ๋๋ค.
- ์ด์ํ์ ํจํด์ ๋น ๋ฅด๊ฒ ์ฐพ์ ํ๋ก์ธ์ค ์ค์๋ฅผ ์ก์๋ด์ผ ํฉ๋๋ค.
- ์ฌ๋ฌดํ์ ์น์ธ, ํ๋ถ, ์ฐจ์ง๋ฐฑ ์ฆ๊ฑฐ๊ฐ ํ์ํฉ๋๋ค.
- ๊ด๋ฆฌ์๋ ์ธ๋ถ์ฌํญ์ ๋น ์ง์ง ์๋ ์ฑ ์ ์์ฌ๊ฐ ํ์ํฉ๋๋ค.
์ด๋ ฅ์ด ์ง์ํด์ผ ํ ์ฃผ์ ์์ ์ ์ ์ํ์ธ์:
- ๋ฌด์์ด, ์ธ์ , ๋๊ฐ ๋ณ๊ฒฝํ๋์ง ์กฐ์ฌํ๊ธฐ
- ๊ณ ๊ฐ์ด๋ ๋๋ฃ์๊ฒ ํ์ดํ ์ธ์ด๋ก ๋ณ๊ฒฝ์ ์ค๋ช ํ๊ธฐ
- ์ค์๋ฅผ ์์ ํ๊ฒ ๋๋๋ฆฌ๊ธฐ(์ด์ ๊ฐ ๋ณต์)
- ์ปดํ๋ผ์ด์ธ์ค์ ๊ฐ์ฌ๋ฅผ ์ํด ์ฆ๊ฑฐ๋ฅผ ๋ด๋ณด๋ด๊ฑฐ๋ ๋ณด๊ดํ๊ธฐ
๋ค์์ผ๋ก ๋ฌด์์ ์ถ์ ํ ์ง ๊ฒฐ์ ํ๊ณ ๋ช ํํ ํ์ธ์. ๊ฒฌ๊ณ ํ ํ๋ ๋จ์ ์ด๋ ฅ์๋ ๋ณดํต ํ๋ ํธ์ง, ์ํ ์ ํ, ์ฃผ์ ์ํฌํ๋ก์ฐ ์์ (์: "approved", "locked", "refunded")์ด ํฌํจ๋ฉ๋๋ค. ๋ง์ ํ์ ํ์ผ ์ ๋ก๋/์ญ์ , ๊ถํ ๋ณ๊ฒฝ, ํตํฉ์ผ๋ก ์ธํ ์ ๋ฐ์ดํธ๋ ํฌํจํฉ๋๋ค. ์ด๋ค ๊ฒ์ ์ถ์ ํ์ง ์์ผ๋ฉด ์ฌ์ฉ์๋ ์์คํ ์ด ์จ๊ธฐ๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ณต์ ๊ท์น์ ๋ฏธ๋ฆฌ ์ ์ํ์ธ์. ๋ณต์์ ์์ ํ๊ณ ์๋ฏธ ์์ ๋๋ง ํ์ฉํด์ผ ํฉ๋๋ค. ๋ฐฐ์ก ์ฃผ์ ๋ณต์์ ๊ด์ฐฎ์ ์ ์์ง๋ง, ์ง๊ธ์ด ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํ์๋ "paid" ์ํ ๋ณต์์ ์ฐจ๋จํ ์ ์์ต๋๋ค. UI์ ์ฐจ๋จ ์ด์ ๋ฅผ ๋ช ์ํ์ธ์("๋ณต์ ๋ถ๊ฐ: ์ด๋ฏธ ํ๋ถ ์ฒ๋ฆฌ๋จ").
๊ฐ๋จํ ์๋๋ฆฌ์ค: ๊ณ ๊ฐ์ด ํ๋์ด ๋ณธ์ธ ๋์ ์์ด ๋ค์ด๊ทธ๋ ์ด๋๋์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ง์ํ์ ๋๊ฐ(์์ด์ ํธ, ๊ณ ๊ฐ, ์๋ ๊ฒฐ์ ๊ท์น)๊ฐ ํ๋์ง, ๋ณต์์ด ๊ฐ๋ฅํ์ง ํ์ธํด์ผ ํฉ๋๋ค. ๊ทธ ์ด์ผ๊ธฐ์ ๋ง์ถฐ ์ค๊ณํ๋ฉด UI ๊ฒฐ์ ์ด ํจ์ฌ ์ฌ์์ง๋๋ค.
๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์ํ ๋ฐ์ดํฐ ๋ชจ๋ธ ํจํด
๋ฐ์ดํฐ ๋ชจ๋ธ์ด ์ง์ ๋ถํ๋ฉด ์ด๋ ฅ๋ ์ง์ ๋ถํด์ง๋๋ค. UI๋ ๊ทธ ๋ค์ ๊ธฐ๋ก๋ค๋งํผ๋ง ๋ช ํํ ์ ์์ต๋๋ค.
์ด๋ฒคํธ vs ์ค๋ ์ท
์ด๋ฒคํธ ๋ชจ๋ธ์ ๋ณ๊ฒฝ๋ ๊ฒ(ํ๋, ์ด์ , ์ดํ)๋ง ์ ์ฅํฉ๋๋ค. ์ค๋ ์ท ๋ชจ๋ธ์ ๊ฐ ํธ์ง ํ ์ ์ฒด ๋ ์ฝ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ด๋ฆฌ์ ํจ๋์์๋ ํ์ด๋ธ๋ฆฌ๋๊ฐ ๊ฐ์ฅ ์ค์ฉ์ ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค: ์ด๋ฒคํธ๋ฅผ ์ง์ค์ ์ถ์ฒ๋ก ๋๊ณ , ๋น ๋ฅธ ๋ณด๊ธฐ๋ ๋ณต์์ ์ํด ๊ฐ๋ฒผ์ด ์ค๋ ์ท์ ์ ํ์ ์ผ๋ก ์ ์ฅํ์ธ์.
์ด๋ฒคํธ๋ ๋ฌด์์ด, ๋๊ฐ, ์ธ์ ๋ณ๊ฒฝํ๋์ง๋ฅผ ๋ตํฉ๋๋ค. ์ค๋ ์ท์ ์ฌ์ฉ์๊ฐ "์๊ฐ X์ ์ํ"๋ฅผ ๋น ๋ฅด๊ฒ ๋ด์ผ ํ๊ฑฐ๋ ์ฌ๋ฌ ํ๋๋ฅผ ํจ๊ป ๋ณต์ํด์ผ ํ ๋ ๋์์ด ๋ฉ๋๋ค.
์ต์ํ์ผ๋ก ๊ธฐ๋กํด์ผ ํ ํญ๋ชฉ
๊ฐ ๋ณ๊ฒฝ ๊ธฐ๋ก์ ์๊ฒ ์ ์งํ๋ ๋์ค์ ์ค์ค๋ก ์ค๋ช ํ ์ ์์ ๋งํผ ์์ ํด์ผ ํฉ๋๋ค. ์ค์ฉ์ ์ธ ์ต์ ํญ๋ชฉ:
- actor_id (๋ฐ user, system, integration ๊ฐ์ actor_type)
- occurred_at (UTC ํ์์คํฌํ)
- entity_type + entity_id (๋ฌด์์ด ํธ์ง๋์๋๊ฐ)
- field_key (ํ์ ๋ผ๋ฒจ์ด ์๋ ์์ ์ ์ธ ํค)
- before_value + after_value (ํ ์คํธ๋ JSON์ผ๋ก ์ ์ฅ, plus data_type)
"์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ๋?"์ ๋ตํ๋ ค๋ฉด ์ ํ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ์ธ์. ์งง์ ์ฝ๋ฉํธ๋ฉด ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ๊ตฌ์กฐํ๋ ์ฐธ์กฐ(ํฐ์ผ ID, workflow_run_id, import_batch_id, ์๋ํ ์ด์ ๋ฑ)๊ฐ ์์ผ๋ฉด ๋ ์ข์ต๋๋ค.
๋ค์ค ํ๋ ํธ์ง์ change set์ผ๋ก ๋ฌถ๊ธฐ
์ฌ๋๋ค์ ๋๋ฌผ๊ฒ ํ ํ๋๋ง ์๊ฐํฉ๋๋ค. ๋ณดํต์ "๊ณ ๊ฐ ์ฃผ์๋ฅผ ์ ๋ฐ์ดํธํ๋ค"๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ๋ค์ฏ ๊ฐ์ ํ๋๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ change_set_id๋ก ๋ชจ๋ธ๋งํ์ธ์.
๊ฐ๋จํ ํจํด:
- ์ ์ฅ ๋์๋ง๋ค ํ๋์ change_set ํ
- ์ฌ๋ฌ field_change ํ์ด ๊ทธ change_set๋ฅผ ๊ฐ๋ฆฌํด
- change_set์ ๊ณตํต๋ ์ด์ /์ฝ๋ฉํธ๋ฅผ ์ ์ฅ(ํ๋๋ง๋ค ๋ฐ๋ณตํ์ง ์์)
์ด๋ ๊ฒ ํ๋ฉด UI๋ ์ ์ฅ๋ง๋ค ํ๋์ ์ฝ๊ธฐ ์ฌ์ด ํญ๋ชฉ์ ํ์ํ๊ณ , ํ์ฅ ์ต์ ์ผ๋ก ๊ฐ ํ๋์ diff๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
์ฌ๋๋ค์ด ๋น ๋ฅด๊ฒ ์ค์บํ ์ ์๋ ๋ ์ด์์ ํจํด
์ข์ ์ด๋ ฅ์ ์ง๋ฌธ์ด ๋ฐ์ํ๋ ๊ณณ์ ์์ด์ผ ํฉ๋๋ค: ๋ ์ฝ๋ ์์ธ ํ๋ฉด. "History" ํญ์ "Details", "Notes" ์์ ๋๋ฉด ์ฌ๋๋ค์ด ์ปจํ ์คํธ๋ฅผ ์์ง ์๊ณ ๋ฌด์์ด ๋ณ๊ฒฝ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ณ๋์ ๊ฐ์ฌ ํ์ด์ง๋ ํ์ํ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด "์ด์ Kim์ด ๋ณ๊ฒฝํ ๋ชจ๋ ๊ฐ๊ฒฉ ๋ณ๊ฒฝ์ ๋ณด์ฌ์ค"์ฒ๋ผ ๋ ์ฝ๋ ๊ฐ ๊ฒ์์ด ํ์ํ๊ฑฐ๋ ๊ฐ์ฌ์๊ฐ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ํ์๋ก ํ ๋์ ๋๋ค. ์ผ์์ ์ธ ์ง์๊ณผ ์ด์ ์์ ์๋ ๋ ์ฝ๋ ๋จ์ ์ด๋ ฅ์ด ๋ ์ ํฉํฉ๋๋ค.
๊ธฐ๋ณธ ๋ทฐ๋ ํ๋์ ๋ค ๊ฐ์ง ์ง๋ฌธ์ ๋ตํด์ผ ํฉ๋๋ค: ๋ฌด์์ด ๋ณ๊ฒฝ๋์๋๊ฐ, ๋๊ฐ ๋ณ๊ฒฝํ๋๊ฐ, ์ธ์ ์๋๊ฐ, ๋ ํฐ ํธ์ง์ ์ผ๋ถ์๋๊ฐ. ์ต์ ์ ์ ๋ ฌ์ ๊ธฐ๋๋๋ ๋์์ด์ง๋ง ํธ์ง ์ธ์ ๋ณ๋ก ๊ทธ๋ฃนํํ๋ฉด ์ฝ๊ธฐ ์ฌ์์ง๋๋ค: ์ ์ฅ ๋์๋ณ๋ก ํ๋์ ํญ๋ชฉ, ๊ทธ ์์ ๋ณ๊ฒฝ๋ ํ๋๋ค.
์ค์บ ์๋๋ฅผ ์ ์งํ๋ ค๋ฉด ๋ณ๊ฒฝ๋ ๊ฒ๋ง ๋ณด์ฌ์ฃผ์ธ์. ๋ ์ฝ๋ ์ ์ฒด๋ฅผ ์ฌ์ถ๋ ฅํ๋ฉด ์ด๋ ฅ์ด ์ก์์ด ๋๊ณ ์ค์ ํธ์ง์ ์ฐพ๊ธฐ ์ด๋ ค์์ง๋๋ค.
๊ฐ๊ฒฐํ ์ด๋ฒคํธ ์นด๋๊ฐ ํํ ์ ์๋ํฉ๋๋ค:
- ํค๋: ์ด๋ฆ(๋๋ ์์คํ ๋ผ๋ฒจ)๊ณผ ์ ํํ ํ์์คํฌํ
- ์ถ์ฒ ๋ผ๋ฒจ: ์๋ ํธ์ง, ์ํฌํธ, API, ์๋ํ
- ๋ณ๊ฒฝ๋ ํ๋: ํ๋๋ณ ํ ์ค, ์ด์ ๋ฐ ์ดํ ๊ฐ
- ๊ธด ํ ์คํธ๋ "๋ ๋ณด๊ธฐ"๋ก ์จ๊ธฐ๊ธฐ
- ์ค์ํ ํ๋(pin): ์ํ, ๋ด๋น์, ๊ฐ๊ฒฉ ๋ฑ ์๋จ ๊ณ ์
"๋๊ฐ ํ๋๊ฐ"์ "์ธ์ "๋ฅผ ์๊ฐ์ ์ผ๋ก ๋์ ๋๊ฒ ๋ง๋์ธ์. ์ผ๊ด๋ ์ ๋ ฌ๊ณผ ํ๋์ ํ์์คํฌํ ํ์์ ์ฌ์ฉํ์ธ์.
์ฝ๊ธฐ ์ฌ์ด ์ด์ /์ดํ diff
๋ฌด์ธ๊ฐ ์๋ชป๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๋ ์ฌ๋๋ค์ด ์ด๋ ฅ์ ์ด์ด๋ด ๋๋ค. diff๋ฅผ ์ค์บํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๋ฉด ํฌ๊ธฐํ๊ณ ๋๋ฃ์๊ฒ ๋ฌป์ต๋๋ค. ์ข์ diff๋ ํ๋์ ๋ณ๊ฒฝ์ ๋ณด์ฌ์ฃผ๊ณ , ํด๋ฆญ ํ ๋ฒ์ผ๋ก ์์ธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋๋ถ๋ถ์ ํ๋์๋ ์ธ๋ผ์ธ์ด ๊ฐ์ฅ ์ข์ต๋๋ค: ํ ์ค์ Before -> After๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๊ฐ์กฐํ์ธ์. ๊ฐ์ด ๊ธธ๊ฑฐ๋ ์ฌ๋ฌ ๋ถ๋ถ์ ๋์์ ๋น๊ตํด์ผ ํ ๋๋ง ์์ธก ๋น๊ต๋ฅผ ์ฌ์ฉํ์ธ์.
๊ธด ํ ์คํธ๋ ํน๋ณํ ์ ๊ฒฝ ์จ์ผ ํฉ๋๋ค. ๋ฌธ๋จ ์ ์ฒด diff๋ฅผ ๋ฐ์ง๋ ๋ชฉ๋ก ์์ ๋ฃ์ผ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ก์์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ฐ์ท(์ฒซ 120~200์)๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ํ์ฅ ์ปจํธ๋กค๋ก ์ ์ฒด๋ฅผ ํ์ํ์ธ์. ํ์ฅ ์ ์ค๋ฐ๊ฟ์ ์ ์งํ์ธ์. ์ฝ๋ ๊ฐ์ ๋ด์ฉ์๋ ๊ณ ์ ํญ ๊ธ๊ผด์ ์ฌ์ฉํ๊ณ , ๋์ด ์ง์คํ ์ ์๋๋ก ๋ณ๊ฒฝ๋ ์กฐ๊ฐ๋ง ํ์ด๋ผ์ดํธํ์ธ์.
์ซ์, ํตํ, ๋ ์ง๋ ํ์ ํ์๋ง ๋ฌ๋ผ์ก์ ๋๋ ์ค์ง์ ๋ณ๊ฒฝ์ผ ์ ์์ต๋๋ค. ์ค์ํ ๋๋ ์์ ๊ฐ๊ณผ ์ฌ์ฉ์์ฉ ํฌ๋งท(์: 10000 -> 10,000.00 USD)์ ํจ๊ป ๋ณด์ฌ์ฃผ์ธ์.
์ด๊ฑฐํ(enum)๊ณผ ์ํ๋ ๋ ๋ค๋ฅธ ํจ์ ์ ๋๋ค. ์ฌ์ฉ์๋ ๋ผ๋ฒจ์ ์ธ์ํ์ง๋ง ์์คํ ์ ๋ด๋ถ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ผ๋ฒจ์ ๋จผ์ ๋ณด์ฌ์ฃผ๊ณ , ์ง์์ด๋ ์ปดํ๋ผ์ด์ธ์ค๊ฐ ํ์ํ ๋๋ง ๋ด๋ถ ๊ฐ์ ๋ณด์ฌ์ฃผ์ธ์.
์ค์บ ๊ฐ๋ฅ์ฑ์ ์ ์งํ๋ ์ค์ฉ์ diff ํจํด
- ์ธ๋ผ์ธ: Before -> After, ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๊ฐ์กฐ
- ์์ธก ๋น๊ต: ๊ฐ์ด ๊ธธ๊ณ ๋ค์ค ํํธ์ธ ํ๋์ ์ฌ์ฉ
- ๊ธด ํ ์คํธ๋ ์ถ์: ๋ฐ์ท์ ํ์ฅ, ํ์ฅ ์ ์ค๋ฐ๊ฟ ์ ์ง
- ํ์ ํ ํฌ๋งท ํ๊ธฐ: ๊ฐ๊ณผ ํจ๊ป ํ์(ํ์์กด, ํตํ, ์์์ ) ํ์
- ์ํ/์ด๊ฑฐํ: ๋ผ๋ฒจ๊ณผ ํ์ ์ ๋ด๋ถ ์ฝ๋ ๋ณ๊ธฐ
์ฌ์ค์ ์จ๊ธฐ์ง ์์ผ๋ฉด์ ๋ ธ์ด์ฆ๋ฅผ ์ค์ด๋ ํํฐ
๋๋ถ๋ถ์ ์ฌ๋์ ๋ฌด์ธ๊ฐ ์๋ชป๋์์ ๋๋ง ์ด๋ ฅ์ ์ฝ๋๋ค. ์ฒซ ํ๋ฉด์ด 300๊ฐ์ ์์ ํธ์ง์ผ๋ก ๊ฐ๋ํ๋ฉด ๋ซ์๋ฒ๋ฆฝ๋๋ค. ์ข์ ํํฐ๋ ๋ ๊ฐ์ง๋ฅผ ํฉ๋๋ค: ๋ ธ์ด์ฆ๋ฅผ ๋น ๋ฅด๊ฒ ์ค์ด๊ณ ์ ์ฒด ์ฌ์ค์ ํ ๋ฒ์ ํด๋ฆญ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์๊ณ ์์ธก ๊ฐ๋ฅํ ํํฐ ์งํฉ์ผ๋ก ์์ํ์ธ์:
- ์๊ฐ ๋ฒ์(์ง๋ ํ ์๊ฐ, 24์๊ฐ, 7์ผ, ์ฌ์ฉ์ ์ง์ )
- ์กํฐ(์ฌ๋, ์๋น์ค ๊ณ์ , ์ ์ ์์)
- ํ๋(์ํ, ๊ฐ๊ฒฉ, ์ฃผ์, ๊ถํ)
- ๋ณ๊ฒฝ ์ ํ(์์ฑ, ์ ๋ฐ์ดํธ, ์ญ์ , ๋ณต์)
- ์ถ์ฒ(์๋ ์์ vs ์๋ํ/์ํฌํธ/API)
๊ธฐ๋ณธ๊ฐ์ ํ๋ คํ ์ปจํธ๋กค๋ณด๋ค ๋ ์ค์ํฉ๋๋ค. ๊ฒฌ๊ณ ํ ๊ธฐ๋ณธ์ "์ค์ ํ๋"์ "์ต๊ทผ 7์ผ"์ด๋ฉฐ, "๋ชจ๋ ํ๋"์ ๋ ๊ธด ๋ฒ์๋ฅผ ํ์ฅํ๋ ์ต์ ์ ๋ช ํํ ์ ๊ณตํ์ธ์. "๋ ธ์ด์ฆ ํ์" ํ ๊ธ์ last_seen_at ๊ฐ์ ํญ๋ชฉ, ์ฌ์ํ ํ์ ํธ์ง, ์๋ ๊ณ์ฐ ํฉ๊ณ ๊ฐ์ ํญ๋ชฉ์ ์ ์ฉํฉ๋๋ค. ๋ชฉํ๋ ์ฌ์ค์ ์จ๊ธฐ๋ ๊ฒ์ด ์๋๋ผ, ํ์ํ ๋๋ง ๋ณด์ด๊ฒ ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ ฅ ๋ด ๊ฒ์์ ์ข ์ข ์์ฌ์ ํ์ธํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ถ๋ถ ์ผ์น๋ฅผ ํ์ฉํ๊ณ ๋์๋ฌธ์๋ฅผ ๋ฌด์ํ๋ฉฐ ํ๋ ์ด๋ฆ, ์กํฐ ์ด๋ฆ, ํ์ ๊ฐ ์ ๋ฐ์ ๊ฒ์ํ์ธ์. ๋๊ตฐ๊ฐ "refund"๋ฅผ ์ ๋ ฅํ๋ฉด ๋ ธํธ, ์ํ ๋ณ๊ฒฝ, ๊ฒฐ์ ์ํ ์ ๋ฐ์ดํธ๊ฐ ์ด๋์ ์๋์ง ์ถ์ธกํ์ง ์๊ณ ๋ฐ๋ก ๋ณด์ฌ์ผ ํฉ๋๋ค.
์ ์ฅ๋ ํํฐ ๋ทฐ๋ ๋ฐ๋ณต ์กฐ์ฌ์ ๋์์ด ๋ฉ๋๋ค. ์ง์ํ์ ๋์ผํ ํ์ธ์ ๋ฐ๋ณตํฉ๋๋ค. ๋ช ๊ฐ์ง ์ญํ ์นํ์ ์ธ ๋ทฐ(์: "๊ณ ๊ฐ ๋์ ํ๋๋ง" ๋๋ "์๋ํ ๋ณ๊ฒฝ๋ง")๋ฅผ ์ ๊ณตํ์ธ์.
์์ ํ๊ฒ ๋๊ปด์ง๋ ๋ณต์ ์์
๋ณต์ ๋ฒํผ์ ์ฌ๋๋ค์ด ์ ๋ขฐํ ๋๋ง ๋์์ด ๋ฉ๋๋ค. ๋ณต์์ ๋ง๋ฒ ๊ฐ์ ๋กค๋ฐฑ์ด ์๋๋ผ ์ ์คํ๊ณ ๊ฐ์์ ์ธ ํธ์ง์ฒ๋ผ ๋๊ปด์ ธ์ผ ํฉ๋๋ค.
๋จ์ ํ๋(์ํ, ํ๋, ๋ด๋น์)์๋ ํ๋๋ณ ๋ณต์์ด ์ ๋ง์ต๋๋ค. ๋ค์ค ํ๋ ํธ์ง(์ฃผ์ ๋ธ๋ก, ๊ถํ ์ธํธ, ์ฒญ๊ตฌ ์ธ๋ถ ์ ๋ณด)์๋ ์ ์ฒด change set์ ๋ณต์ํ๊ฑฐ๋ "์ด ํธ์ง์์ ๋ชจ๋ ๋ณต์" ๊ฐ์ ์ต์ ์ ์ ๊ณตํ์ธ์. ๋ฐ์ชฝ์ง๋ฆฌ ๋ณต์์ผ๋ก ์ด์ํ ์กฐํฉ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค.
๋ฌด์์ด ์ํฅ์ ๋ฐ๋์ง ๋ณต์ ์ ์ ๋ช ํํ ๋ณด์ฌ์ฃผ์ธ์. ์ข์ ๋ณต์ ํ์ธ์ฐฝ์ ๋ ์ฝ๋์ ํ๋, ์ ํํ ๊ฐ๋ค์ ๋ช ์ํ๊ณ ์ด๋ค ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋ ์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- ์ ์ ํ ๊ถํ ์๊ตฌ(ํธ์ง๊ณผ ๋ณ๋) ๋ฐ ํ์ฉ์ ํ์
- ์ ํํ ์ด์ /์ดํ ๊ฐ์ผ๋ก ํ์ธ
- ๋ถ์์ฉ ๊ฒฝ๊ณ (์: ์ด๋ฉ์ผ ๋ณต์ ์ ์๋ฆผ ํธ๋ฆฌ๊ฑฐ ๊ฐ๋ฅ)
- ์์ ํ ๊ธฐ๋ณธ: ๋จผ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ๊ทธ๋ค์ ์ ์ฉ
์ถฉ๋์ ์ ๋ขฐ๊ฐ ๋ฌด๋์ง๋ ์ง์ ์ด๋ฏ๋ก ์ฐจ๋ถํ ์ฒ๋ฆฌํ์ธ์. ์ด๋ฒคํธ๋ฅผ ๋ณต์ํ๋ ค๋๋ฐ ๊ทธ ์ดํ์ ํ๋๊ฐ ๋ ๋ณ๊ฒฝ๋๋ค๋ฉด ๋ฌด์์ ๋ฎ์ด์ฐ๊ธฐํ์ง ๋ง์ธ์.
์ถฉ๋ ์ฒ๋ฆฌ
ํ์ฌ ๊ฐ์ด ์ด๋ฒคํธ์ "์ดํ" ๊ฐ๊ณผ ๋ค๋ฅผ ๋๋ ์งง์ ๋น๊ต ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ์ธ์: "์ด ๊ฐ์ X๋ก ๋ณต์ํ๋ ค ํ๋๋ฐ, ํ์ฌ ๊ฐ์ Y์ ๋๋ค." ๊ทธ๋ฐ ๋ค์ ๊ฐ์ ๋ณต์, ์ด์ ๊ฐ ๋ณต์ฌ, ์ทจ์ ๊ฐ์ ๋์์ ์ ๊ณตํฉ๋๋ค. ์ํฌํ๋ก์ฐ์ ๋ง๋ค๋ฉด ๋ณต์ ์ด์ ์ ๋ ฅ๋์ ํฌํจํด ๋ณต์์ ๋ฌธ๋งฅ์ ๋จ๊ธฐ๊ฒ ํ์ธ์.
๋ณต์์ผ๋ก ์ด๋ ฅ์ ์ญ์ ํ์ง ๋ง์ธ์. ๋ณต์์ ์๋ก์ด ์ด๋ฒคํธ๋ก ๊ธฐ๋ก๋์ด์ผ ํ๋ฉฐ, ๋๊ฐ ๋ณต์ํ๋์ง, ์ธ์ ํ๋์ง, ์ด๋ค ์ด๋ฒคํธ์์ ๋ณต์ํ๋์ง ๋ช ํํ ๋จ๊ฒจ์ผ ํฉ๋๋ค.
๋จ๊ณ๋ณ: ์ฝ๊ธฐ ์ฌ์ด ์ด๋ ฅ์ ์๋ํฌ์๋ ๊ตฌํ
๋ช ๊ฐ์ง ๊ฒฐ์ ์ ์์ ๋ด๋ฆฌ๊ณ UI, API, ์๋ํ ์ ๋ฐ์์ ์ผ๊ด๋๊ฒ ์ ์งํ๋ฉด ์ฌ๋๋ค์ด ์ ๋ขฐํ๋ ์ด๋ ฅ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ 5๋จ๊ณ ๋น๋
- 1๋จ๊ณ: ์ด๋ ฅ์ด ์ง์ง ํ์ํ ์ํฐํฐ๋ฅผ ์ ํํ์ธ์. ๋ถ์์ด๋ ๊ธ์ ์ ์ํ์ ์ ๋ฐํ๋ ๊ฐ์ฒด(์ฌ์ฉ์, ์ฃผ๋ฌธ, ๊ฐ๊ฒฉ, ๊ถํ)๋ถํฐ ์์ํ์ธ์. ์ด๋ฐ ํญ๋ชฉ๋ค์ ๋ํด "๋๊ฐ ์ธ์ ๋ณ๊ฒฝํ๋?"๋ฅผ ๋ตํ ์ ์๋ค๋ฉด ์ง์๊ณผ ์ฌ๋ฌด๊ฐ ๋จผ์ ๊ณ ํต์ ๋ฐ์ต๋๋ค.
- 2๋จ๊ณ: ์ด๋ฒคํธ ์คํค๋ง์ ๋ฌด์์ ํ change set์ผ๋ก ๋ณผ์ง ์ ์ํ์ธ์. ํ๋์ ์ ์ฅ์ด ์ฌ๋ฌ ํ๋ ํธ์ง์ ํฌํจํ ์ง ๊ฒฐ์ ํ์ธ์. ์ํฐํฐ ํ์ /ID, ์กํฐ(์ฌ์ฉ์ ๋๋ ์์คํ ), ์ถ์ฒ(๊ด๋ฆฌ์ UI, API, ์๋ํ), ํ์์คํฌํ, ๊ทธ๋ฆฌ๊ณ before/after ๊ฐ์ ํ๋ ๋ชฉ๋ก์ ์ ์ฅํ์ธ์.
- 3๋จ๊ณ: ๋ชจ๋ ๊ฒฝ๋ก์์ ๋์ผํ๊ฒ ๋ณ๊ฒฝ์ ์บก์ฒํ์ธ์. UI ํธ์ง์ ์ฝ์ต๋๋ค. ์ด๋ ค์ด ๋ถ๋ถ์ API ํธ์ถ๊ณผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ๋๋ค. ๊ฐ์ฌ ๋ก์ง์ ํ ๊ณณ(์๋น์ค ๋ ์ด์ด ๋๋ ๋น์ฆ๋์ค ๋ก์ง)์ ๋์ด ๋๋ฝ๋๋ ๊ฒฝ๋ก๊ฐ ์๊ฒ ํ์ธ์.
- 4๋จ๊ณ: ๋ ์ฝ๋ ํ์ด์ง ์ด๋ ฅ UI์ ํํฐ ์ธํธ๋ฅผ ํจ๊ป ๋น๋ํ์ธ์. ์ญ์ ์ฐ๋๊ธฐ ๋ชฉ๋ก์์ ๊ฐ ํญ๋ชฉ์ ๋๊ฐ, ์ธ์ , "3๊ฐ ํ๋ ๋ณ๊ฒฝ" ์์ฝ์ ๊ฐ๊ฒ ํ์ธ์. ํํฐ๋ ์ค์ ์ง๋ฌธ์ ๋ง์ถฐ์ผ ํฉ๋๋ค: ํ๋๋ณ, ์กํฐ๋ณ, ์ถ์ฒ๋ณ, "์ค์ํ ๋ณ๊ฒฝ๋ง".
- 5๋จ๊ณ: ์๊ฒฉํ ๊ถํ๊ณผ ์ถ๊ฐ ๋ก๊น ์ด ์๋ ๋ณต์์ ์ถ๊ฐํ์ธ์. ๋ณต์์ ์๋ก์ด ๋ณ๊ฒฝ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณต์ํ๋ฉด ๋๊ฐ ํ๋์ง, ๋ฌด์์ ๋ฐ๊ฟจ๋์ง(์ ํ์ ์ผ๋ก ์ด์ ํฌํจ)๋ฅผ ์บก์ฒํ๋ ์๋ก์ด ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์ถ์ ์ ํ์ค์ ์ธ ์๋๋ฆฌ์ค ํ๋๋ฅผ ํ ์คํธํ์ธ์: ์ง์ ๋ด๋น์๊ฐ ์ฃผ๋ฌธ์ ์ด๊ณ ๊ฐ๊ฒฉ ํ๋๋ก ํํฐ๋ฅผ ์ขํ ํ ์ ์ฅ์์ ์๊ณ, ํ ์ธ, ์ธ๊ธ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ๋ณด๊ณ ํ ์ธ๋ง ๋ณต์ํฉ๋๋ค. ๊ทธ ํ๋ฆ์ด ๋ณ๋ ์ค๋ช ์์ด ๋ช ํํ๋ฉด ์ด๋ ฅ์ ์ฌ์ฉ๋ ๊ฒ์ ๋๋ค.
ํํ ์ค์์ ํจ์
๋๋ถ๋ถ์ ์ด๋ ฅ ๋ทฐ๊ฐ ์คํจํ๋ ์ด์ ๋ ๊ฐ๋จํฉ๋๋ค: ์ฃผ์๋ฅผ ์กด์คํ์ง ์์ต๋๋ค. ๋ก๊ทธ๊ฐ ์๋๋ฝ๊ฑฐ๋ ํผ๋์ค๋ฌ์ฐ๋ฉด ์ฌ๋๋ค์ ์ฌ์ฉ์ ์ค๋จํ๊ณ ์ถ์ธก์ผ๋ก ๋์๊ฐ๋๋ค.
ํํ ํจ์ ์ ๋๋ฌด ๋ง์ด ๊ธฐ๋กํ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ํค ์ ๋ ฅ, ๋๊ธฐํ ํฑ, ์๋ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋กํ๋ฉด ์ ํธ๊ฐ ์ฌ๋ผ์ง๋๋ค. ์ง์์ ์ค์ํ ํ ๋ณ๊ฒฝ์ ์ฐพ์ง ๋ชปํฉ๋๋ค. ์๋ฏธ ์๋ ์ปค๋ฐ๋ง ๊ธฐ๋กํ์ธ์: "์ํ ๋ณ๊ฒฝ", "์ฃผ์ ์ ๋ฐ์ดํธ", "ํ๋ ์ฆ๊ฐ" ๋ฑ. "์ฌ์ฉ์๊ฐ A๋ฅผ ์ ๋ ฅํจ, ๊ทธ๋ค์ B๋ฅผ ์ ๋ ฅํจ" ๊ฐ์ ๊ธฐ๋ก์ ํผํ์ธ์.
๋ฐ๋๋ก ๋๋ฌด ์ ๊ฒ ๊ธฐ๋กํ๋ ๊ฒ๋ ํด๋กญ์ต๋๋ค. ์กํฐ, ํ์์คํฌํ, ์ด์ , ์ด์ ๊ฐ์ด ์๋ ์ด๋ ฅ์ ์๋ฌธ์ผ ๋ฟ์ ๋๋ค.
๋ผ๋ฒจ์ ์ ๋ขฐ๋ฅผ ์กฐ์ฉํ ๋ฌด๋๋จ๋ฆด ์ ์์ต๋๋ค. ์์ DB ์ด๋ฆ(์: cust_id), ๋ด๋ถ ID, ์ํธ ๊ฐ์ enum ๊ฐ์ ๋น๊ธฐ์ ์ ์ง์์๊ฒ ํด์์ ๊ฐ์ํฉ๋๋ค. ์ฌ๋ ์นํ์ ๋ผ๋ฒจ("๊ณ ๊ฐ", "ํ๋", "๋ฐฐ์ก ์ฃผ์")์ ์ฌ์ฉํ๊ณ ํ์ํ ๋๋ง ID๋ฅผ ๋ณ๊ธฐํ์ธ์.
์ฌ์ฉ์ฑ์ ๊ฐ์ฅ ์น๋ช ์ ์ธ ์ค์๋ค:
- ์์คํ ๋ ธ์ด์ฆ๋ฅผ 1๊ธ ์ด๋ฒคํธ๋ก ์ฒ๋ฆฌ(๋๊ธฐํ, ํํธ๋นํธ, ์๋ ๊ณ์ฐ)
- ๋งฅ๋ฝ ์์ด ๋ณ๊ฒฝ ์ ์ฅ(์กํฐ, ์ด์ , API vs UI ๊ฐ์ ์ถ์ฒ ๋๋ฝ)
- ๊ธฐ์ ์ ํ๋ ํค๋ฅผ ์ฌ์ฉ์์ฉ ๋จ์ด ๋์ ํ์
- ๊ด๋ จ ์๋ ๋ณ๊ฒฝ์ ํ๋์ ๋ฉ์ด๋ฆฌ๋ก ์์ด diff ์ค์บ์ด ์ด๋ ค์
- ์ค์ํ ์ด๋ฒคํธ๋ฅผ ๊ณต๊ฒฉ์ ์ธ ํํฐ๋ ๊ธฐ๋ณธ๊ฐ ๋ค์ ์จ๊น
๋ณต์ ์์ ์ ๊ฐ์ฅ ์ํํ ์์ญ์ ๋๋ค. ์ํด๋ฆญ ๋๋๋ฆฌ๊ธฐ๋ ๋น ๋ฅด๊ฒ ๋๊ปด์ง์ง๋ง ๋ค๋ฅธ ๊ฒ์ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค(๊ฒฐ์ , ๊ถํ, ์ฌ๊ณ ). ๋ณต์์ ์์ ํ๊ฒ ๋ง๋์ธ์:
- ํญ์ ํ์ธํ๊ณ ์ ํํ ๋ฌด์์ด ๋๋์๊ฐ๋์ง ๋ณด์ฌ์ฃผ๊ธฐ
- ๋ถ์์ฉ ๊ฒฝ๊ณ (๊ท์น ํธ๋ฆฌ๊ฑฐ, ์ข ์ ํ๋ ์ฌ๊ณ์ฐ)
- ๋ฏผ๊ฐ ํ๋์๋ ์ด์ ๋ ธํธ ์๊ตฌ
- ๋ณต์ ํ์ ๋ฌด์์ด ์ผ์ด๋ฌ๋์ง ๋ณด์ฌ์ฃผ๊ธฐ(์ ์ด๋ฒคํธ๋ก ๊ธฐ๋ก)
์ข์ ๋ณ๊ฒฝ ์ด๋ ฅ ์ฒดํฌ๋ฆฌ์คํธ
์ข์ ์ด๋ ฅ ๋ทฐ๋ ์ง์ํ์ด ๊ณ ๊ฐ์ด ํตํ ์ค์ธ ๋์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋๋ค. "๋ฌด์์ด ์ธ์ ๋๊ฐ ๋ณ๊ฒฝํ๋๊ฐ?"๋ฅผ ๋ตํ๋ ๋ฐ ์ฒซ ํ๋ฉด์์ 10์ด ์ด์ ๊ฑธ๋ฆฌ๋ฉด ์ฌ๋๋ค์ ์ด์ง ์์ต๋๋ค.
- 10์ด ๋ต๋ณ ํ ์คํธ: ์ฒซ ํ๋ฉด์์ ๋๊ตฐ๊ฐ๊ฐ ์ ํํ ํญ๋ชฉ์ ๊ฐ๋ฆฌ์ผ ์ด์ ๊ณผ ์ดํ ๊ฐ์ ์ถ๊ฐ ํด๋ฆญ ์์ด ๋ณด์ฌ์ค ์ ์๋๊ฐ?
- ๋ช ํํ ๊ท์: ๊ฐ ์ด๋ฒคํธ๋ ๋๊ฐ ํ๋์ง(์ด๋ฆ ์๋ ์ฌ์ฉ์) ๋๋ ๋ฌด์์ด ํ๋์ง(์์คํ , ์ํฌํธ, ์๋ํ), ๊ทธ๋ฆฌ๊ณ ์ฝ๊ธฐ ์ฌ์ด ํ์์คํฌํ์ ํ์ ์ ์ฌ์ฉ์ ํ์์กด์ ๋ณด์ฌ์ค๋๋ค.
- ์ถ์ธก ์๋ ๋น ๋ฅธ ์ถ์: ํํฐ๋ก ํ ํ๋์ ์ข์ ์๊ฐ ์ฐฝ(์: ์ํ + ์ต๊ทผ 7์ผ)์ผ๋ก ๋ฐ๋ก ์ ํํ ์ ์๊ณ , UI๋ ๋จ์ ๊ฒฐ๊ณผ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- ๋ณต์์ ๋ฌด์ญ์ง ์๊ฒ ์์ ํ๊ฒ: ๋ณต์์ ์ ์ ํ ์ญํ ๋ง ๋ณด์ด๊ฒ ํ๊ณ , ํ๋์ ์ ํํ ๊ฐ์ ๋ช ์ํ ํ์ธ์ ์๊ตฌํ๋ฉฐ, ์ต์ ๋ณ๊ฒฝ์ ๋ฎ์ด์ฐ๋ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ํฉ๋๋ค.
- ๋ณต์์ ์ค์ ์ด๋ฒคํธ๋ก ๊ธฐ๋ก: ๋ณต์์ ์จ์ ์ญ์ ์ด ์๋๋ผ ์ ๊ฐ์ฌ ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋๊ฐ ๋ณต์ํ๋์ง, ์ด๋ค ๊ฐ์ผ๋ก ๋ณต์ํ๋์ง, ์ด๋ค ๊ฐ์ ๋์ฒดํ๋์ง ์บก์ฒํฉ๋๋ค.
์ด๋ฅผ ๊ฒ์ฆํ๋ ์ค์ฉ์ ๋ฐฉ๋ฒ์ ์งง์ "์ง์ ๋ถ์" ์ฐ์ต์ ๋๋ค. ํธ์ง์ด ๋ง์ ๋ ์ฝ๋๋ฅผ ๊ณจ๋ผ ๋๋ฃ์๊ฒ ๋ฌผ์ด๋ณด์ธ์: "์ ๊ณ ๊ฐ์ ๋ฐฐ์ก ์ฃผ์๊ฐ ์ด์ ์ ๋ค๋ฅธ๊ฐ?" ํํฐ๋ฅผ Address๋ก ์ขํ๊ณ ์ด์ /์ดํ diff๋ฅผ ๋ณด๊ณ ์กํฐ๋ฅผ 10์ด ๋ด์ ์๋ณํ ์ ์๋ค๋ฉด ๊ฑฐ์ ์ฑ๊ณตํ ๊ฒ์ ๋๋ค.
์์: ๊ฐ์ฌ ์ด๋ ฅ์ผ๋ก ์ง์ ๋ถ์ ํด๊ฒฐํ๊ธฐ
๊ณ ๊ฐ์ด ํฐ์ผ์ ์ฝ๋๋ค: "ํ๋ก๋ชจ์ ์ ์ ์ฉํ๋๋ ์ฒญ๊ตฌ์ ์ด์ก์ด ๋ฐ๋์์ด์. ๋ ๋ง์ด ์ฒญ๊ตฌ๋์ต๋๋ค." ํ๋ ๋จ์ ๋ณ๊ฒฝ ์ด๋ ฅ์ ์๊ฐ์ ์ ์ฝํ์ง๋ง ์ฝ๊ธฐ ์ฝ๊ณ ์คํ ๊ฐ๋ฅํ ๋๋ง ๊ทธ๋ ์ต๋๋ค.
์ก์ฅ ๋ ์ฝ๋์์ ์ง์ ๋ด๋น์๋ History ํญ์ ์ด๊ณ ๋จผ์ ๋ ธ์ด์ฆ๋ฅผ ์ค์ ๋๋ค. ์ง๋ 7์ผ๋ก ํํฐ๋ฅผ ์ขํ๊ณ Discount์ Total ํ๋๋ง ์ ํํ ๋ค ์กํฐ๋ฅผ ๋ด๋ถ ์ฌ์ฉ์(๊ณ ๊ฐ์ด๋ ์๋ํ๊ฐ ์๋)๋ก ํํฐํฉ๋๋ค.
ํ์๋ผ์ธ์๋ ์ด์ ์ธ ๊ฐ์ ๋ช ํํ ํญ๋ชฉ์ด ๋ณด์ ๋๋ค:
- 2026-01-18 14:12, ์กํฐ: Sales Rep, ํ๋: Discount, 10% -> 0%, ์ด์ : "ํ๋ก๋ชจ์ ๋ง๋ฃ"
- 2026-01-18 14:12, ์กํฐ: System, ํ๋: Total, $90 -> $100, ์ด์ : "๋ผ์ธ ์์ดํ ์ผ๋ก๋ถํฐ ์ฌ๊ณ์ฐ"
- 2026-01-18 14:13, ์กํฐ: Sales Rep, ์ฝ๋ฉํธ: "๊ณ ๊ฐ ์์ฒญ์ผ๋ก ์ ๊ฑฐ"
์ด์ผ๊ธฐ๊ฐ ๋ช ํํฉ๋๋ค: ํ ์ธ์ด ์ ๊ฑฐ๋์๊ณ ์ด์ก์ด ๋ฐ๋ก ์ฌ๊ณ์ฐ๋์์ต๋๋ค. ๋ด๋น์๋ ์ฝ๋ฉํธ์ ํ๋ก๋ชจ ๊ท์น์ ํ์ธํด ์ ๊ฑฐ๊ฐ ์ ์ ํ๋์ง ํ๋จํ ์ ์์ต๋๋ค.
์ค์์๋ค๋ฉด ๋ด๋น์๋ Discount ํ๋์์ ์์ ํ ๋ณต์ ํ๋ฆ์ ์ฌ์ฉํฉ๋๋ค. UI๋ ๋ฌด์์ด ๋ฐ๋์ง(Discount๋ฅผ 10%๋ก ๋ณต์, Total ์ฌ๊ณ์ฐ)๋ฅผ ๋ฏธ๋ฆฌ ๋ณด์ฌ์ฃผ๊ณ ๋ฉ๋ชจ๋ฅผ ์๊ตฌํฉ๋๋ค.
- "Discount: 10% -> 0%" ์์ ๋ณต์ ํด๋ฆญ
- ์ฝ๋ฉํธ ์ถ๊ฐ: "ํฐ์ผ #18421์ ๋ฐ๋ผ ํ ์ธ ๋ณต์. ํ๋ก๋ชจ ์ฌ์ ํ ์ ํจ."
- ํ์ธํ๊ณ ๊ฒฐ์ ํ(๋ฐ ์ ํ์ ์ผ๋ก ๊ณ ๊ฐ)์๊ฒ ์๋ฆผ
AppMaster ๊ฐ์ ๋ ธ์ฝ๋ ํ๋ซํผ์์ ๊ด๋ฆฌ์ ํจ๋์ ๊ตฌ์ถํ๋ค๋ฉด, PostgreSQL์ ๊ฐ์ฌ ํ ์ด๋ธ์ ๋ชจ๋ธ๋งํ๊ณ Business Processes์์ ๊ฐ์ฌ ์ฐ๊ธฐ๋ฅผ ์ค์ํํ๋ฉฐ ์น๊ณผ ๋ชจ๋ฐ์ผ์์ ๋์ผํ ํ์คํ ๋ฆฌ UI ํจํด์ ์ฌ์ฌ์ฉํด ํ์ด ์ด๋์ ์์ ํ๋ ์คํ ๋ฆฌ๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋๊ฒ ํ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ์ค์บํ๊ธฐ ์ด๋ ต๊ณ ๊ฐ์น๊ฐ ๋ฎ์ ์ก์์ผ๋ก ๊ฐ๋ํ ์ด๋ ฅ ๋๋ฌธ์ ๋ฌด์ํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ด ์ฆ์ ๋ค์ ๋ค ๊ฐ์ง๋ฅผ ๋ตํด์ผ ํฉ๋๋ค: ๋๊ฐ ๋ณ๊ฒฝํ๋์ง, ๋ฌด์์ด ๋ณ๊ฒฝ๋์๋์ง(์ด์ /์ดํ ๊ฐ ํฌํจ), ์ธ์ ๋ฐ์ํ๋์ง(์ผ๊ด๋ ํ์), ๊ทธ๋ฆฌ๊ณ ์ถ์ฒ๋ ์ด์ ๋ ๋ฌด์์ธ์ง.
๋ชจ๋ ํค ์ ๋ ฅ์ ๊ธฐ๋กํ์ง ๋ง๊ณ ์๋ฏธ ์๋ ์ปค๋ฐ๋ง ๊ธฐ๋กํ์ธ์. ํ๋ ํธ์ง, ์ํ ์ ํ, ์ฃผ์ ์ํฌํ๋ก์ฐ ์์ ์ ์ถ์ ํ๊ณ ์กํฐ๊ฐ ์ฌ๋์ธ์ง ์๋ํยท์ํฌํธยทAPI์ธ์ง ๋ถ๋ช ํ ํ์ํ๋ฉด ์์คํ ์ก์์ด ์ฌ๋ ํ๋์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค.
๋ณ๊ฒฝ๋ ๊ฒ๋ง ์ ์ฅํ๋ ์ด๋ฒคํธ ๋ชจ๋ธ๋ก ์์ํ๊ณ , ํน์ ์์ ์ ์ํ๋ฅผ ๋น ๋ฅด๊ฒ ๋ณด๊ฑฐ๋ ์ฌ๋ฌ ํ๋๋ฅผ ํ๊บผ๋ฒ์ ๋ณต์ํด์ผ ํ ๊ฒฝ์ฐ ๊ฐ๋ฒผ์ด ์ค๋ ์ท์ ์ถ๊ฐํ๋ ํ์ด๋ธ๋ฆฌ๋๊ฐ ์ค์ฉ์ ์ ๋๋ค. ์ด๋ฒคํธ๋ ์ง์ค์ ์ถ์ฒ๋ก, ์ค๋ ์ท์ ์ฑ๋ฅ๊ณผ ๋๋ ๋ณต์์ ๋์๋ฉ๋๋ค.
์ค์ฉ์ ์ธ ์ต์ ํ๋๋ ์กํฐ ์๋ณ(๋ฐ ํ์ ), UTC ํ์์คํฌํ, ์ํฐํฐ ์ข ๋ฅ์ ID, ์์ ์ ์ธ ํ๋ ํค, ๊ทธ๋ฆฌ๊ณ before/after ๊ฐ(๋ฐ์ดํฐ ํ์ ํฌํจ)์ ๋๋ค. ์ดํ์ โ์โ๊ฐ ํ์ํ ๋๋ฅผ ๋๋นํด ์ฝ๋ฉํธ, workflow_run_id, import_batch_id, ์๋ํ ์ด์ ๊ฐ์ ์ ํ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ์ธ์.
ํ๋์ ์ ์ฅ(๋๋ ์ํฌํ๋ก์ฐ ์คํ)์์ ๋ฐ์ํ ๋ชจ๋ ํ๋ ๋ณ๊ฒฝ์ change_set_id๋ก ๋ฌถ์ผ์ธ์. ๊ทธ๋ฌ๋ฉด UI๋ "ํ๋ 5๊ฐ ๋ณ๊ฒฝ" ๊ฐ์ ์ฝ๊ธฐ ์ฌ์ด ํญ๋ชฉ์ ๋ณด์ฌ์ฃผ๊ณ ํ์ฅํด์ ๊ฐ ํ๋์ diff๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ํ ์ค์ ์ด์ โ ์ดํ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๊ฐ์กฐํ์ธ์. ๊ฐ์ด ๊ธธ๊ฑฐ๋ ์ฌ๋ฌ ๋ถ๋ถ์ ๋น๊ตํด์ผ ํ๋ฉด ์์ธก ๋น๊ต๋ก ์ ํํ์ธ์. ๊ธด ํ ์คํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ท(120~200์)๋ง ๋ณด์ฌ์ฃผ๊ณ ํ์ฅํด์ ์ ์ฒด๋ฅผ ๋ณด๊ฒ ํ๋ฉฐ ์ค๋ฐ๊ฟ์ ์ ์งํ์ธ์.
์ ์ฅ์๋ UTC๋ก ํ๊ณ , ํ์ํ ๋๋ ์กฐํ์์ ํ์์กด์ผ๋ก ๋ณํํ์ธ์. ์ฌ๋ฌ ํ์์กด์์ ์ผํ๋ ํ์ด๋ผ๋ฉด ํ์ ์๊ฐ ์์ ํ์์กด ๋ ์ด๋ธ์ ๋ณด์ฌ์ค์ "์ธ์ "๊ฐ ์ง์ ํตํ ์ค์ ๋ช ํํ๋๋ก ํ์ธ์.
์๊ฐ ๋ฒ์, ์กํฐ, ํ๋, ๋ณ๊ฒฝ ์ ํ, ์์ค(์๋ vs ์๋ํ/์ํฌํธ/API) ๊ฐ์ ์์ ํํฐ ์งํฉ์ผ๋ก ์์ํ์ธ์. ๊ธฐ๋ณธ๊ฐ์ "์ค์ํ ํ๋"์ "์ต๊ทผ 7์ผ" ๊ฐ์ ์์ ํ ์ค์ ์ด ์ข์ต๋๋ค. ํ์ํ๋ฉด ์ ์ฒด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ต์ ์ ๋ช ํํ ํ์ธ์.
๋ณต์์ ์๋ก์ด, ๋์ ๋๋ ํธ์ง์ผ๋ก ์ทจ๊ธํ์ธ์. ์๊ฒฉํ ๊ถํ์ ์๊ตฌํ๊ณ , ์ ํํ ๋ฌด์์ด ๋ณ๊ฒฝ๋ ์ง ๋ฏธ๋ฆฌ ๋ณด์ฌ์ฃผ๋ฉฐ, ํ์ฌ ๊ฐ์ด ์ด๋ฒคํธ์ ์ดํ ๊ฐ๊ณผ ๋ค๋ฅด๋ฉด ์ถฉ๋์ ๋ช ํํ ๋ณด์ฌ์ฃผ๊ณ ์ฌ์ฉ์๊ฐ ์๋์ ์ผ๋ก ์ ํํ๊ฒ ํ์ธ์.
๊ฐ์ฌ ์ฐ๊ธฐ๋ฅผ ํ ๊ณณ์ ๋ชจ์ UI ํธ์ง, API ํธ์ถ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ๋์ผํ๊ฒ ๊ธฐ๋ก๋๋๋ก ํ์ธ์. AppMaster์์๋ PostgreSQL์ ๊ฐ์ฌ ํ ์ด๋ธ์ ๋ชจ๋ธ๋งํ๊ณ Business Processes์์ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ฉฐ ์น๊ณผ ๋ชจ๋ฐ์ผ์ ๊ฐ์ ํ์คํ ๋ฆฌ UI ํจํด์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.


