๐ŸŠ[์ •๊ธ€์ผ์ง€] ์ •๊ธ€ ์ž…์„ฑ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ

์ด๊ฐ•์šฑยท2022๋…„ 10์›” 1์ผ
2

๐ŸŠ ์ •๊ธ€์ผ์ง€

๋ชฉ๋ก ๋ณด๊ธฐ
2/8
post-thumbnail

๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ

  • ๐Ÿ’ก ์ž…ํ•™์‹œํ—˜ ๋•Œ ๋ฐฐ์šด ๊ธฐ์ˆ ๋“ค์„ ํ† ๋Œ€๋กœ, 3๋ฐ• 4์ผ๊ฐ„ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•ด๋ณด์„ธ์š”.
  • ์ƒˆ๋กœ์šด ํŒ€์›๋“ค๊ณผ ์งง์€ ๊ธฐ๊ฐ„๋™์•ˆ ์˜๋ฏธ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด ๋ƒ„์œผ๋กœ์„œ,
    3๋ฐ• 4์ผ๊ฐ„ ๋ฏธ๋‹ˆ ์ •๊ธ€ ํ”„๋กœ๊ทธ๋žจ์„ ์ฒดํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ์žฌ๋ฏธ๋ฅผ ๋Š๊ปด๋ณด์„ธ์š”!

์ž…์†Œํ•˜์ž๋งˆ์ž 3์ผ ๋™์•ˆ ์ง„ํ–‰ํ–ˆ๋˜ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ.
์ž…ํ•™ ์‹œํ—˜๋•Œ ์ตํ˜”๋˜ ๊ฒƒ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ„๋‹จํ•œ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์›น์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ
๋„๋ฉ”์ธ๊นŒ์ง€ ๋ถ™์—ฌ ์ œ์ถœํ•ด์•ผ ํ–ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ์ฃผ๋ฌธ ์‚ฌํ•ญ์ด ์žˆ์—ˆ๋‹ค.

ํ•„์ˆ˜ ํฌํ•จ ์‚ฌํ•ญ

  1. ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ
  2. Jinja2 ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์ด์šฉํ•œ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง

๋” ๊ณ ๋ฏผํ•ด๋ณผ ํ‚ค์›Œ๋“œ

  1. Bootstrap์„ ๋Œ€์ฒดํ•  CSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ (Bulma, Tailwind ๋“ฑ)
  2. JWT ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ (์ฟ ํ‚ค/์„ธ์…˜ ๋Œ€๋น„ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ์€?)

์šฐ๋ฆฌํŒ€์€ Tailwind ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ JWT ์ธ์ฆ ๋ฐฉ์‹์˜ ๋กœ๊ทธ์ธ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿ“–๋‹น์‹ ์ด ๊ผญ ์ฝ์–ด์•ผ ํ•˜๋Š” URL๐Ÿ’€

๋ถ๋งˆํฌ๋ฅผ ๊ผญ ์ฝ๊ฒŒ ํ•ด์ฃผ์ž๋Š” ์ทจ์ง€์—์„œ ์‹œ์ž‘ํ–ˆ๋‹ค.
ํŒ€์›์„ ๊ตฌ์„ฑํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์—์„œ ์„œ๋กœ ๋ถ๋งˆํฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ถ๋งˆํฌ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ๊ฐ™์ด ๋“ฑ๋กํ•˜๋Š” ํ€ด์ฆˆ๋ฅผ ํ’€์–ด์•ผ ํ•ด๋‹น ๋ถ๋งˆํฌ๊ฐ€ ์ฝ์Œ ์ฒ˜๋ฆฌ ๋˜๊ณ ,
๊ทธ์— ๋”ฐ๋ผ ์ž์‹ ์˜ ์ง„ํ–‰์ƒํ™ฉ์— ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.
๋‹ค๋ฅธ ํŒ€์›๋“ค์˜ ์ง„ํ–‰์ƒํ™ฉ์„ ๊ทธ๋ž˜ํ”„๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜์งš์–ด ๋ณด๊ธฐ

์–ด์ฉŒ๋‹ค ๋ณด๋‹ˆ ๋‚˜๋Š” ์ฃผ๋กœ ํ”„๋ก ํŠธ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
Tailwind ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ต์ˆ™ํ•ด์ง€๊ณ  ํŽ˜์ด์ง€ ์ƒ๋‹จ์— ๋“œ๋กญ๋‹ค์šด์ด๋‚˜ ์ง„ํ–‰์ƒํ™ฉ ๊ทธ๋ž˜ํ”„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„์„ ์œ„ํ•ด ๊ณต์„ ๋“ค์˜€๋‹ค.

Tailwind css

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๋ผ๋Š” ์ต์Šคํ…์…˜์ด ์žˆ๋‹ค๋Š” ๊ฑธ ๋‚˜์ค‘์—์•ผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์–ด์จ‹๋“  ๋‚˜์ค‘์—๋ผ๋„ ๋ฆฌ์•กํŠธ๋‚˜ ๋ทฐ๋ฅผ ์ตํžˆ๊ฒŒ ๋œ๋‹ค๋ฉด ๋‹ค์‹œ ๋„์ „ํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค.

JWT(JSON Web Token) ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ

ํ•ด๋‹น ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ํŒ€์›๋ถ„์ด ๊ตฌํ˜„์„ ๊ฑฐ์˜ ์ „๋‹ดํ•˜์…”์„œ ๋‚˜๋Š” ์„ค๋ช…๋งŒ ๋“ค์—ˆ๋‹ค.
์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ธฐ์–ต์— ๋‚จ์•˜๋˜ ์ ์€, ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง๊ณผ ํ† ํฐ๋ฐฉ์‹์˜ ์ธ์ฆ์ด ์ž๊พธ๋งŒ ์„œ๋กœ ๋ถ€๋”ชํ˜”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์–ด๋–ค ์ด์œ ์—์„ ๊ฐ€ ์ฟ ํ‚ค์— ํ† ํฐ์„ ๋‹ด๋Š” ๋ฐฉ์‹์ด ์ž˜ ๋˜์ง€ ์•Š์•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์š”์ฒญ 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

์‚ฌ์‹ค ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋ฆฌ์•กํŠธ๋‚˜ ๋ทฐ๋ฅผ ์ œ์™ธํ•œ Tailwind ํ™œ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ธด ํ–ˆ๋Š”๋ฐ Alpine.js ๊ด€๋ จ ๋‚ด์šฉ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜์™”๋‹ค. ํ•˜์ง€๋งŒ ์—ญ์‹œ๋‚˜ ๋นก๋นกํ•œ ์ผ์ •์—์„œ ๋ฐฐ์šฐ๋ฉด์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ํž˜๋“ค๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

html ์ปดํฌ๋„ŒํŠธ ํ™”

์ƒ๋‹จ 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์ผ ๋™์•ˆ์€ ์–ด์ฉ” ์ˆ˜ ์—†์ด ์กฐ๋ฐ”์‹ฌ์ด ๋‚˜๊ธด ํ–ˆ์ง€๋งŒ, ๋ฐœํ‘œ๊ฐ€ ๋๋‚˜๊ณ  ํšŒ์‹์„ ๊ฐ€๋Š”๊ธธ์— ์‚ฌ์‹ค ์ด ํ”„๋กœ์ ํŠธ์˜ ์˜์˜๋Š” ์นœํ•ด์ง€๊ธฐ์— ๊ฐ€๊นŒ์› ๋‹ค๋Š” ๊ฑธ ๊ฒฐ๊ตญ ๊นจ๋‹ฌ์•˜๋‹ค.
ํ•จ๊ป˜ํ–ˆ๋˜ ๋™๊ธฐ ํ˜•๋“ค์—๊ฒŒ ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ๊ณ  ๋˜ ๋งŽ์€ ์ ์—์„œ ๊ต๊ฐํ–ˆ๋‹ค.
์žฌ๋ฐŒ๋Š” ๊ฒฝํ—˜์„ ์„ ์‚ฌํ•ด์ค€ ์ •๊ธ€๊ณผ ํ˜•๋“ค, ๋‹ค๋ฅธ ๋™๊ธฐ๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•˜๋‹ค. ๐Ÿ™‡๐Ÿ™‡

profile
I think I think too much.

0๊ฐœ์˜ ๋Œ“๊ธ€