๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ

(16)
heroku ์ž๋™๋ฐฐํฌ ์˜ค๋ฅ˜ ๋ฐฐํฌํ•œ ์›น์‚ฌ์ดํŠธ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ์ถ”๊ฐ€ ์ˆ˜์ •ํ•˜์˜€๋Š”๋ฐ ์ž๋™๋ฐฐํฌ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋ชฐ๋ผ ํ•œ์ฐธ ํ—ค๋ฉ”๋‹ค๊ฐ€ heroku ์•Œ๋ฆผ์„ ๋ณด๋‹ˆ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•œ ์ •์ฑ…๋ณ€๊ฒฝ์œผ๋กœ ๊นƒํ—ˆ๋ธŒ์™€ ๋ญ๊ฐ€ ์—ฐ๋™์ด ์•ˆ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ตฌ๊ธ€๋ง ํ•ด๋ณด๋‹ˆ heroku CLI๋ฅผ ์„ค์น˜ํ•ด ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ๊ฐ™์•„ ํ•ด๋ณด๋‹ˆ ์ž˜ ํ•ด๊ฒฐ๋๋‹ค. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ์‹œ์—๋„ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ผ๋‹จ ๊ธฐ๋กํ•ด๋‘์ž. heroku login heroku git:remote -a git push heroku main // ๋ธŒ๋žœ์น˜๋Š” main ๋˜๋Š” master
react + express ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ํ›„๊ธฐ (heroku ์ด์šฉ) ํ˜„์žฌ react์™€ express๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰์ค‘์ธ๋ฐ ๊ฑฐ์˜ ์™„์„ฑ๋˜์–ด๊ฐ€์„œ ๋ฏธ๋ฆฌ ์—ฐ์Šต์‚ผ์•„ ๋ฐฐํฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค. ํ˜ผ์ž์„œ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ์ฒ˜์Œ์ด๋ผ ์ˆ˜๋งŽ์€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚ฌ๊ณ  ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๊ฝค ๋ณต์žกํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๊ณผ์ • ์ˆœ์„œ๋ฅผ ๊ฐ„๋‹จํžˆ ๊ธฐ๋กํ•ด๋ณธ๋‹ค. #. ํ”„๋กœ์ ํŠธ ์„ธํŒ… ๋จผ์ € heroku๋ฅผ ์ด์šฉํ•ด ๋ฐฐํฌํ•˜๋Š”๋ฐ ๊นƒํ—ˆ๋ธŒ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ์—ฐ๋™ํ•ด์•ผํ•จ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ๊ธฐ์กด์— client์™€ server๋ฅผ ๊ฐ๊ฐ์˜ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœํ–ˆ์–ด์„œ ๋ชจ๋‘ ํด๋ก ํ•ด์„œ ํ•˜๋‚˜๋กœ ํ•ฉ์ณค๋‹ค. 1) server ํด๋” ์•ˆ์— server.js ํŒŒ์ผ์˜ ์ˆ˜์ •์ด ํ•„์š”ํ–ˆ๋‹ค. '/' ๊ฒฝ๋กœ์— get ์š”์ฒญ ์‹œ client ํด๋”์˜ index.html ํŒŒ์ผ์„ ๋ณด์—ฌ์ฃผ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์— PORT ๊ฐ’์ด 5000์œผ๋กœ ๊ณ ์ •๊ฐ’์ด์˜€๋Š”๋ฐ heroku์—์„œ ์—ฐ ํฌ..
session vs jwt ๋กœ๊ทธ์ธ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ธ์…˜(Session)๋ฐฉ์‹๊ณผ ํ† ํฐ(JWT)๋ฐฉ์‹์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ„๋‹จํžˆ ์ด ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€๋ฅผ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ณ , ๋‚ด๊ฐ€ JWT์„ ์ด์šฉํ•ด ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹๋„ ๊ธฐ๋กํ•ด๋ณด๋ ค ํ•œ๋‹ค. #. http stateless ๋จผ์ € http๋Š” connectionless(๋น„์—ฐ๊ฒฐ์„ฑ), stateless(๋ฌด์ƒํƒœ) ๋ผ๋Š” ๋‘๊ฐ€์ง€ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋น„์—ฐ๊ฒฐ์„ฑ์ด๋ž€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์–ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ๋งˆ์นœ ํ›„ ์—ฐ๊ฒฐ์„ ๋Š์–ด๋ฒ„๋ฆฌ๋Š” ํŠน์ง•์„ ๋งํ•œ๋‹ค. ์ฆ‰ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ•œ๋ฒˆ์˜ ํ†ต์‹ ์ด ์ด๋ฃจ์–ด์ง„ ํ›„ ๊ทธ ์—ฐ๊ฒฐ์„ฑ์ด ๋Š์–ด์ง€๋Š” ๊ฒƒ. ๊ทธ๋ฆฌ๊ณ  ๋ฌด์ƒํƒœ๋ž€ ๋น„์—ฐ๊ฒฐ์„ฑ ํŠน์ง•์œผ๋กœ ์ธํ•ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์‹๋ณ„ํ•  ์ˆ˜ ์—†๋Š” ํŠน์ง•์„ ๋งํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ•œ๋ฒˆ์˜ ํ†ต์‹  ํ›„ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๊ธฐ ๋•Œ..
redux-saga๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ๊ตฌํ˜„ react, react-toolkit, redux-saga ์ด ์„ธ๊ฐ€์ง€ ์กฐํ•ฉ์œผ๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋กํ•ด๋ณด์ž - ๐Ÿš€ #. ๋ชฉํ‘œ: list ํŽ˜์ด์ง€ ์ง„์ž… ์‹œ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ 1) ๊ฐ€์žฅ ๋จผ์ € api ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. axios๋ฅผ ์ด์šฉํ•ด get ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•ด์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. // api code export const latestVideos = async () => { try { const result = await axios.get('/videos/latest'); if(result) return res.data; } catch(err) { console.log(err) } } 2) react-toolkit์„ ์ด์šฉํ•ด act..
React + Express ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ํ”„๋ก ํŠธ์—์„œ๋„ ์ฒ˜์Œ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—ˆ์ง€๋งŒ ๋ฐฑ์—”๋“œ๋„ ์ฒ˜์Œ์ด๋ผ ์—ฌ๋Ÿฌ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๊ณผ์ •์„ ๊ฐ„๋žตํžˆ ๊ธฐ๋กํ•˜๊ณ ์ž ํ•œ๋‹ค. #. ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๋ฉด ๊ทธ๋งŒํผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋กœ๋”ฉ๋˜์–ด ๋ณด์—ฌ์ง€๋Š” ์†๋„๊ฐ€ ๋Šฆ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ ๋กœ๋”ฉ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ผ์ • ๋ฐ์ดํ„ฐ๋งŒ ๋จผ์ € ์ œ๊ณตํ•˜๊ณ  ์ดํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ ค๊ณ  ์Šคํฌ๋กค์„ ์›€์ง์ด๋Š” ์•ก์…˜์„ ์ทจํ•˜๋ฉด, ๊ทธ๋•Œ ์ถ”๊ฐ€๋กœ ๋˜ ์ผ์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์ด๋‹ค. #. ๋ฐฑ์—”๋“œ ๊ตฌํ˜„ ๋ชฉํ‘œ: ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ ์š”์ฒญ ์‹œ ์•Œ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ! ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์—ˆ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š”๋ƒ์— ๋”ฐ๋ผ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐ์ด..
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ #. ๋™๊ธฐ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ์ง€๋งŒ ๋‹ค์Œ ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰ A ์š”์ฒญ ํ›„ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ B ๋™์ž‘์€ ์‹คํ–‰๋  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๋™๊ธฐ๋Š” ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋™๊ธฐ๋Š” ์ „์ฒด ์ž‘์—…์˜ ํ๋ฆ„์ด ํ•˜๋‚˜์˜ ์ค„๊ธฐ์— ๋”ฐ๋ผ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž! #. ๋น„๋™๊ธฐ๋Š” ์š”์ฒญ์„ ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๊ทธ ๋Œ€๊ธฐ ์‹œ๊ฐ„๋™์•ˆ(์‘๋‹ต์˜ค๊ธฐ ์ „๊นŒ์ง€์˜ ์‹œ๊ฐ„) ๋‹ค๋ฅธ ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰ C ์š”์ฒญ ํ›„ ์‘๋‹ต ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹ค์Œ B ๋™์ž‘๋„ ๋ฐ”๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ๋Š” ์ „์ฒด ์ž‘์—…์˜ ํ๋ฆ„์ด ํ•˜๋‚˜์˜ ํฐ ์ค„๊ธฐ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐˆ๋ž˜๋กœ ๋‚˜๋‰˜์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํฐ ์ค„๊ธฐ๋กœ ๋ชจ์ด๋Š” ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž! #. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ, ๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ฆ‰ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…์„ ..
React + Redux(Redux-toolkit) + Redux-saga ํ˜„์žฌ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋กœ React์™€ Redux, Redux-saga๋ฅผ ์ด์šฉํ•ด ๊ฐœ๋ฐœ ์ค‘์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ๊ฐ ์–ด๋–ค ์ด์œ ๋กœ ์ด์šฉํ–ˆ๋Š”์ง€ ์ •๋ฆฌํ•˜๊ณ ์ž ๊ธ€์„ ์ ์–ด๋ณธ๋‹ค. #. React ๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋Šฅ ๋‹จ์œ„, UI ๋‹จ์œ„๋กœ ์บก์Šํ™”ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๋‹ค. ๋˜ํ•œ Virtual DOM์„ ํ†ตํ•ด ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹ค์ œ DOM๊ณผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์žฌ๋žœ๋”๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ํšจ์œจ์ ์œผ๋กœ ๋žœ๋”๋ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์€ UI๋ผ๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์€ ํผํฌ๋จผ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. #. Redux / Redux-toolkit ๋ฆฌ์•กํŠธ๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ• ์ˆ˜๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ๋ฐœ์ƒํ•œ๋‹ค(*Props Drilling ์ด์Šˆ). ์ด..
redux-saga #. redux-saga๋ž€? redux-saga(์ดํ•˜ ๋ฆฌ๋•์Šค ์‚ฌ๊ฐ€)๋Š” redux์˜ ๋ฏธ๋“ค์›จ์–ด๋กœ์„œ ๋น„๋™๊ธฐ ๋™์ž‘์„ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ฆ‰ ์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(fetch)์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ๋™์ž‘๋“ค์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ , ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, redux์˜ action์ด ๋ฐœ์ƒํ•˜๋ฉด reducer๊ฐ€ ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ๋น„๋™๊ธฐ ์ž‘์—…์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋“ค์›จ์–ด๋กœ ๋™์ž‘ํ•œ๋‹ค. #. redux-saga ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  1) ์ฃผ๋กœ ์„œ๋ฒ„์— ๋น„๋™๊ธฐ ์š”์ฒญ์„ ํ•  ๋•Œ ์ปดํฌ๋„ŒํŠธ์—์„œ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  Saga์—์„œ ๋ชจ์•„์„œ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ async/await ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ์„œ๋ฒ„์— API ์š”์ฒญ์„ ๋ณด๋‚ด๋Š”๊ฒŒ ๊ฐ€์žฅ ๊ฐ„ํŽธํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ..