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

[PROJECT] ๋‚ด์ผ์˜ ์ง‘

(7)
#7. ํšŒ์›๊ฐ€์ž… ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (react-hook-form) #7-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง ๊ธฐ์กด์— ์ž‘์„ฑํ•œ ํšŒ์›๊ฐ€์ž… ํผ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋Šฅ์„ ๋ณด์™„ํ•˜๋ ค๋˜ ์ฐจ์— react-hook-form์ด ์žˆ๋‹ค๋Š”๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. react-hook-form์„ ์ด์šฉํ•˜๋Š”๊ฒŒ ๊ธฐ์กด ์ฝ”๋“œ์˜ ์–‘๋„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ์ข€ ๋” ์ž˜ ์งœ์—ฌ์ง„ ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ์„๊ฑฐ ๊ฐ™์•„ ํ•œ๋ฒˆ ์ ์šฉ์‹œ์ผœ ๋ณด์•˜๋‹ค. #7-1 react-hook-form ์ด์šฉํ›„๊ธฐ ๋จผ์ € npm install react-hook-form์„ ํ•˜์—ฌ ์„ค์น˜ํ•œ ํ›„์— ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€(https://react-hook-form.com/kr/get-started/)์— ์•ˆ๋‚ด๋œ ๋Œ€๋กœ ์‹คํ–‰ํ•ด ๋ณด์•˜์œผ๋‚˜ "Uncaught TypeError: path.split is not a function" ๋ž€ ์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค.๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ค‘ react-hook-form ๋ฒ„์ „์„..
#6. ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (1์ฐจ) #6-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง ์ด์ „์— ํฌ์ŠคํŒ… ํ–ˆ๋˜๋Œ€๋กœ(https://white-salt.tistory.com/26) JWT ๋ฐฉ์‹์œผ๋กœ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. jwt ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ ์กฐ๊ธˆ ์–ด๋ ค์› ๋Š”๋ฐ ์‹ค์ œ๋กœ ์ฝ”๋“œ ์งœ๋Š”๊ฑด ๋” ์–ด๋ ค์› ๋‹ค (^_^;;). ์ผ๋‹จ ์ง€๊ธˆ๊นŒ์ง€ ์ง  ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ์ •๋ฆฌ ํ›„ ๋ฐฑ์—”๋“œ ์นœ๊ตฌ์™€ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•ด๋ณด์ž. #6-1 ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๋กœ์ง 1. ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜์—ฌ accessToken๊ณผ refreshToken ๋ฐ›๊ธฐ. ์ž…๋ ฅ๋ฐ›์€ id์™€ password ๊ฐ’์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ์œ ์ €ํ™•์ธ ํ›„ ๋“ฑ๋ก๋œ ์œ ์ €๊ฐ€ ๋งž๋‹ค๋ฉด accessToken, refreshToken์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค. (Q1. ์ด๋•Œ ๋ฐœ๊ธ‰ ๋ฐ›์€ refreshToken์„ httpOnly cookie๋กœ ์„œ๋ฒ„๋‹จ์—์„œ ๋ฐ”๋กœ ์ €์žฅํ•ด์ฃผ๊ณ , ์ดํ›„ ํด..
#5. ์•ฝ๊ด€๋™์˜ ์ฒดํฌ๋ฐ•์Šค ๊ธฐ๋Šฅ ๊ตฌํ˜„ #5-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐˆ ์•ฝ๊ด€๋™์˜ ์ฒดํฌ๋ฐ•์Šค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ฒ˜์Œ์—” ์™ ์ง€ ์กฐ๊ธˆ ์–ด๋ ค์šธ๊บผ ๊ฐ™์•„์„œ ์ผ๋‹จ ํ˜ผ์ž ์‹œ๋„ํ•ด๋ณด๊ณ  ์•ˆ๋˜๋ฉด ๊ตฌ๊ธ€๋ง ํ•ด๋ณด์ž ์‹ถ์—ˆ๋‹ค. ๊ทผ๋ฐ ์›ฌ๊ฑธ ์„ฑ๊ณตํ–ˆ๋‹ค. ์ฝฉ๋‚˜๋ฌผ ์ฒ˜๋Ÿผ ๋‚˜๋„ ์กฐ๊ธˆ์”ฉ ์ž๋ผ๊ณ  ์žˆ๋‚˜๋ณด๋‹ค. ๋ฟŒ๋“ฏ! #5-1 ์•ฝ๊ด€๋™์˜ ์ฒดํฌ๋ฐ•์Šค ๊ธฐ๋Šฅ ์„ค๊ณ„ 1) ์ „์ฒด๋™์˜ ์ฒดํฌ ์‹œ ์„ธ๋ถ€ํ•ญ๋ชฉ 3๊ฐœ ๋ชจ๋‘ ์ž๋™์ฒดํฌ 2) ์ „์ฒด๋™์˜ ์ฒดํฌํ•ด์ œ ์‹œ ์„ธ๋ถ€ํ•ญ๋ชฉ 3๊ฐœ ๋ชจ๋‘ ์ž๋™ ์ฒดํฌํ•ด์ œ 3) ์„ธ๋ถ€ํ•ญ๋ชฉ 3๊ฐœ ๋ชจ๋‘ ์ฒดํฌ ์‹œ ์ „์ฒด๋™์˜ ์ž๋™์ฒดํฌ 4) ์ „์ฒด๋™์˜ + ์„ธ๋ถ€ํ•ญ๋ชฉ 3๊ฐœ ๋ชจ๋‘ ์ฒดํฌ๋œ ์ƒํƒœ์—์„œ ์„ธ๋ถ€ํ•ญ๋ชฉ 1๊ฐœ ์ฒดํฌํ•ด์ œ ์‹œ ์ „์ฒด๋™์˜ ์ž๋™ ์ฒดํฌํ•ด์ œ #5-2 ์•ฝ๊ด€๋™์˜ ์ฒดํฌ๋ฐ•์Šค ๊ธฐ๋Šฅ ๊ตฌํ˜„ 1) ์ฒดํฌ๋ฐ•์Šค์˜ checked ์†์„ฑ๊ฐ’์ธ true / false ๋ฅผ useState๋ฅผ ์ด์šฉํ•˜์—ฌ ์ €์žฅ ๋ฐ ๋ณ€๊ฒฝํ•จ. 2) ๊ธฐ๋Šฅ 1๋ฒˆ๊ณผ ..
#4. ์บ๋กœ์…€(Carousel) ๊ตฌํ˜„ํ•˜๊ธฐ #4-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง ๋ฉ”์ธ ํ™ˆํŽ˜์ด์ง€ ์ƒ๋‹จ์˜์—ญ์— ๋“ค์–ด๊ฐˆ ์บ๋กœ์…€ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋ ค๋‹ค๊ฐ€ react-slick ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜€๋Š”๋ฐ ๋‹คํ–‰ํžˆ ์ž˜ ์ ์šฉ๋˜์–ด ๊ธฐ๋ปค๋‹น. #4-1 Carousel ๋งŒ๋“ค๊ธฐ (https://react-slick.neostack.com/docs/get-started) 1) ๋จผ์ € react-slick๊ณผ slick-carousel ์„ค์น˜ํ•˜๊ธฐ npm install react-slick npm install slick-carousel 2) Carousel.js ํŒŒ์ผ์— ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž„ํดํŠธ ํ•˜๊ธฐ import Slider from 'react-slick'; import "slick-carousel/slick/slick.css"; impor..
#3. ๋ชจ๋‹ฌ์ฐฝ ๊ตฌํ˜„( feat. ์˜์—ญ ๋ฐ– ํด๋ฆญ ์‹œ ๋‹ซ๊ธฐ) #3-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง Header ์˜์—ญ์„ ์ž‘์—…ํ•˜๋˜ ์ค‘ ๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ ๋ถ€๋ถ„์—์„œ ์ž ์‹œ ๋ง‰ํ˜”์—ˆ๋‹ค. ๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์ด ๋”ฐ๋กœ ์—†๊ณ , ๋ชจ๋‹ฌ์ฐฝ ์˜์—ญ ๋ฐ–์„ ํด๋ฆญํ–ˆ์„ ์‹œ ๋ชจ๋‹ฌ์ฐฝ์ด ๋‹ซํžˆ๋Š” ๊ตฌ์กฐ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šด ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ๊ทธ๋ž˜๋„ ํ•ด๋‚ด์—ˆ๋‹ค๋Š” ๊ฒƒ์— ๊ธฐ์จ์„ ๋Š๊ผˆ๋‹ค. #3-1 useRef ์ด์šฉํ•˜๊ธฐ ํŠน์ •ํ•œ Element๋ฅผ ์„ ํƒํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ getElementById๋‚˜ querySelector ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋“ฏ์ด, ๋ฆฌ์•กํŠธ์—์„  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ •๋‹ต์€ useRef Hook ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ! ๋ชจ๋‹ฌ์ฐฝ ์˜์—ญ ๋ฐ–์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ useRef๋ฅผ ํ†ตํ•ด ์„ ํƒํ•œ ํ›„, ํ•ด๋‹น Element๊ฐ€ ํด๋ฆญ ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ชจ๋‹ฌ์ฐฝ์ด ๋‹ซํžˆ๋„๋ก ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๋ฉด ๋œ๋‹ค. *์˜ˆ์‹œ ์ฝ”๋“œ import Reac..
#2. ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ฐœ๋…์žก๊ธฐ #2-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง ๋‚ด์ผ์˜ ์ง‘ ํ”„๋กœ์ ํŠธ์˜ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ํ† ํฐ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ† ํฐ๋ฐฉ์‹์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€, ๋˜ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์•ผํ• ์ง€ ๊ฒ€์ƒ‰ ํ•ด๋ณด์•˜๋‹ค. ๋จผ์ € ๊ฐœ๋…๋ถ€ํ„ฐ ์ดํ•ดํ•ด๋ณด์ž. #2-1 JWT (JSON Web Token) JWT๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ HTTP ๋ฆฌํ€˜์ŠคํŠธ ํ—ค๋”์— JSON ํ† ํฐ์„ ๋„ฃ์€ ํ›„ ์„œ๋ฒ„๋Š” ๋ณ„๋„์˜ ์ธ์ฆ ๊ณผ์ •์—†์ด ํ—ค๋”์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” JWT ์ •๋ณด๋ฅผ ํ†ตํ•ด ์ธ์ฆ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ธ์ฆ ์ ˆ์ฐจ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 1) ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณด๋‚ธ๋‹ค. 2) ์„œ๋ฒ„๊ฐ€ ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  Access Token๊ณผ Refresh Token, Access Token์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. 3) ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ˜ํ™˜๋ฐ›์€ Acc..
#1. ์ฒซ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๊ณผ ์ค€๋น„ #1-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง ๊ทธ๋™์•ˆ ์—ฌ๋Ÿฌ ๊ฐ•์˜๋“ค์„ ํ†ตํ•ด HTML, CSS, JavaScript, React๋ฅผ ๋ฐฐ์› ๋‹ค. ์•„์ง ์™„๋ฒฝํžˆ ๋งˆ์Šคํ„ฐ ํ–ˆ๋‹ค๋ผ๊ณ  ๋งํ•˜๊ธด ์–ด๋ ต์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๊ทธ๋™์•ˆ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ–ˆ์œผ๋‹ˆ ์ด์   ๋‚˜๋งŒ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ์ง„์งœ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด์ž! ๋‚˜๋Š” '์‚ฌ๋žŒ๋“ค์ด ์ปดํ“จํ„ฐ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ํ•˜๋Š” ๊ฒŒ ๋ฌด์—‡์ผ๊นŒ?'๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰, ๊ฒŒ์ž„, ๊ทธ๋ฆฌ๊ณ  ์‡ผํ•‘์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ ํ”„๋กœ์ ํŠธ๋กœ ์ธํ…Œ๋ฆฌ์–ด ์‡ผํ•‘๋ชฐ์ธ '์˜ค๋Š˜์˜ ์ง‘' ์‚ฌ์ดํŠธ๋ฅผ ํด๋ก ์ฝ”๋”ฉ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ธฐ์กด์— '์˜ค๋Š˜์˜ ์ง‘' ์‚ฌ์ดํŠธ๋Š” ํฌ๊ฒŒ ์ปค๋ฎค๋‹ˆํ‹ฐ, ์Šคํ† ์–ด, ์ธํ…Œ๋ฆฌ์–ด ์‹œ๊ณต์ด๋ž€ ์ฃผ์ œ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ , ๋‚˜๋Š” ์ด ์ค‘ ์Šคํ† ์–ด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฉ”์ธ ํŽ˜์ด์ง€, ์ƒํ’ˆ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋“ฑ์„ ์ œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค. ๋‚˜๋Š” ํ”„๋ก ํŠธ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์ž‘์—…์€ ์นœํ•œ ์นœ๊ตฌ..