๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ ์ค๋ฅ UX: ์คํจ๋ฅผ ๋ช ํํ ๋ฉ์์ง๋ก ๋ฐ๊พธ๊ธฐ
์ฑ์์ ๊ณ ์ ์ ์ฝ, ์ธ๋ ํค, NOT NULL ์คํจ๋ฅผ ํ๋ ์์ค์ ๋์์ด ๋๋ ๋ฉ์์ง๋ก ๋งคํํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ ์ค๋ฅ UX๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.

์ ์ฝ ์คํจ๊ฐ ์ฌ์ฉ์์๊ฒ ์ ๋ถ์พํ๊ฒ ๋๊ปด์ง๋๊ฐ
์ฌ์ฉ์๊ฐ ์ ์ฅ์ ๋๋ฅด๋ฉด ๊ธฐ๋ํ๋ ๊ฒฐ๊ณผ๋ ๋ ๊ฐ์ง๋ฟ์ ๋๋ค: ์ฑ๊ณตํ๊ฑฐ๋, ๋น ๋ฅด๊ฒ ๊ณ ์น ์ ์๋๋ก ์๋ ค์ฃผ๋ ๊ฒ. ๊ทธ๋ฐ๋ฐ ์ข ์ข โ์์ฒญ ์คํจโ๋ โ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋คโ ๊ฐ์ ์ผ๋ฐ ๋ฐฐ๋๋ง ๋ณด์ ๋๋ค. ํผ์ ๊ทธ๋๋ก๊ณ ๊ฐ์กฐ๋ ํญ๋ชฉ๋ ์์ผ๋ฉฐ ์ฌ์ฉ์๋ ์ถ์ธก๋ง ํฉ๋๋ค.
๋ฐ๋ก ๊ทธ ๊ฐ๊ทน ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ ์ค๋ฅ UX๊ฐ ์ค์ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฌ์ฉ์๊ฐ ๋ณด์ง ๋ชปํ ๊ท์น์ ๊ฐ์ ํฉ๋๋ค: โ์ด ๊ฐ์ ๊ณ ์ ํด์ผ ํ๋คโ, โ์ด ๋ ์ฝ๋๋ ์กด์ฌํ๋ ํญ๋ชฉ์ ์ฐธ์กฐํด์ผ ํ๋คโ, โ์ด ํ๋๋ ๋น์๋ ์ ์๋ค.โ ์ฑ์ด ์ด๋ฐ ๊ท์น์ ๋ชจํธํ ์ค๋ฅ ๋ค์ ์จ๊ธฐ๋ฉด ์ฌ์ฉ์๋ ์ดํดํ ์ ์๋ ๋ฌธ์ ๋ก ํ์ ๋ฐ๋ ๊ธฐ๋ถ์ด ๋ญ๋๋ค.
์ผ๋ฐ ์ค๋ฅ๋ ์ ๋ขฐ๋๋ ๊น์ต๋๋ค. ์ฌ์ฉ์๋ ์ฑ์ด ๋ถ์์ ํ๋ค๊ณ ์๊ฐํด ์ฌ์๋ํ๊ฑฐ๋ ์๋ก๊ณ ์นจํ๊ฑฐ๋ ์์ ์ ํฌ๊ธฐํฉ๋๋ค. ์ ๋ฌด ํ๊ฒฝ์์๋ ๋์์ด ๋์ง ์๋ ์คํฌ๋ฆฐ์ท๊ณผ ํจ๊ป ์ง์์ ๋ฌธ์ํ๊ฒ ๋ฉ๋๋ค(์คํฌ๋ฆฐ์ท์๋ ์ธ๋ชจ์๋ ์ ๋ณด๊ฐ ์์ต๋๋ค).
ํํ ์: ๊ณ ๊ฐ์ ๋ง๋ค์๋๋ฐ โ์ ์ฅ ์คํจโ๊ฐ ๋์ต๋๋ค. ๊ฐ์ ์ด๋ฉ์ผ๋ก ๋ค์ ์๋ํด๋ ์คํจํ๋ฉด ์ฌ์ฉ์๋ ์์คํ ์ด ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต ์ ์ฅํ๊ฑฐ๋ ์์ด๋ฒ๋ฆฌ๋์ง ํผ๋์ค๋ฌ์ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ UI์์ ๊ฒ์ฆํ๋๋ผ๋ ๋ง์ง๋ง์ ์ง์ค ์์ค์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ค๋ฅธ ์ฌ์ฉ์์ ๋ณ๊ฒฝ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ , ํตํฉ์ผ๋ก ์ต์ ์ํ๋ฅผ ๋ณด๋ฏ๋ก ์ ์ฝ ์คํจ๋ ์ ์์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค.
์ข์ ๊ฒฐ๊ณผ๋ ๋จ์ํฉ๋๋ค: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ท์น์ ํน์ ํ๋์ ๋ค์ ๋จ๊ณ(์ด๋ค ์กฐ์น๋ฅผ ์ทจํ ์ง)๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉ์์ง๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด:
- โ์ด ์ด๋ฉ์ผ์ ์ด๋ฏธ ์ฌ์ฉ ์ค์ ๋๋ค. ๋ค๋ฅธ ์ด๋ฉ์ผ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ก๊ทธ์ธํ์ธ์.โ
- โ์ ํจํ ๊ณ์ ์ ์ ํํ์ธ์. ์ ํํ ๊ณ์ ์ด ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค.โ
- โ์ ํ๋ฒํธ๋ ํ์์ ๋๋ค.โ
์ด ๊ธ์ ๋๋จธ์ง ๋ถ๋ถ์ ์คํจ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋์์ด ๋๋ ์๋ด๋ก '๋ฒ์ญ'ํ๋ ๋ฐฉ๋ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ง์ ์คํ์ ๊ตฌํํ๋ AppMaster ๊ฐ์ ๋๊ตฌ๋ก ๋ง๋ค๋ ๋ชฉํ๋ ๊ฐ์์ผ ํฉ๋๋ค.
๋ง์ฃผ์น๊ฒ ๋ ์ ์ฝ ์ ํ(๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋ฏธ)
๋๋ถ๋ถ์ โ์์ฒญ ์คํจโ ์๊ฐ์ ์์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ท์น์์ ์ต๋๋ค. ๊ท์น์ ์ด๋ฆ์ ์๋ฉด ๋ณดํต ์ค๋ฅธ์ชฝ ํ๋์ ๋ช ํํ ๋ฉ์์ง๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ ์ฝ ์ ํ์ ํ์ดํ ์ธ์ด๋ก ์ ๋ฆฌํ๋ฉด:
- ๊ณ ์ ์ ์ฝ(Unique constraint): ๊ฐ์ด ๊ณ ์ ํด์ผ ํฉ๋๋ค. ์ด๋ฉ์ผ, ์ฌ์ฉ์๋ช , ์ก์ฅ ๋ฒํธ, ์ธ๋ถ ID ๋ฑ์ด ํํ ์์ ๋๋ค. ์คํจํ๋ฉด ์ฌ์ฉ์๊ฐ โ์๋ชปํ๋คโ๊ธฐ๋ณด๋ค ๊ธฐ์กด ๋ฐ์ดํฐ์ ์ถฉ๋ํ ๊ฒ์ ๋๋ค.
- ์ธ๋ ํค ์ ์ฝ(Foreign key constraint): ํ ๋ ์ฝ๋๊ฐ ์กด์ฌํด์ผ ํ๋ ๋ค๋ฅธ ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค(์:
order.customer_id). ์ฐธ์กฐ ๋์์ด ์ญ์ ๋๊ฑฐ๋ ์กด์ฌํ์ง ์๊ฑฐ๋ UI๊ฐ ์๋ชป๋ ID๋ฅผ ๋ณด๋์ ๋ ์คํจํฉ๋๋ค. - NOT NULL ์ ์ฝ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ค์์ ํ์ ๊ฐ์ด ๋๋ฝ๋ ๊ฒฝ์ฐ์ ๋๋ค. ํผ์ด ์์ ํด ๋ณด์ฌ๋ ๋ฐ์ํ ์ ์์ต๋๋ค(์: UI๊ฐ ํ๋๋ฅผ ๋ณด๋ด์ง ์์๊ฑฐ๋ API๊ฐ ๋ฎ์ด์ผ์ ๋).
- ์ฒดํฌ ์ ์ฝ(Check constraint): ๊ฐ์ด ํ์ฉ ๊ท์น์ ๋ฒ์ด๋ ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด โ์๋์ 0๋ณด๋ค ์ปค์ผ ํจโ, โ์ํ๋ ๋ฏธ๋ฆฌ ์ ํ ๊ฐ ์ค ํ๋์ฌ์ผ ํจโ, โํ ์ธ์ 0~100 ์ฌ์ด์ฌ์ผ ํจโ ๊ฐ์ ๊ฒฝ์ฐ์ ๋๋ค.
๊ฐ์ ์ค์ ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ตฌ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค. Postgres๋ ์ ์ฝ ์ด๋ฆ์ ์ฃผ๊ธฐ๋ ํด ๋์์ด ๋์ง๋ง ORM์ ์ด๋ฅผ ์ผ๋ฐ ์์ธ๋ก ๋ํํด ์ ์ฉํ์ง ์์ ์ ์์ต๋๋ค. ๊ฐ์ ๊ณ ์ ์ ์ฝ๋ โduplicate keyโ, โunique violationโ ๋๋ ๊ณต๊ธ์ฌ๋ณ ์ค๋ฅ ์ฝ๋๋ก ๋ํ๋ ์ ์์ต๋๋ค.
์ค์ฉ์ ์: ๊ด๋ฆฌ ํจ๋์์ ๊ณ ๊ฐ์ ์์ ํ๊ณ ์ ์ฅํ๋๋ฐ ์คํจ๊ฐ ๋ฐ์ํ์ต๋๋ค. API๊ฐ email์ ๋ํ ๊ณ ์ ์ ์ฝ์์ UI์ ์๋ ค์ค ์ ์๋ค๋ฉด, ๋ชจํธํ ํ ์คํธ ๋์ ์ด๋ฉ์ผ ํ๋ ์๋์ โ์ด ์ด๋ฉ์ผ์ ์ด๋ฏธ ์ฌ์ฉ ์ค์
๋๋คโ๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
๊ฐ ์ ์ฝ ์ ํ์ ์ฌ์ฉ์๊ฐ ์ทจํ ๋ค์ ํ๋์ ๋ํ ํํธ๋ก ๋ค๋ฃจ์ธ์: ๋ค๋ฅธ ๊ฐ์ ์ ํํ๊ธฐ, ์กด์ฌํ๋ ๊ด๋ จ ๋ ์ฝ๋ ์ ํํ๊ธฐ, ๋๋ฝ๋ ํ๋ ์ฑ์ฐ๊ธฐ ๋ฑ์ ๋๋ค.
์ข์ ํ๋ ์์ค ๋ฉ์์ง๊ฐ ํด์ผ ํ ์ผ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ ์คํจ๋ ๊ธฐ์ ์ ์ด๋ฒคํธ์ด์ง๋ง ๊ฒฝํ์ ์ผ๋ฐ ์๋ด์ฒ๋ผ ๋๊ปด์ ธ์ผ ํฉ๋๋ค. ์ข์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ ์ค๋ฅ UX๋ โ๋ญ๊ฐ ๊ณ ์ฅ๋จโ์ โ์ฌ๊ธฐ์ ๋ฌด์์ ๊ณ ์ณ์ผ ํ๋์งโ๋ก ๋ฐ๊ฟ๋๋ค.
ํ์ดํ ์ธ์ด๋ฅผ ์ฐ์ธ์. โunique indexโ๋ โforeign keyโ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฉ์ด๋ฅผ ์ฌ๋ ๋ง๋ก ๋ฐ๊พธ์ธ์. โ์ด ์ด๋ฉ์ผ์ ์ด๋ฏธ ์ฌ์ฉ ์ค์ ๋๋คโ๋ โduplicate key value violates unique constraintโ๋ณด๋ค ํจ์ฌ ์ ์ฉํฉ๋๋ค.
๋์์ด ์ผ์ด๋๋ ๊ณณ์ ๋ฉ์์ง๋ฅผ ๋์ธ์. ์ค๋ฅ๊ฐ ๋ช ํํ ํ๋์ ์ ๋ ฅ์ ์ํ๋ฉด ํด๋น ํ๋์ ๋ถ์ฌ ์ฆ์ ๊ณ ์น ์ ์๊ฒ ํ์ธ์. ์ ์ฒด ๋์ ๋๋ฌธ์ ์คํจํ ๊ฒฝ์ฐ(์: โ์ด ํญ๋ชฉ์ด ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉ ์ค์ด๋ผ ์ญ์ ํ ์ ์์โ)์๋ ์ ์ฅ ๋ฒํผ ๊ทผ์ฒ ๊ฐ์ ํผ ์์ค์ ๋ช ํํ ๋ค์ ๋จ๊ณ์ ํจ๊ป ๋ณด์ฌ์ฃผ์ธ์.
๊ตฌ์ฒด์ฑ์ด ์ ์คํจ๋ณด๋ค ๋ซ์ต๋๋ค. ์ ์ฉํ ๋ฉ์์ง๋ ๋ ๊ฐ์ง ์ง๋ฌธ์ ๋ตํฉ๋๋ค: ๋ฌด์์ ๋ฐ๊ฟ์ผ ํ๋๊ฐ, ๊ทธ๋ฆฌ๊ณ ๊ฑฐ์ ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ. โ๋ค๋ฅธ ์ฌ์ฉ์ ์ด๋ฆ์ ์ ํํ์ธ์โ๋ โ์๋ชป๋ ์ฌ์ฉ์ ์ด๋ฆโ๋ณด๋ค ๋ซ์ต๋๋ค. โ์ ์ฅํ๊ธฐ ์ ์ ๊ณ ๊ฐ์ ์ ํํ์ธ์โ๋ โ๋ฐ์ดํฐ ๋๋ฝโ๋ณด๋ค ๋ซ์ต๋๋ค.
๋ฏผ๊ฐํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ ธ์ถํ์ง ์๋๋ก ์ฃผ์ํ์ธ์. ๋๋ก ๊ฐ์ฅ โ๋์์ด ๋๋โ ๋ฉ์์ง๊ฐ ์ ๋ณด๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค. ๋ก๊ทธ์ธ์ด๋ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ๋ฉด์์ โ์ด ์ด๋ฉ์ผ๋ก๋ ๊ณ์ ์ด ์์ต๋๋คโ๋ผ๊ณ ํ๋ฉด ๊ณต๊ฒฉ์์๊ฒ ์ ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ โ์ผ์นํ๋ ๊ณ์ ์ด ์์ผ๋ฉด ์ด๋ฉ์ผ์ ๋ฐ์กํฉ๋๋คโ์ฒ๋ผ ์์ ํ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
๋ํ ํ ๋ฒ์ ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์์ ๊ณํํ์ธ์. ํ๋์ ์ ์ฅ์ด ์ฌ๋ฌ ์ ์ฝ์์ ์คํจํ ์ ์์ต๋๋ค. UI๋ ์ฌ๋ฌ ํ๋ ๋ฉ์์ง๋ฅผ ํ๊บผ๋ฒ์ ๋ณด์ฌ์ค ์ ์์ด์ผ ํ๋ฉฐ ํ๋ฉด์ ์ด์์ ํ๊ฒ ๋ง๋ค์ง ์์์ผ ํฉ๋๋ค.
๊ฐ๋ ฅํ ํ๋ ์์ค ๋ฉ์์ง๋ ํ์ดํ ๋จ์ด๋ฅผ ์ฐ๊ณ , ์ฌ๋ฐ๋ฅธ ํ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ(๋๋ ๋ช ํํ ํผ ์์ค์์ ํ์), ์ฌ์ฉ์๊ฐ ๋ฌด์์ ๋ฐ๊ฟ์ผ ํ๋์ง ์๋ ค์ฃผ๊ณ , ๊ณ์ ์ด๋ ๋ ์ฝ๋์ ๋ํ ๋ฏผ๊ฐํ ์ฌ์ค์ ๋ ธ์ถํ์ง ์์ผ๋ฉฐ, ํ๋์ ์๋ต์์ ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ์ง์ํฉ๋๋ค.
API์ UI ์ฌ์ด์ ์๋ฌ ๊ณ์ฝ ์ค๊ณ
์ข์ UX๋ ํฉ์์์ ์์๋ฉ๋๋ค: ์คํจํ ๋ API๋ UI์ ์ ํํ ๋ฌด์จ ์ผ์ด ์์๋์ง ์๋ ค์ฃผ๊ณ , UI๋ ํญ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ๊ทธ ๊ณ์ฝ์ด ์์ผ๋ฉด ๊ฒฐ๊ตญ ์๋ฌด๋ ๋์์ด ๋์ง ์๋ ๋ชจํธํ ํ ์คํธ๋ก ๋์๊ฐ๋๋ค.
์ค์ฉ์ ์ธ ์๋ฌ ํํ๋ ์์ง๋ง ๊ตฌ์ฒด์ ์ด์ด์ผ ํฉ๋๋ค. ์์ ์ ์ธ ์๋ฌ ์ฝ๋, ํ๋(๋จ์ผ ์ ๋ ฅ์ผ๋ก ๋งคํ๋ ๋), ์ฌ๋์ฉ ๋ฉ์์ง, ๋ก๊น ์ฉ ์ ํ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ด์์ผ ํฉ๋๋ค.
{
"error": {
"code": "UNIQUE_VIOLATION",
"field": "email",
"message": "That email is already in use.",
"details": {
"constraint": "users_email_key",
"table": "users"
}
}
}
ํต์ฌ์ ์์ ์ฑ์ ๋๋ค. ์ฌ์ฉ์์๊ฒ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์คํธ๋ฅผ ๋ ธ์ถํ์ง ๋ง๊ณ , UI๊ฐ Postgres ์๋ฌ ๋ฌธ์์ด์ ํ์ฑํ๊ฒ ํ์ง ๋ง์ธ์. ์ฝ๋๋ ์น, iOS, Android ๊ฐ์ ํ๋ซํผ๊ณผ ์๋ํฌ์ธํธ ์ ๋ฐ์์ ์ผ๊ด๋์ด์ผ ํฉ๋๋ค.
ํ๋ ์ค๋ฅ์ ํผ ์์ค ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ํํํ ์ง ๋ฏธ๋ฆฌ ์ ํ์ธ์. ํ๋ ์ค๋ฅ๋ ํ ์
๋ ฅ์ด ๋งํ์์ ๋ปํฉ๋๋ค(field๋ฅผ ์ค์ ํ๊ณ ์
๋ ฅ ์๋ ๋ฉ์์ง ํ์). ํผ ์์ค ์ค๋ฅ๋ ํ๋๋ค์ ์ ํจํด ๋ณด์ฌ๋ ๋์์ ์๋ฃํ ์ ์์ ๋ ์ฌ์ฉํ์ธ์(field๋ฅผ ๋น์ ์ ์ฅ ๋ฒํผ ๊ทผ์ฒ์ ๋ฉ์์ง ํ์). ์ฌ๋ฌ ํ๋๊ฐ ๋์์ ์คํจํ ์ ์์ผ๋ฉด field์ code๋ฅผ ๊ฐ์ง ์ค๋ฅ ๋ฐฐ์ด์ ๋ฐํํ์ธ์.
๋ ๋๋ง์ ์ผ๊ด๋๊ฒ ์ ์งํ๋ ค๋ฉด UI ๊ท์น์ ์ง๋ฃจํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋์ธ์: ์ฒซ ๋ฒ์งธ ์ค๋ฅ๋ฅผ ์งง์ ์์ฝ์ผ๋ก ์๋จ์ ๋ณด์ฌ์ฃผ๊ณ ํ๋ ์์ ์ธ๋ผ์ธ์ผ๋ก ํ์, ๋ฉ์์ง๋ ์งง๊ณ ์คํ ๊ฐ๋ฅํ๊ฒ ์ ์ง, ๋ชจ๋ ํ๋ฆ(signup, profile edit, admin ๋ฑ)์์ ๋์ผํ ๋ฌธ๊ตฌ ์ฌ์ฌ์ฉ, details๋ ๋ก๊น
์ฉ์ผ๋ก ๋จ๊ธฐ๊ณ ์ฌ์ฉ์์๊ฒ๋ message๋ง ๋ณด์ฌ์ฃผ๊ธฐ.
AppMaster๋ก ๋น๋ํ๋ค๋ฉด ์ด ๊ณ์ฝ์ ๋ค๋ฅธ API ์ถ๋ ฅ๊ณผ ๋์ผํ๊ฒ ์ทจ๊ธํ์ธ์. ๋ฐฑ์๋๊ฐ ๊ตฌ์กฐํ๋ ํํ๋ฅผ ๋ฐํํ๋ฉด ์์ฑ๋ ์น(Vue3)๊ณผ ๋ชจ๋ฐ์ผ ์ฑ์ด ํ๋์ ๊ณตํต ํจํด์ผ๋ก ๋ ๋๋งํ ์ ์์ด ๋ชจ๋ ์ ์ฝ ์คํจ๊ฐ ์๋ด์ฒ๋ผ ๋๊ปด์ง๊ฒ ํฉ๋๋ค.
๋จ๊ณ๋ณ: DB ์ค๋ฅ๋ฅผ ํ๋ ๋ฉ์์ง๋ก ๋ฐ๊พธ๊ธฐ
์ข์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ ์ค๋ฅ UX๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ต์ข ํ์ฌ๋ก ๋ณด๊ณ ์์ํฉ๋๋ค. ์ฌ์ฉ์๋ ์์ SQL ํ ์คํธ๋ ์คํ ํธ๋ ์ด์ค๋ฅผ ๋ณด์์๋ ์ ๋ฉ๋๋ค. ์ด๋ค ํ๋๋ฅผ ๊ณ ์ณ์ผ ํ๋์ง์ ๋ค์ ๋จ๊ณ๊ฐ ๋ณด์ฌ์ผ ํฉ๋๋ค.
๋๋ถ๋ถ ์คํ์์ ๋์ํ๋ ์ค์ฉ์ ํ๋ฆ:
- ์ค๋ฅ๋ฅผ ์ด๋์ ์ก์์ง ๊ฒฐ์ ํ์ธ์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฅ๊ฐ API ์๋ต์ผ๋ก ๋ฐ๋๋ ํ ๊ณณ์ ์ ํ์ธ์(๋ณดํต ๋ฆฌํฌ์งํ ๋ฆฌ/DAO ๋ ์ด์ด๋ ์ ์ญ ์ค๋ฅ ํธ๋ค๋ฌ). ๊ทธ๋์ผ โ๊ฐ๋์ ์ธ๋ผ์ธ, ๊ฐ๋์ ํ ์คํธโ ๊ฐ์ ํผ๋์ด ์๊ธฐ์ง ์์ต๋๋ค.
- ์คํจ๋ฅผ ๋ถ๋ฅํ์ธ์. ์ฐ๊ธฐ ์์ ์ด ์คํจํ๋ฉด ๊ณ ์ ์ ์ฝ, ์ธ๋ ํค, NOT NULL, ์ฒดํฌ ์ ์ฝ ๋ฑ์ผ๋ก ๋ถ๋ฅํ์ธ์. ๊ฐ๋ฅํ๋ฉด ๋๋ผ์ด๋ฒ ์๋ฌ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ , ๋ถ๋์ดํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ฌ๋ ํ ์คํธ๋ฅผ ํ์ฑํ์ง ๋ง์ธ์.
- ์ ์ฝ๋ช
์ ํผ ํ๋์ ๋งคํํ์ธ์. ์ ์ฝ๋ช
์ ์ข์ ์๋ณ์์ง๋ง UI๋ ํ๋ ํค๊ฐ ํ์ํฉ๋๋ค. ๊ฐ๋จํ ์กฐํํ๋ฅผ ๋์ธ์:
users_email_key -> email,orders_customer_id_fkey -> customerId. ์ด ๋งคํ์ ์คํค๋ง๋ฅผ ์์ ํ ์ฝ๋ ๊ทผ์ฒ์ ๋์ธ์. - ์์ ํ ๋ฉ์์ง๋ฅผ ์์ฑํ์ธ์. DB ์๋ฌธ ๋์ ์ ์ฝ ์ ํ๋ณ๋ก ์งง๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฌธ๊ตฌ๋ฅผ ๋ง๋์ธ์. Unique -> โ์ด ๊ฐ์ ์ด๋ฏธ ์ฌ์ฉ ์ค์ ๋๋ค.โ FK -> โ๊ธฐ์กด ๊ณ ๊ฐ์ ์ ํํ์ธ์.โ NOT NULL -> โ์ด ํ๋๋ ํ์์ ๋๋ค.โ Check -> โ๊ฐ์ด ํ์ฉ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ต๋๋ค.โ
- ๊ตฌ์กฐํ๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ณ ์ธ๋ผ์ธ์ผ๋ก ๋ ๋ํ์ธ์. ์ผ๊ด๋ ํ์ด๋ก๋(์:
[{ field, code, message }])๋ฅผ ๋ณด๋ด์ธ์. UI์์๋ ๋ฉ์์ง๋ฅผ ํ๋์ ๋ถ์ด๊ณ ์ฒซ ์คํจ ํ๋๋ก ์คํฌ๋กคํ๊ณ ํฌ์ปค์คํ๋ฉฐ, ๊ธ๋ก๋ฒ ๋ฐฐ๋๋ ์์ฝ ์ฉ๋๋ก๋ง ์ฐ์ธ์.
AppMaster๋ก ๋น๋ํ๋ค๋ฉด ๊ฐ์ ์๊ฐ์ ์ ์ฉํ์ธ์: ๋ฐฑ์๋์์ DB ์ค๋ฅ๋ฅผ ํ ๊ณณ์์ ์ก์ ์์ธก ๊ฐ๋ฅํ ํ๋ ์ค๋ฅ ํํ๋ก ๋ณํํ๊ณ , ์น ํน์ ๋ชจ๋ฐ์ผ UI์์ ์ ๋ ฅ ์์ ๋ณด์ฌ์ฃผ๋ฉด ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๋ฐ๋์ด๋ ๊ฒฝํ์ด ์ผ๊ด๋ฉ๋๋ค.
ํ์ค์ ์ธ ์: ์ธ ๋ฒ์ ์ ์ฅ ์คํจ, ์ธ ๊ฐ์ง ์ ์ฉํ ๊ฒฐ๊ณผ
์ด ์คํจ๋ค์ ์ข ์ข ํ๋์ ์ผ๋ฐ ํ ์คํธ๋ก ๋ญ๊ฐ์ง๋๋ค. ๊ฐ ์ํฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋๋ผ๋ ์๋ก ๋ค๋ฅธ ๋ฉ์์ง๊ฐ ํ์ํฉ๋๋ค.
1) ๊ฐ์ : ์ด๋ฉ์ผ์ด ์ด๋ฏธ ์ฌ์ฉ ์ค(๊ณ ์ ์ ์ฝ)
์์ ์คํจ(๋ก๊ทธ์ ๋ณด์ด๋ ๊ฒ): duplicate key value violates unique constraint "users_email_key"
์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค์ผ ํ ๊ฒ: โํด๋น ์ด๋ฉ์ผ์ ์ด๋ฏธ ๋ฑ๋ก๋์ด ์์ต๋๋ค. ๋ก๊ทธ์ธํ๊ฑฐ๋ ๋ค๋ฅธ ์ด๋ฉ์ผ์ ์ฌ์ฉํด ๋ณด์ธ์.โ
์ด๋ฉ์ผ ํ๋ ์์ ๋ฉ์์ง๋ฅผ ๋๊ณ ํผ ์ ๋ ฅ์ ์ ์งํ์ธ์. ๊ฐ๋ฅํ๋ฉด โ๋ก๊ทธ์ธโ ๊ฐ์ 2์ฐจ ํ๋์ ์ ๊ณตํด ์ฌ์ฉ์๊ฐ ๋ค์์ ๋ฌด์์ ํด์ผ ํ ์ง ์๊ฒ ํ์ธ์.
2) ์ฃผ๋ฌธ ์์ฑ: ๊ณ ๊ฐ ๋๋ฝ(์ธ๋ ํค)
์์ ์คํจ: insert or update on table "orders" violates foreign key constraint "orders_customer_id_fkey"
์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค์ผ ํ ๊ฒ: โ์ฃผ๋ฌธ์ ์ํด ๊ณ ๊ฐ์ ์ ํํ์ธ์.โ
์ด๊ฑด ์ฌ์ฉ์์๊ฒ โ์ค๋ฅโ๋ผ๊ธฐ๋ณด๋ค ๋งฅ๋ฝ ๋๋ฝ์ผ๋ก ๋๊ปด์ง๋๋ค. ๊ณ ๊ฐ ์ ํ๊ธฐ(Customer selector)๋ฅผ ๊ฐ์กฐํ๊ณ ์ด๋ฏธ ์ถ๊ฐํ ๋ผ์ธ ํญ๋ชฉ์ ์ ์งํ์ธ์. ๋ง์ฝ ๋ค๋ฅธ ํญ์์ ๊ณ ๊ฐ์ด ์ญ์ ๋์๋ค๋ฉด โํด๋น ๊ณ ๊ฐ์ ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๊ณ ๊ฐ์ ์ ํํ์ธ์.โ๋ผ๊ณ ๋ช ์ํ์ธ์.
3) ํ๋กํ ์ ๋ฐ์ดํธ: ํ์ ํ๋ ๋๋ฝ(NOT NULL)
์์ ์คํจ: null value in column "last_name" violates not-null constraint
์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค์ผ ํ ๊ฒ: โ์ฑ(Last name)์ ํ์์ ๋๋ค.โ
์ด๊ฒ ๋ฐ๋ก ์ข์ ์ ์ฝ ์ฒ๋ฆฌ์ ๋ชจ์ต์ ๋๋ค: ์์คํ ์ค๋ฅ์ฒ๋ผ ๋ณด์ด์ง ์๊ณ ์ผ๋ฐ ํผ ํผ๋๋ฐฑ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ง์ํ์ ๋๋ ๊ธฐ์ ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ ธ์ถํ์ง ์์ผ๋ ค๋ฉด ์ ์ฒด ์ค๋ฅ๋ ๋ก๊ทธ(๋๋ ๋ด๋ถ ์ค๋ฅ ํจ๋)์ ๋จ๊ธฐ์ธ์: ์์ฒญ ID์ ์ฌ์ฉ์/์ธ์ ID, ์ ์ฝ๋ช (๊ฐ๋ฅํ๋ฉด), ํ ์ด๋ธ/ํ๋, API ํ์ด๋ก๋(๋ฏผ๊ฐํ ํ๋๋ ๋ง์คํน), ํ์์คํฌํ์ ์๋ํฌ์ธํธ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ๋ฉ์์ง๋ฅผ ํฌํจํ์ธ์.
์ธ๋ ํค ์ค๋ฅ: ์ฌ์ฉ์๊ฐ ํ๋ณตํ๋๋ก ๋๊ธฐ
์ธ๋ ํค ์คํจ๋ ๋ณดํต ์ฌ์ฉ์๊ฐ ์ ํํ ํญ๋ชฉ์ด ๋ ์ด์ ์กด์ฌํ์ง ์๊ฑฐ๋ ํ์ฉ๋์ง ์๊ฑฐ๋ ํ์ฌ ๊ท์น๊ณผ ๋ง์ง ์๋ค๋ ๋ป์ ๋๋ค. ๋ชฉํ๋ ์คํจ๋ฅผ ์ค๋ช ํ๋ ๊ฒ๋ฟ ์๋๋ผ ๋ช ํํ ๋ค์ ๋์์ ์ ์ํ๋ ๊ฒ์ ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ธ๋ ํค ์ค๋ฅ๋ ์ฐธ์กฐํ๋ ์ ํ๊ธฐ ํ ํ๋์ ๋งคํ๋ฉ๋๋ค(๊ณ ๊ฐ, ํ๋ก์ ํธ, ๋ด๋น์ ๋ฑ). ๋ฉ์์ง๋ ๋ด๋ถ ID๋ ํ ์ด๋ธ ์ด๋ฆ ๋์ ์ฌ์ฉ์๊ฐ ์ธ์ํ๋ ๋์์ ์ด๋ฆ์ผ๋ก ๋ถ๋ฌ์ผ ํฉ๋๋ค. โ๊ณ ๊ฐ์ด ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋คโ๋ ์ ์ฉํ์ง๋ง โFK_orders_customer_id violated (customer_id=42)โ๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
ํผํผํ ๋ณต๊ตฌ ํจํด์ ์ด ์ค๋ฅ๋ฅผ ์ค๋๋ ์ ํ(stale selection)์ผ๋ก ๋ค๋ฃน๋๋ค. ์ต์ ๋ชฉ๋ก์์ ๋ค์ ์ ํํ๋๋ก ์ ๋(๋๋กญ๋ค์ด ์๋ก๊ณ ์นจ ๋๋ ๊ฒ์ ์ ํ๊ธฐ ์ด๊ธฐ)ํ์ธ์. ๋ ์ฝ๋๊ฐ ์ญ์ ๋๊ฑฐ๋ ๋ณด๊ด(archived)๋ ๊ฒฝ์ฐ ๋ช ํํ ํ์ํ๊ณ ํ์ฑ ํญ๋ชฉ์ ์ ํํ๋๋ก ์๋ดํ์ธ์. ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ถํ์ ์์๋ค๋ฉด โ์ด ํญ๋ชฉ์ ๋ ์ด์ ์ฌ์ฉํ ๊ถํ์ด ์์ต๋๋คโ๋ผ๊ณ ์๋ฆฌ๊ณ ๋ค๋ฅธ ํญ๋ชฉ์ ์ ํํ๊ฑฐ๋ ๊ด๋ฆฌ์์๊ฒ ๋ฌธ์ํ๋ผ๊ณ ์๋ดํ์ธ์. ๊ด๋ จ ๋ ์ฝ๋ ์์ฑ์ ์ ์์ ์ธ ๋ค์ ๋จ๊ณ๋ก ํ์ฉํ๋ค๋ฉด ๋ฐ๋ณต ์ฌ์๋๋ฅผ ๊ฐ์ํ๊ธฐ๋ณด๋ค โ์ ๊ณ ๊ฐ ๋ง๋ค๊ธฐโ ๊ฐ์ ์ต์ ์ ์ ๊ณตํ์ธ์.
์ญ์ ๋๊ฑฐ๋ ๋ณด๊ด๋ ๋ ์ฝ๋๋ ํํ ํจ์ ์ ๋๋ค. UI์์ ๋นํ์ฑ ํญ๋ชฉ์ ๋ฌธ๋งฅ์ ๋ณด์ฌ์ค ์ ์๋ค๋ฉด(์: Archived๋ก ๋ผ๋ฒจ) ์ ํ์ ๋ง์ ์ด ์คํจ๋ฅผ ๋ฏธ์ฐ์ ๋ฐฉ์งํ์ธ์. ๊ทธ๋๋ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฟ ๋๋ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋๋ก ์ธ๋ ํค ์คํจ๋ ํน์ ํ๋๋ก ์ ํํ ๋งคํํ ์ ์์ ๋ ํผ ์์ค ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค. ์ด๋ค ์ฐธ์กฐ๊ฐ ์ค๋ฅ๋ฅผ ์ผ์ผ์ผฐ๋์ง ํ์คํ ์ ์ ์๊ฑฐ๋ ์ฌ๋ฌ ์ฐธ์กฐ๊ฐ ์๋ชป๋์๊ฑฐ๋ ๊ถํ ๋ฌธ์ ๊ฐ ์ ์ฒด ๋์์ ๊ฑธ์ณ ์๋ค๋ฉด ํผ ์์ค์ผ๋ก ์ฒ๋ฆฌํ์ธ์.
NOT NULL๊ณผ ๊ฒ์ฆ: ์ค๋ฅ๋ฅผ ์๋ฐฉํ๋ ์ฒ๋ฆฌ๋ ํ๋ผ
NOT NULL ์คํจ๋ ์๋ฐฉํ๊ธฐ ๊ฐ์ฅ ์ฝ์ง๋ง ๋น ์ ธ๋๊ฐ๋ฉด ๊ฐ์ฅ ์ฑ๊ฐ์ ๊ฒฝ์ฐ์ ๋๋ค. ํ์ ํ๋๋ฅผ ๋น์๋๊ณ โ์์ฒญ ์คํจโ๋ฅผ ๋ณด๋ ์ฌ์ฉ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ UI ์ ๋ฌด๋ฅผ ๋์ ํ ๊ฒ์ฒ๋ผ ๋๋๋๋ค. ์ข์ ์ ์ฝ ์ค๋ฅ UX๋ UI์์ ๋ช ๋ฐฑํ ๊ฒฝ์ฐ๋ฅผ ๋ง๊ณ , ๊ทธ๋๋ ๋์น๋ฉด API๊ฐ ๋ช ํํ ํ๋ ์์ค ์ค๋ฅ๋ฅผ ๋ฐํํ๊ฒ ํฉ๋๋ค.
๋จผ์ ํผ์์ ์กฐ๊ธฐ ๊ฒ์ฌ๋ฅผ ํ์ธ์. ํ์ ํ๋๋ ์ ๋ ฅ ๊ทผ์ฒ์ ํ์ํ๊ณ (์ผ๋ฐ ๋ฐฐ๋๊ฐ ์๋๋ผ), ์งง์ ํํธ(์: โ์์์ฆ ๋ฐํ์ ํ์ํจโ)๋ฅผ ์ ๊ณตํ๋ฉด ๋นจ๊ฐ ๋ณํ๋ง ์๋ ๊ฒ๋ณด๋ค ์ ์ฉํฉ๋๋ค. ํ๋๊ฐ ์กฐ๊ฑด๋ถ๋ก ํ์๋ผ๋ฉด(์: โ๊ณ์ ์ ํ = ์ฌ์ ์โ์ผ ๋๋ง ํ์ฌ๋ช ํ์) ๊ทธ ๊ท์น์ด ๊ด๋ จ ์์ ์ ๋ณด์ด๋๋ก ํ์ธ์.
UI ๊ฒ์ฆ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ฌ์ฉ์๋ ๊ตฌ๋ฒ์ ์ฑ, ๋ถ์์ ํ ๋คํธ์ํฌ, ๋๋ ์ ๋ก๋, ์๋ํ๋ก ์ฐํํ ์ ์์ต๋๋ค. API์๋ ๊ฐ์ ๊ท์น์ ์ ์ฉํด ์๋ณต์ ๋ญ๋นํ์ง ์๋๋ก ํ์ธ์.
๋ฌธ๊ตฌ๋ฅผ ์ฑ ์ ์ฒด์์ ์ผ๊ด๋๊ฒ ์ ์งํ์ธ์. ๋๋ฝ ๊ฐ์ โํ์์ ๋๋ค(Required)โ, ๊ธธ์ด ์ด๊ณผ๋ โ๋๋ฌด ๊น(์ต๋ 50์)โ, ํ์ ์ค๋ฅ๋ โํ์์ด ์๋ชป๋จ(์: [email protected])โ, ํ์ ๋ฌธ์ ๋ โ์ซ์์ฌ์ผ ํฉ๋๋คโ์ฒ๋ผ ๊ณ ์ ํํ์ ์ฐ๋ฉด ์ฌ์ฉ์๊ฐ ํ์ตํฉ๋๋ค.
๋ถ๋ถ ์ ๋ฐ์ดํธ(PATCH)๋ NOT NULL์์ ๊น๋ค๋กญ์ต๋๋ค. ๊ธฐ์กด ๊ฐ์ด ์๋ค๋ฉด ํ๋๊ฐ ์์ฒญ์์ ๋น ์ ธ๋ ์คํจํ๋ฉด ์ ๋์ง๋ง, ํด๋ผ์ด์ธํธ๊ฐ ๋ช ์์ ์ผ๋ก null์ด๋ ๋น๊ฐ์ผ๋ก ๋ณด๋๋ค๋ฉด ์คํจํด์ผ ํฉ๋๋ค. ์ด ๊ท์น์ ํ ๋ฒ ์ ํด ๋ฌธ์ํํ๊ณ ์ผ๊ด๋๊ฒ ์ ์ฉํ์ธ์.
์ค์ฉ์ ์ธ ์ ๊ทผ์ ์ธ ๊ณ์ธต์์ ๊ฒ์ฆํ๋ ๊ฒ์ ๋๋ค: ํด๋ผ์ด์ธํธ ํผ ๊ท์น, API ์์ฒญ ๊ฒ์ฆ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค NOT NULL ์ค๋ฅ๋ฅผ ์ก์ ์ฌ๋ฐ๋ฅธ ํ๋๋ก ๋งคํํ๋ ์ต์ข ์์ ๋ง.
โ์์ฒญ ์คํจโ๋ก ๋๋์๊ฐ๊ฒ ํ๋ ํํ ์ค์๋ค
์ ์ฝ ์ฒ๋ฆฌ๋ฅผ ๋ง์น๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์๊ณ ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ง ๋งก๊ธฐ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ผ๋ฐ ํ ์คํธ๋ก ์จ๊ธฐ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๋ ์ ์ฝ์ด ๋ฐ๋ํ๋ค๋ ์ฌ์ค ์์ฒด์๋ ๊ด์ฌ์ด ์์ต๋๋ค. ๊ทธ๋ค์ด ๊ถ๊ธํ ๊ฒ์ ๋ฌด์์, ์ด๋์, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ํ์ง์ ๋๋ค.
ํํ ์ค์ ์ค ํ๋๋ ์์ DB ํ
์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์
๋๋ค. duplicate key value violates unique constraint ๊ฐ์ ๋ฉ์์ง๋ ๋ณต๊ตฌํ ์ ์๋ ๋ฌธ์ ๋ ์์คํ
๋ถ๊ดด์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค. ์ฌ์ฉ์๋ ๋ฌด์์ด ํ
์คํธ๋ฅผ ๋ณต์ฌํด ์ง์์ ๋ณด๋ด๊ณ ์ค์ ๋ก ํ๋๋ฅผ ๊ณ ์น์ง ์์ต๋๋ค.
๋ค๋ฅธ ํจ์ ์ ๋ฌธ์์ด ๋งค์นญ์ ์์กดํ๋ ๊ฒ์ ๋๋ค. ๋๋ผ์ด๋ฒ๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ Postgres๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ์ ์ฝ๋ช ์ ๋ฐ๊พธ๋ฉด ๋งคํ์ด ๋ณด์ด์ง ์๊ฒ ๋๊ณ โ์ด๋ฉ์ผ ์ด๋ฏธ ์ฌ์ฉ ์คโ ๋งคํ์ด ์กฐ์ฉํ ๊นจ์ง๋๋ค. ์์ ์ ์ธ ์๋ฌ ์ฝ๋์ UI๊ฐ ์ดํดํ๋ ํ๋๋ช ์ ํฌํจํ๋ ๋ฐฉ์์ด ์ข์ต๋๋ค.
์คํค๋ง ๋ณ๊ฒฝ์ ํ๋ ๋งคํ์ ์๊ฐ๋ณด๋ค ์์ฃผ ๊นจ๋จ๋ฆฝ๋๋ค. email์ primary_email๋ก ๋ฐ๊พธ๋ฉด ๋ช
ํํ ๋ฉ์์ง๊ฐ ํ์๋ ์๋ฆฌ๋ฅผ ์์ ์ ์์ต๋๋ค. ๋งคํ์ ๋ง์ด๊ทธ๋ ์ด์
๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ธํธ์ ์ผ๋ถ๋ก ๋ง๋ค๊ณ , ํ๋ ํค๊ฐ ์๋ ค์ง์ง ์์์ ๋ ํ
์คํธ์์ ์คํจํ๊ฒ ํ์ธ์.
ํฐ UX ํ๊ดด์๋ ๋ชจ๋ ์ ์ฝ ์คํจ๋ฅผ ๋ณธ๋ฌธ ์๋ HTTP 500์ผ๋ก ๋๋ ค๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด UI๋ โ์๋ฒ ์ค๋ฅโ๋ผ๊ณ ๋ง ํ๋จํด ํ๋ ํํธ๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ ์ฝ ์คํจ๋ ์ฌ์ฉ์๊ฐ ๊ณ ์น ์ ์์ผ๋ฏ๋ก ๊ฒ์ฆ ์คํ์ผ์ ์๋ต๊ณผ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ฐํํ์ธ์.
์ฃผ์ํ ํจํด๋ค:
- ๊ณ ์ ์ด๋ฉ์ผ ๋ฉ์์ง๊ฐ ๊ณ์ ์กด์ฌ๋ฅผ ํ์ธ์์ผ ์ฃผ๋ ๊ฒฝ์ฐ(๊ฐ์ ํ๋ฆ์์๋ ์ค๋ฆฝ์ ๋ฌธ๊ตฌ ์ฌ์ฉ)
- โํ ๋ฒ์ ํ๋์ ์ค๋ฅ๋งโ ์ฒ๋ฆฌํด ๋ ๋ฒ์งธ ๊นจ์ง ํ๋๋ฅผ ์จ๊ธฐ๋ ๊ฒฝ์ฐ
- ๋ค๋ก/๋ค์ ํด๋ฆญ์ผ๋ก ๋ค๋จ๊ณ ํผ์์ ์ค๋ฅ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒฝ์ฐ
- ์ฌ์๋๊ฐ ์ค๋๋ ๊ฐ์ ์ ์ถํด ์ฌ๋ฐ๋ฅธ ํ๋ ๋ฉ์์ง๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒฝ์ฐ
- ๋ก๊น ์ด ์ ์ฝ๋ช ์ด๋ ์๋ฌ ์ฝ๋๋ฅผ ๋ฒ๋ ค ๋ฒ๊ทธ ์ถ์ ์ ์ด๋ ต๊ฒ ํ๋ ๊ฒฝ์ฐ
์์ปจ๋ ๊ฐ์ ํผ์ด โ์ด๋ฉ์ผ์ด ์ด๋ฏธ ์กด์ฌํจโ์ด๋ผ๊ณ ํ๋ฉด ๊ณ์ ์กด์ฌ๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค. ์ด๋ฉ์ผ ํ๋์๋ ์ค๋ฅ๋ฅผ ๋ถ์ด๋ ์ฌ์ฉ์์๊ฒ๋ โ์ด๋ฉ์ผ์ ํ์ธํ๊ฑฐ๋ ๋ก๊ทธ์ธํด ๋ณด์ธ์โ์ฒ๋ผ ์ค๋ฆฝ์ ์ธ ๋ฌธ๊ตฌ๋ฅผ ์ฐ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
๋ฐฐํฌ ์ ๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ
๋ฐฐํฌ ์ ์๋ ์ ์ฝ ์คํจ๊ฐ ์ ์ฉํ ํํธ๊ฐ ๋ ์ง ๋ง๋ค๋ฅธ ๊ธธ์ด ๋ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์์ ๋ํ ์ผ๋ค์ ์ ๊ฒํ์ธ์.
API ์๋ต: UI๊ฐ ์ค์ ๋ก ๋์ํ ์ ์๋๊ฐ?
๊ฐ ๊ฒ์ฆ ์คํ์ผ ์คํจ๊ฐ ํน์ ์
๋ ฅ์ ๊ฐ๋ฆฌํฌ ์ ์๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ฐํํ์ธ์. ๊ฐ ์ค๋ฅ์ field, ์์ ์ ์ธ code, ์ฌ๋์ด ์ฝ์ message๋ฅผ ํฌํจํ์ธ์. ๊ณ ์ , ์ธ๋ ํค, NOT NULL, ์ฒดํฌ ๊ฐ์ ์ผ๋ฐ DB ์ฌ๋ก๋ฅผ ์ปค๋ฒํ๊ณ ๊ธฐ์ ์ ์ธ๋ถ ์ ๋ณด๋ ๋ก๊ทธ์๋ง ๋จ๊ธฐ์ธ์.
UI ๋์: ์ฌ์ฉ์๊ฐ ํ๋ณตํ ์ ์๊ฒ ๋๋๊ฐ?
์๋ฒฝํ ๋ฉ์์ง๋ ํผ์ด ์ฌ์ฉ์๋ฅผ ๋ฐฉํดํ๋ฉด ์ข์ง ์์ต๋๋ค. ์ฒซ ์คํจ ํ๋์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ๊ณ ํ์ํ๋ฉด ์คํฌ๋กค๋ก ๋ณด์ด๊ฒ ํ์ธ์. ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ์ ๋ ฅํ ๋ด์ฉ์ ๋ณด์กดํ์ธ์(ํนํ ์ฌ๋ฌ ํ๋ ์ค๋ฅ๊ฐ ์์ ๋). ํ๋ ์์ค ์ค๋ฅ๋ฅผ ์ฐ์ ๋ณด์ฌ์ฃผ๊ณ ์์ฝ ๋ฐฐ๋๋ ๋ณด์กฐ์ ์ผ๋ก ์ฌ์ฉํ์ธ์.
๋ก๊น ๊ณผ ํ ์คํธ: ํ๊ท๋ฅผ ์ก๋๊ฐ?
์ ์ฝ ์ฒ๋ฆฌ๋ ์คํค๋ง ๋ณ๊ฒฝ ๋ ์กฐ์ฉํ ๊นจ์ง๊ธฐ ์ฝ์ต๋๋ค. DB ์ค๋ฅ(์ ์ฝ๋ช , ํ ์ด๋ธ, ์์ , ์์ฒญ ID)๋ฅผ ๋ด๋ถ ๋ก๊ทธ์ ๋จ๊ธฐ๋ ์ ๋ ์์ ํ ์คํธ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ์ง ๋ง์ธ์. ๊ฐ ์ ์ฝ ์ ํ๋ณ๋ก ์ต์ ํ๋์ฉ ํ ์คํธ๋ฅผ ์ถ๊ฐํด ๋งคํ์ด ์คํค๋ง ๋ณ๊ฒฝ์ด๋ ๋๋ผ์ด๋ฒ ์ ๋ฐ์ดํธ์๋ ์์ ์ ์ผ๋ก ์ ์ง๋๋์ง ํ์ธํ์ธ์.
๋ค์ ๋จ๊ณ: ์ฑ ์ ๋ฐ์ ์ผ๊ด๋๊ฒ ์ ์ฉํ๊ธฐ
๋๋ถ๋ถ ํ์ ์ ์ฝ ์ค๋ฅ๋ฅผ ํ๋ฉด ๋จ์๋ก ๊ณ ์นฉ๋๋ค. ๊ทธ๊ฑด ๋์์ด ๋์ง๋ง ์ฌ์ฉ์๋ ๊ฒฉ์ฐจ๋ฅผ ๋๋๋๋ค: ํ ํผ์ ๋ช ํํ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ค๋ฅธ ํผ์ ์ฌ์ ํ โ์์ฒญ ์คํจโ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ผ๊ด์ฑ์ด ํจ์น๋ฅผ ํจํด์ผ๋ก ๋ฐ๊ฟ๋๋ค.
๋จผ์ ์ํ ๊ณณ๋ถํฐ ์์ํ์ธ์. ์ผ์ฃผ์ผ ์น ๋ก๊ทธ๋ ์ง์ ํฐ์ผ์ ์ดํด๋ณด๊ณ ์์ฃผ ๋ฐ์ํ๋ ์ ์ฝ ๋ช ๊ฐ์ง๋ฅผ ๊ณจ๋ผ ์ฐ์ ์น์ ํ ํ๋ ์์ค ๋ฉ์์ง๋ฅผ ์ ์ฉํ์ธ์.
์ค๋ฅ ๋ฒ์ญ์ ์์ ์ ํ ๊ธฐ๋ฅ์ผ๋ก ์ทจ๊ธํ์ธ์. ์ฑ ์ ์ฒด์์ ์ฐ๋ ํ๋์ ๊ณต์ ๋งคํ์ ์ ์งํ์ธ์: ์ ์ฝ๋ช (๋๋ ์ฝ๋) -> ํ๋ ์ด๋ฆ -> ๋ฉ์์ง -> ๋ณต๊ตฌ ํํธ. ๋ฉ์์ง๋ ํ์ดํ ์ธ์ด๋ก, ํํธ๋ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋์ธ์.
๋ฐ์ ์ ํ ์ฌ์ดํด์ ๋ง๋ ๊ฐ๋ฒผ์ด ๋ฐฐํฌ ๊ณํ:
- ์ฌ์ฉ์๋ค์ด ์์ฃผ ๊ฒช๋ 5๊ฐ์ง ์ ์ฝ์ ์๋ณํ๊ณ ๋ณด์ฌ์ค ์ ํํ ๋ฌธ๊ตฌ๋ฅผ ์์ฑํ์ธ์.
- ๋งคํ ํ ์ด๋ธ์ ์ถ๊ฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ชจ๋ ์๋ํฌ์ธํธ์์ ์ฌ์ฉํ์ธ์.
- ํผ์ด ์ค๋ฅ๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ์์ ํ์คํํ์ธ์(๊ฐ์ ์์น, ๊ฐ์ ์ด์กฐ, ๊ฐ์ ํฌ์ปค์ค ๋์).
- ๋น๊ธฐ์ ๋๋ฃ์ ๋ฉ์์ง๋ฅผ ๊ฒํ ํ๊ณ โ๋ค์์ ๋ฌด์์ ํ๊ฒ ๋๊ฐ?โ๋ผ๊ณ ๋ฌผ์ด๋ณด์ธ์.
- ๊ฐ ํผ์ ๋ํด ํ๋์ ํ ์คํธ๋ฅผ ์ถ๊ฐํด ์ฌ๋ฐ๋ฅธ ํ๋๊ฐ ๊ฐ์กฐ๋๊ณ ๋ฉ์์ง๊ฐ ์ฝ๊ธฐ ์ฌ์ด์ง ํ์ธํ์ธ์.
์์ ๋ชจ๋ ํ๋ฉด์ ๊ตฌํํ์ง ์๊ณ ๋ ์ด ์ผ๊ด๋ ๋์์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด AppMaster(appmaster.io)์ด ๋ฐฑ์๋ API์ ์์ฑ๋ ์น/๋ค์ดํฐ๋ธ ์ฑ์ ์ง์ํฉ๋๋ค. ํ๋์ ๊ตฌ์กฐํ๋ ์๋ฌ ํ์์ ํด๋ผ์ด์ธํธ ์ ๋ฐ์์ ์ฌ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๋ฐ๋์ด๋ ํ๋ ์์ค ํผ๋๋ฐฑ์ด ์ผ๊ด๋๊ฒ ์ ์ง๋ฉ๋๋ค.
ํ์ ์ํ ์งง์ โ์ค๋ฅ ๋ฉ์์ง ์คํ์ผโ ๋ ธํธ๋ ์์ฑํ์ธ์. ๊ฐ๋จํ ์ ๋ฆฌํ์ธ์: ์ด๋ค ๋จ์ด๋ฅผ ํผํ ์ง(๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฉ์ด), ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋ฉ์์ง์ ๋ฐ๋์ ํฌํจํ ๊ฒ(๋ฌด์จ ์ผ์ด ์์๋์ง, ๋ค์์ ๋ฌด์์ ํ ์ง).
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
์ผ๋ฐ์ ์ธ ์์คํ ์ค๋ฅ์ฒ๋ผ ๋ณด์ด์ง ์๊ฒ ํ์ธ์. ์์ ํด์ผ ํ ์ ํํ ํ๋ ์์ ์งง์ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ด์ฉ์ ์ ์งํ๋ฉฐ ๋ค์ ๋จ๊ณ(๋ฌด์์ ํ๋ฉด ๋๋์ง)๋ฅผ ํ์ดํ ์ธ์ด๋ก ์๋ ค์ฃผ๋ฉด ๋ฉ๋๋ค.
ํ๋ ์์ค ์ค๋ฅ๋ ํน์ ์ ๋ ฅ์ ๊ฐ๋ฆฌํค๋ฉฐ ๊ฑฐ๊ธฐ์ ๋ฐ๋ก ๋ฌด์์ ๊ณ ์ณ์ผ ํ๋์ง ์๋ ค์ค๋๋ค(์: โ์ด ์ด๋ฉ์ผ์ ์ด๋ฏธ ์ฌ์ฉ ์ค์ ๋๋คโ). ๋ฐ๋ฉด ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ ๋ฌด์์ ๋ฐ๊ฟ์ผ ํ ์ง ์๋ ค์ฃผ์ง ์์ ์ฌ์ฉ์๊ฐ ์ถ์ธกํ๊ฑฐ๋ ์ฌ์๋ํ๊ฑฐ๋ ์ง์์ ๋ฌธ์ํ๊ฒ ๋ง๋ญ๋๋ค.
๊ฐ๋ฅํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ์ ์์ ์ ์ธ ์๋ฌ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๋ฅผ ๊ณ ์ (unique), ์ธ๋ ํค(foreign key), ํ์(required), ๋ฒ์(check) ๊ฐ์ ์ฌ์ฉ์ ์นํ์ ์ ํ์ผ๋ก ๋งคํํ์ธ์. ์์ DB ํ ์คํธ๋ฅผ ํ์ฑํ๋ ๋ฐฉ์์ ๋๋ผ์ด๋ฒ๋ ๋ฒ์ ์ด ๋ฐ๋๋ฉด ๊นจ์ง๋๋ค.
์คํค๋ง๋ฅผ ๊ด๋ฆฌํ๋ ์ฝ๋ ๊ทผ์ฒ์ ์ ์ฝ๋ช
โUI ํ๋ ํค ๋งคํ์ ๋์ธ์. ์: users_email_key โ email. ์ด๋ ๊ฒ ํ๋ฉด UI๊ฐ ์ถ์ธกํ์ง ์๊ณ ์ ํํ ์
๋ ฅ์ ๊ฐ์กฐํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๊ตฌ๋ โ์ด ๊ฐ์ ์ด๋ฏธ ์ฌ์ฉ ์ค์ ๋๋คโ์ฒ๋ผ ํ๊ณ , ํ๋ฆ์ ๋ฐ๋ผ โ๋ค๋ฅธ ๊ฐ์ ์๋ํ์ธ์โ ๋๋ โ๋ก๊ทธ์ธํ์ธ์โ ๊ฐ์ ๋ค์ ๋์์ ํจ๊ป ์ ์ํ์ธ์. ๊ฐ์ ์ด๋ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ์์๋ ๊ณ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ ธ์ถํ์ง ์๋๋ก ์ค๋ฆฝ์ ์ธ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
์ฌ์ฉ์๊ฐ ์ธ์ํ๋ ํญ๋ชฉ ์ด๋ฆ์ผ๋ก ์ค๋ช ํ์ธ์: โํด๋น ๊ณ ๊ฐ์ด ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๊ณ ๊ฐ์ ์ ํํ์ธ์.โ ์ ํ์ง๋ฅผ ์๋ก ๊ณ ์นํ๊ฑฐ๋, ์ฌ์ฉ ๊ถํ์ด ์์ ๊ฒฝ์ฐ ๊ด๋ฆฌ์์๊ฒ ๋ฌธ์ํ๋ผ๊ณ ์๋ดํ๊ฑฐ๋, ๊ด๋ จ ๋ ์ฝ๋๋ฅผ ์๋ก ๋ง๋ค ์ ์๋ค๋ฉด ๊ทธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ก ์ ๊ณตํ์ธ์.
UI์์ ํ์ ์ ๋ ฅ์ ํ์ํ๊ณ ์ ์ก ์ ์ ๊ฒ์ฆํ์ธ์. ํ์ง๋ง ๋คํธ์ํฌ ๋ฌธ์ , ๊ตฌ๋ฒ์ ์ฑ, ๋๋ ์ ๋ก๋ ๋ฑ์ผ๋ก UI ๊ฒ์ฆ์ ์ฐํํ ์ ์์ผ๋, API์ DB ๋ ์ด์ด์์๋ ๊ฐ์ ๊ท์น์ ๊ฒ์ฆํ๊ณ ์ต์ข ์ ์ผ๋ก NOT NULL ์ค๋ฅ๋ฅผ ์ก์ ์ ์ ํ ํ๋ ์ค๋ฅ๋ก ๋งคํํด์ผ ํฉ๋๋ค.
์๋ฌ ๋ฐฐ์ด๋ก ๊ฐ ์ค๋ฅ์ field, ์์ ์ ์ฝ๋(code), ์งง์ ๋ฉ์์ง๋ฅผ ํฌํจํด ๋ฐํํ์ธ์. ํด๋ผ์ด์ธํธ์์๋ ์ฒซ ๋ฒ์งธ ์คํจ ํ๋์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ๋ ๋ค๋ฅธ ๋ฉ์์ง๋ ํจ๊ป ๋ณด์ฌ ์ฌ์ฉ์๊ฐ ํ ๋ฒ์ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค.
์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ๋ฉ์์ง์ ๋ด๋ถ ๋ก๊น ์ฉ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ถ๋ฆฌํ์ธ์. ์ฌ์ฉ์์ฉ ๋ฉ์์ง์ ๋ด๋ถ์ฉ ์ธ๋ถ(์ ์ฝ๋ช , ์์ฒญ ID ๋ฑ)๋ฅผ ํจ๊ป ๋ฐํํ๋, ์์ SQL ์๋ฌ ํ ์คํธ๋ ์ ๋ ๋ ธ์ถํ์ง ๋ง์ธ์.
๋ฐฑ์๋์์ ํ ๊ตฐ๋ฐ์ ๋ฒ์ญ์ ์ค์ํํ๊ณ ์์ธก ๊ฐ๋ฅํ ์๋ฌ ํ์์ ๋ฐํํ์ธ์. AppMaster๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ผํ ๊ตฌ์กฐํ๋ ์๋ฌ ๊ณ์ฝ์ ์น๊ณผ ๋ชจ๋ฐ์ผ์ ์ฌ์ฌ์ฉํ ์ ์์ด ๋ฉ์์ง๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋ฉ๋๋ค.


