- ๐ก ์ ํ์ํ ๋ ๋ฐฐ์ด ๊ธฐ์ ๋ค์ ํ ๋๋ก, 3๋ฐ 4์ผ๊ฐ ๋ฏธ๋ ํ๋ก์ ํธ๋ฅผ ์์ฑํด๋ณด์ธ์.
- ์๋ก์ด ํ์๋ค๊ณผ ์งง์ ๊ธฐ๊ฐ๋์ ์๋ฏธ์๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด ๋์ผ๋ก์,
3๋ฐ 4์ผ๊ฐ ๋ฏธ๋ ์ ๊ธ ํ๋ก๊ทธ๋จ์ ์ฒดํํฉ๋๋ค. ํจ๊ป ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๊ฐ๋ ์ฌ๋ฏธ๋ฅผ ๋๊ปด๋ณด์ธ์!
์
์ํ์๋ง์ 3์ผ ๋์ ์งํํ๋ ๋ฏธ๋ ํ๋ก์ ํธ.
์
ํ ์ํ๋ ์ตํ๋ ๊ฒ๋ค์ ๋ฐํ์ผ๋ก ๊ฐ๋จํ ์์ฃผ ๊ฐ๋จํ ์น์๋น์ค๋ฅผ ๊ตฌํํ์ฌ
๋๋ฉ์ธ๊น์ง ๋ถ์ฌ ์ ์ถํด์ผ ํ๋ค.
์๋์ ๊ฐ์ ์ฃผ๋ฌธ ์ฌํญ์ด ์์๋ค.
ํ์ ํฌํจ ์ฌํญ
- ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
- Jinja2 ํ ํ๋ฆฟ ์์ง์ ์ด์ฉํ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง
๋ ๊ณ ๋ฏผํด๋ณผ ํค์๋
- Bootstrap์ ๋์ฒดํ CSS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ (Bulma, Tailwind ๋ฑ)
- JWT ์ธ์ฆ ๋ฐฉ์์ผ๋ก ๋ก๊ทธ์ธ์ ๊ตฌํํ๊ธฐ (์ฟ ํค/์ธ์ ๋๋น ๋ฑ์ฅํ๊ฒ ๋ ๋ฐฐ๊ฒฝ์?)
์ฐ๋ฆฌํ์ Tailwind ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ JWT ์ธ์ฆ ๋ฐฉ์์ ๋ก๊ทธ์ธ์ ๋ชจ๋ ๊ตฌํํ๊ธฐ๋ก ํ๋ค.
๋ถ๋งํฌ๋ฅผ ๊ผญ ์ฝ๊ฒ ํด์ฃผ์๋ ์ทจ์ง์์ ์์ํ๋ค.
ํ์์ ๊ตฌ์ฑํด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์์ ์๋ก ๋ถ๋งํฌ๋ฅผ ๊ณต์ ํ ์ ์๋ค.
๋ถ๋งํฌ๋ฅผ ๋ฑ๋กํ ๋ ๊ฐ์ด ๋ฑ๋กํ๋ ํด์ฆ๋ฅผ ํ์ด์ผ ํด๋น ๋ถ๋งํฌ๊ฐ ์ฝ์ ์ฒ๋ฆฌ ๋๊ณ ,
๊ทธ์ ๋ฐ๋ผ ์์ ์ ์งํ์ํฉ์ ์
๋ฐ์ดํธ ๋๋ค.
๋ค๋ฅธ ํ์๋ค์ ์งํ์ํฉ์ ๊ทธ๋ํ๋ก ํ์ธํ ์ ์๋ค.
์ด์ฉ๋ค ๋ณด๋ ๋๋ ์ฃผ๋ก ํ๋ก ํธ์์
์ ํ๊ฒ ๋์๋ค.
Tailwind
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ํด์ง๊ณ ํ์ด์ง ์๋จ์ ๋๋กญ๋ค์ด์ด๋ ์งํ์ํฉ ๊ทธ๋ํ ์ ๋๋ฉ์ด์
๊ตฌํ์ ์ํด ๊ณต์ ๋ค์๋ค.
Bootstrap๊ณผ ๊ฐ์ css ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋์์ธ์ด ์ฉ ๊ด์ฐฎ๊ณ , ๋ถํธ์คํธ๋ฉ๊ณผ ๋น์ทํ ์ฌ์ฉ๋ฐฉ์์ด์ด์ ๋์ ํด ๋ณด์๋ค. ๊ทธ ๊ฒฐ๊ณผ ํํํ๋ค.
3์ผ์ง๋ฆฌ ํ๋ก์ ํธ์๊ธฐ์, ๋น ๋ฅด๊ฒ ํ๋ก ํธ ์์
์ ๋ง์น๊ณ JWT ํ์ฉ๊ณผ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ์ง์คํด๋ณด๊ณ ์ถ์๋ค. Tailwind
์์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ (tailwindui.com) ์ค ๋ฌด๋ฃ์ธ ๊ฒ๋ค์ ๊ทธ๋๋ก ๋ณต์ฌํด ์ฌ์ฉํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ 2์ผ์ฐจ ์ ๋
๊น์ง ํ์ด์ง ๋ ์ด์์์ ๋ถ์ก๊ณ ์์๋ค.
Using HTML and your own JS
ย The vast majority of components don't need JavaScript at all and are completely ready to go out of the box, but things that are interactive like dropdowns, modals, etc. require you to write some JS to make them work the way you'd expect.
... https://tailwindui.com/documentation#using-html-and-your-own-js
์ด์ ๋ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ์์ html๋ก ๋ฌด๋ฃ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด JavaScript๋ฅผ ์ง์ ์ง์ผํ๋ค.
ํ์๋ค ์ค ๋ทฐ๋ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฌ๋์ด ์์๊ณ , ํ๋ก์ ํธ ์๋ด์๋ ์
ํ์ํ ๊ธฐ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ํ๋ ์์์ ์ฌ์ฉ์ ์ง์ํด๋ฌ๋ผ๋ ์ธ๊ธ์ด ์์ด ๊ฒฐ๊ตญ ์ง์ ๊ตฌํ์ ํ๋ค.
ํนํ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋๋กญ๋ค์ด ๋ํ ์ง์ ์ ๋๋ฉ์ด์
์ ์ฃผ์ด์ผ ํ๊ณ ,
์งํ์ํฉ ํ์ ๋ถ๋ถ์ ์ฌ์ฉ๋๋ chevron์ ํ์ ์ ๋๋ฉ์ด์
, ์งํ์ํฉ ๋ฐ(bar)๊ฐ ์ฑ์์ง๋ ์ ๋๋ฉ์ด์
, ํ์๋ค์ ์งํ์ํฉ ๋ฐ์ ๋ํ show/hide ์ ๋๋ฉ์ด์
๋ฑ์ ๊ตฌํํ๋๋ผ ์ ๋ฅผ ์ข ๋จน์๋ค.
(codepen์์ ์ฐพ์ ์งํ๋ฐ : https://codepen.io/ugross/pen/pobepe)
Tailwind CSS IntelliSense
๋ถํธ์คํธ๋ฉ๊ณผ ๋น์ทํ๋๋ผ๋ ์กฐ๊ธ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ณต์ ํ์ด์ง์ vscode๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์์
ํ์๋๋ฐ, intellisense
๋ผ๋ ์ต์คํ
์
์ด ์๋ค๋ ๊ฑธ ๋์ค์์ผ ์๊ฒ ๋์๋ค.
์ด์จ๋ ๋์ค์๋ผ๋ ๋ฆฌ์กํธ๋ ๋ทฐ๋ฅผ ์ตํ๊ฒ ๋๋ค๋ฉด ๋ค์ ๋์ ํด ๋ณด๊ณ ์ถ๋ค.
ํด๋น ๋ถ๋ถ์ ๋ค๋ฅธ ํ์๋ถ์ด ๊ตฌํ์ ๊ฑฐ์ ์ ๋ดํ์
์ ๋๋ ์ค๋ช
๋ง ๋ค์๋ค.
์งํํ๋ฉด์ ๊ธฐ์ต์ ๋จ์๋ ์ ์, ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํ ํฐ๋ฐฉ์์ ์ธ์ฆ์ด ์๊พธ๋ง ์๋ก ๋ถ๋ชํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ค ์ด์ ์์ ๊ฐ ์ฟ ํค์ ํ ํฐ์ ๋ด๋ ๋ฐฉ์์ด ์ ๋์ง ์์๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋ ์ฌ์ฉ์ ์์ฒญ url์ token ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฌ์ ํ ํฐstring์ ๋ถ์ฌ์ฃผ์๋ค. html ์ปดํฌ๋ํธํ๋ ํ์ง ๋ชปํ ์ํ์์ ๋ง์ง๋ง์ ์์ ํ๋๋ผ๋ ์๊ธฐ๋ฉด ๊ฑฐ์ ์ด๋๊ฐ์ html ํ์ผ์ ์์ ํด์ผ ํ๋ค. ๋๋ถ์ ์๋ฒฝ 5์์ ํ๋์ ์ฝ๋ฉ์ผ(a.k.a. ๋ฆฌ๋ฌ๊ฒ์)๋ฅผ ๋ณผ ์ ์์๋ค. (thanks to ํ๋ ์๊ฐ๋ฝ๊ณผ ํค๋ณด๋, vim, ... )
์๋๋ ํ๋์ ์ค๋ช ๊ณผ Youtube ์์(์ธ์ vs ํ ํฐ vs ์ฟ ํค? ๊ธฐ์ด๊ฐ๋ ์ก์๋๋ฆผ. 10๋ถ ์์ญ! - ๋ ธ๋ง๋์ฝ๋)์ ํตํด ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค.
- ์ฟ ํค
์๋ฒ์ response์ ํฌํจ๋์ด ์ฒ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋์ด ์ ์ฅ๋๊ณ , ํด๋ผ์ด์ธํธ๋ ๋ค์ ์์ฒญ๋ถํฐ์ฟ ํค
๋ฅผ ํค๋์ ํฌํจ์์ผ ๋ณด๋์ผ๋ก์จ ์๋ฒ๊ฐ ์ฌ์ฉ์์ ๋ง๋ ์๋ต์ ๋ณด๋ผ ์ ์๋ค.
์ฟ ํค๋ ๋งค๊ฐ์ฒด!- ์ธ์
์ฟ ํค๋ฅผ ํ์ฉํ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐฉ์.์ธ์
์์ด๋๋ ์ฟ ํค์ ์ ์ฅ๋์๊ณ , ์ ์ ์ ๋ณด๋ ์๋ฒ์ Session DB์์ธ์
์์ด๋๋ก ํน์ ๋ ์ ์๋ ์ํ๋ก ์ ์ฅ๋จ. ์ฟ ํค๋์ธ์
์์ด๋๋ฅผ ์ ๋ฌํ๊ธฐ์ํ ๋งค๊ฐ์ฒด.- ํ ํฐ
์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์ฉ. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์กด์ฌ์ ์๋ฒ์์ ํต์ ์ ์ํดํ ํฐ
ํ์ฉ ๊ฐ๋ฅ.
ํ ํฐ
์ ๊ธด string.- JWT
์ ๋ณด๋ฅผ ๋ดํฌํ๊ณ ์๋ ํ ํฐ. ๋ชฉ์ ์ DB์์ด ์ฌ์ฉ์ ๊ฒ์ฆํ๊ธฐ. ์ฌ์ฉ์ ์ ๋ณด๊ฐ db์ ๋ฐ๋ก ์ ์ฅ๋์ง ์๊ณ , string ์์ฒด์ encode๋์ด์์. ์๋ฒ๊ฐ ํ ํฐ์ 'sign' (using signature algorithm ์ด์ฉ) ํด์ ์ฌ์ฉ์์๊ฒ ๋ณด๋ด์ค๋ค. ์ฌ์ฉ์๊ฐ ์์ฒญ์ ํ ํฐ์ ํฌํจํ์ฌ ์๋ฒ์ ๋ณด๋ด๋ฉด (ex. ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค, QR์ฝ๋์ ๊ทธ๊ฑธ ์ฐ๋ ๋ค๋ฅธ ๊ธฐ๊ธฐ์ ์ดํ), ์๋ฒ๋ ๊ทธ ํ ํฐ์ ์ฌ์ธ์ด ์ ํจํ์ง ํ์ธํ ํ ๋ฐ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ๋ํ ์ ์๋ค.
QR code -> JWT ์ธ์ฆ์ ์ฌ๋ก
์ธ์ vs ํ ํฐ
- ์ธ์
- ํน์ ์ ์ ์ ์ธ์ฆ ์ํ๋ฅผ ํด์ ํ๊ณ ์ถ์ ๋ ๋จ์ํ
์ธ์
์ ์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ง์ฐ๋ฉด ๋๋ค.- db๋ฅผ ์ฌ๊ณ ์ ์งํด์ผํ๋ค. ์ ์ ๊ฐ ๋์ด๋๋ฉด ๋ถ๋ด์ด๋ค. redis๋ฅผ ์ฃผ๋ก ์ฌ์ฉ.
- ํ ํฐ
- ์๋ฒ๋
ํ ํฐ
์ ์ถ์ ํ์ง ์๋๋ค.ํ ํฐ
์ด ์ ํจํ๊ฐ ์๋๊ฐ๋ง ํ๋จ. ๋ฐ๋ผ์ ์ธ์ฆ์ํ ํด์ ๊ฐ ์๋๋ค.- ์๋ฒ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ก๋ ๋ถ๋ด์ด ์ ๋ค.
์ด๋ฐ ๊ฒ๋ค์ ์ํ๋? HTTP ํต์ ์ stateless. ์์ฒญ์ด ๋๋๋ฉด ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฐ์ง ์์ด๋ฒ๋ฆฐ๋ค.
์์ ๋๊ธ (์ ์ : ํํํ)
jwt๋ ์๋ฒ๊ฐ ์ด์ค ์ผ์ค ์ฌ๋ฌ๋ ์ผ๋ ์ธ์
๋ณด๋ค ์ฅ์ ์ ๊ฐ์ต๋๋ค
๋ณดํต ํฐ์๋น์ค๋ค์ ์๋ฒ๊ฐ ํ๋๊ฐ ์๋ ์์ญ ์๋ฐฑ๋์ธ๋ฐ
์ธ์
์ ๊ฒฝ์ฐ ๋ก๋๋ฐธ๋ฐ์ฑ์ผ๋ก ์ ์ ๊ฐ ์ฒ์ ๋ฐฉ๋ฌธํ์๋๋ 1๋ฒ์๋ฒ๋ก ๋ฐฉ๋ฌธํ์ฌ ์ธ์
์ด ๋จ์ ์์ง๋ง
๋๋ฒ์งธ ๋ฐฉ๋ฌธํ์๋ 1๋ฒ์ด ์๋ 2๋ฒ์ผ๋ก ๋ถ๊ฒ๋๋ฉด ์ธ์
์ ๋ณด๊ฐ ์์ด ์ธ์ฆ์ด ์๋ฉ๋๋ค
์ด๋ redis ์ธ์
ํตํฉ์ผ๋ก ๊ฐ๋ฐํ๊ฑฐ๋
์๋ฒ์ ์๊ด์๋ jwt๋ก ์ธ์ฆ์ ๊ตฌํํฉ๋๋ค
...
๋ค ๋ง์ต๋๋ค.
๋ณด์์ ์ธ์
๋ณด๋ค ์ทจ์ฝํ๋ค๋ ๋จ์ ์ด ์์ฃ
์ธ์
์ ํ์ทจ๋นํ๋ฉด ์๋ฒ์ ์ธ์
์ ๋ณด๊ฐ ๋จ์์๊ธฐ์ ๊ฐ์ ๋ก๊ทธ์์์ด๋ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค๋ง
ํ ํฐ ๋ฐ๊ธ์ ์ด๋ฏธ ํ ํฐ์ ๋ฐ๊ธํ๋ค๊ณ ์๋ฒ์ ์๋ฌด๊ฒ๋ ์๊ธฐ์ ์ ์ดํ ๋ฐฉ๋ฒ์ด ์์ด์
๊ธฐ์
๋ค์์๋ ๋ณํํด์ ๋ง์ด ์ฐ๋๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
jwt ๋ณด์ ๋จ์ ์ ๋ณด์ํ๊ธฐ์ํ์ฌ
์ ํฌ๋ฒ๋๊ป์ ์๋ ค์ฃผ์ jwt access token์ธ์ expire ๊ธฐ๊ฐ์ด ๊ธด refresh token์ ๊ฐ์ด ๋ฐ๊ธ(๋๊ฐ) ํ๊ฑฐ๋
๋ธ๋๋ฆฌ์คํธ db๋ฅผ ํ๋ ๋ง๋ค์ด ํ์ทจ๋นํ์๋์ ์ํ์ ๋ฐฉ์งํ๊ธฐ๋ ํ๋๋ฐ
์ด๋ฌ๋ฉด statusful ๋ฐฉ์์ผ๋ก ์ธ์
ํ๊ณ ๋น์ทํด์ ธ๋ฒ๋ ค์ ์๋ฏธ๊ฐ ์ฌ๋ผ์ง๋ค๋ ๋จ์ ์ด ์์ง๋ง
์ ๋ณด๋ฅผ ๋ ์ ์ฅํ๋ค๋ ์๋ฏธ์์๋ ์ฐ์ด๊ณ ์์ฃ
์ธ์
์์๋ ์ฌ๋ฌ ์๋ฒ๋ก ๋ก๋๋ฐธ๋ฐ์ฑ ํ๋๊ฒฝ์ฐ ์ธ์
์ ๋ณด๋ฅผ ์์ง ์๊ธฐ ์ํด ์๋์ ๋ฐฉ๋ฒ์ ์ฐ๊ณ ์์ต๋๋ค.
1. ๊ณ ์ ์ธ์
2. ์ธ์
ํด๋ฌ์คํฐ๋ง
2-1) ์ธ์
๋ณต์
2-2) ์ธ์
์คํ ๋ฆฌ์ง
๊ฒฐ๊ตญ์ ์ํฉ์ ๋ง์ถฐ์ฐ๋๋ฐ..
MSA ๊ตฌ์ถ์ ์ถ๊ตฌํ๋ ๊ธฐ์
์์๋ JWT๋ฅผ ๋๋ ค๊ฐ๋ ค๋ ์ถ์ธ์ธ๋ฏ ์ถ์ต๋๋ค.
3์ค ์์ฝ
1. ์๋ฒ๊ฐ ์ธ์ ํตํฉ์์ด ๋ก๋๋ฐธ๋ฐ์ฑ ์ค์ด๋ผ๋ฉด, ์ ์ ๋ ์ธ์ ์ ํตํ ์ธ์ฆ์ ๋ณด์ฅ๋ฐ์ ์ ์๋ค.
2. ํ ํฐ์ ๋ณด์์ ์ทจ์ฝํ๋ค. ์๋ฒ์์ ํ ํฐ์ ๋ํ ์ ๋ง ์๋ฌด๋ฐ ์ ๋ณด๋ ์ ์ฅํ์ง ์๋๋ค๋ฉด ํ์ทจ๋นํ์ ๋ ์ํํ ์ ์๋ค.
3.refresh token
์ ๋ํด ๋ ์์๋ด์ผ ํ๋ค.
์ฌ์ค ๊ตฌ๊ธ๋ง์ ํตํด ๋ฆฌ์กํธ๋ ๋ทฐ๋ฅผ ์ ์ธํ Tailwind
ํ์ฉ๋ฒ์ ์์๋ณด๊ธด ํ๋๋ฐ Alpine.js
๊ด๋ จ ๋ด์ฉ์ด ๊ฐ์ฅ ๋ง์ด ๋์๋ค. ํ์ง๋ง ์ญ์๋ ๋นก๋นกํ ์ผ์ ์์ ๋ฐฐ์ฐ๋ฉด์ ๊ตฌํํ๊ธฐ๋ ํ๋ค๋ค๊ณ ํ๋จํ๋ค.
์๋จ nav๋ footer ๋ฑ์ ์ปดํฌ๋ํธํ ํด ๊ฐ html์ ์ํฌํธํ๋ ๋ฐฉ์์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์๊ณ JSP ์์ ํ์ฉํด๋ณธ ์ ๋ ์์ง๋ง, Jinja2 ํ ํ๋ฆฟ์ ์ ์ํ๋๋ผ ์ฃ๋ถ๋ฆฌ ๊ฑด๋๋ฆฌ์ง ๋ชปํ๋ค. ์ฌ์ค์ ์๊ฐ์ด ๋๋ฌด ์ด๋ฐํด์ '์ง๊ธ ๊ฑด๋๋ฆฌ๋ฉด ์์ต์ด ๋ถ๊ฐ๋ฅํด์ง ์๋ ์์ง ์์๊น...' ํ๋ ๋๋ ค์์ด ์ปธ๋ค.
์ ์ ๊ฐ post์ ๋ถ์ ํด์ฆ๋ฅผ ํ๋ฉด db์ ์๋ ์ ์ 'progress'์ ๋ณด๋ฅผ ์
๋ฐ์ดํธ ํด์ค์ผ ํ๋ค.
pymongo์ update_one ํจ์๋ง์ ์ด์ฉํ์ฌ ํด๋น ์ ์ ๋ํ๋จผํธ / progress ํ๋ / solvedPosts ๋ฐฐ์ด
์ ํน์ ํ ํ ํด๊ฒฐํ postid๋ฅผ pushํด์ฃผ๋ ์ฟผ๋ฆฌ๊ฐ ๋๋ฌด ์ด๋ ค์ ๋ค. ๊ฒฐ๊ตญ ํด๋น user ์ ๋ณด๋ฅผ ํต์งธ๋ก ๋ฐ์์ progress์ solvedPosts ๋ฐฐ์ด์ ์
๋ฐ์ดํธ ํด์ฃผ๊ณ , ๋ฐ๋ ์ ์ ์ ๋ณด๋ฅผ ๋ค์ ํต์งธ๋ก db์ ์
๋ฐ์ดํธ ํ๋ ์์ผ๋ก ํด๊ฒฐํ๋ค. ์ํฐํฐ ๊ฐ์ ์ฐ๊ด์ฑ์ด ์๋ RDBMS์ ๊ฐ์ ์ ์์ผ ๋๊ผ๋ค.. ์ด๊ฑธ๋ก ๋ง์ง๋ง๋ ์๋ฒฝ์ ๋ณด๋๋ค.
# user ์คํค๋ง
{
"email": "",
"user name": "",
"password": "",
"description": "",
"progress": [
{
"projectId": "should be project's pk",
"solvedPosts": [ "post1", "post2", "post3", "post4" ],
"solved": true
},
{
"projectId": "bbb",
"solvedPosts": [ "post1", "post2", "post3" ],
"solved": false
}
]
}
์งํํ๋ ๋ด๋ด ์์ฑ์ ํ ์ ์์๊น ๊ฑฑ์ ์ ์ ๋ง ๋ง์ด ํ๋ ๊ธฐ์ต์ด ๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ ํ์ ์ ์ถ ์๊ฐ ๋ฐ๋ก ์ง์ ๊น์ง ์๊ฐ์ ๋ค ์จ์ ๋ฐฐํฌ๊น์ง ์ ์์ ์ผ๋ก ์๋ฃํ๋ค.
3์ผ ๋์์ ์ด์ฉ ์ ์์ด ์กฐ๋ฐ์ฌ์ด ๋๊ธด ํ์ง๋ง, ๋ฐํ๊ฐ ๋๋๊ณ ํ์์ ๊ฐ๋๊ธธ์ ์ฌ์ค ์ด ํ๋ก์ ํธ์ ์์๋ ์นํด์ง๊ธฐ์ ๊ฐ๊น์ ๋ค๋ ๊ฑธ ๊ฒฐ๊ตญ ๊นจ๋ฌ์๋ค.
ํจ๊ปํ๋ ๋๊ธฐ ํ๋ค์๊ฒ ์ ๋ง ๋ง์ ๊ฒ์ ๋ฐฐ์ ๊ณ ๋ ๋ง์ ์ ์์ ๊ต๊ฐํ๋ค.
์ฌ๋ฐ๋ ๊ฒฝํ์ ์ ์ฌํด์ค ์ ๊ธ๊ณผ ํ๋ค, ๋ค๋ฅธ ๋๊ธฐ๋ค์๊ฒ ๊ฐ์ฌํ๋ค. ๐๐