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

์ „์ฒด ๊ธ€

(38)
#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๋ฅผ ๋ฐฐ์› ๋‹ค. ์•„์ง ์™„๋ฒฝํžˆ ๋งˆ์Šคํ„ฐ ํ–ˆ๋‹ค๋ผ๊ณ  ๋งํ•˜๊ธด ์–ด๋ ต์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๊ทธ๋™์•ˆ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ–ˆ์œผ๋‹ˆ ์ด์   ๋‚˜๋งŒ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ์ง„์งœ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด์ž! ๋‚˜๋Š” '์‚ฌ๋žŒ๋“ค์ด ์ปดํ“จํ„ฐ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ํ•˜๋Š” ๊ฒŒ ๋ฌด์—‡์ผ๊นŒ?'๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰, ๊ฒŒ์ž„, ๊ทธ๋ฆฌ๊ณ  ์‡ผํ•‘์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ ํ”„๋กœ์ ํŠธ๋กœ ์ธํ…Œ๋ฆฌ์–ด ์‡ผํ•‘๋ชฐ์ธ '์˜ค๋Š˜์˜ ์ง‘' ์‚ฌ์ดํŠธ๋ฅผ ํด๋ก ์ฝ”๋”ฉ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ธฐ์กด์— '์˜ค๋Š˜์˜ ์ง‘' ์‚ฌ์ดํŠธ๋Š” ํฌ๊ฒŒ ์ปค๋ฎค๋‹ˆํ‹ฐ, ์Šคํ† ์–ด, ์ธํ…Œ๋ฆฌ์–ด ์‹œ๊ณต์ด๋ž€ ์ฃผ์ œ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ , ๋‚˜๋Š” ์ด ์ค‘ ์Šคํ† ์–ด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฉ”์ธ ํŽ˜์ด์ง€, ์ƒํ’ˆ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋“ฑ์„ ์ œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค. ๋‚˜๋Š” ํ”„๋ก ํŠธ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์ž‘์—…์€ ์นœํ•œ ์นœ๊ตฌ..
npm ERR! cb.apply is not a function npm ๋ฒ„์ „์„ ์ด๊ฒƒ์ €๊ฒƒ ๋ญ ๋งŒ์ง€๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. npm ERR! cb.apply is not a function ์œ„ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚ฌ์„ ๋• C:\Users\user\AppData\Roaming ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€ npm๊ณผ npm-cache ํŒŒ์ผ์„ ์‚ญ์ œํ•ด์ค€๋‹ค. (**๊ฒฝ๋กœ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅผ ์ˆœ ์žˆ๋Š”๋ฐ ์•„๋ฌดํŠผ AppData ํด๋”๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.) ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ cmd ์ฐฝ์— ์ž…๋ ฅํ•œ๋‹ค(**๋‚˜๋Š” ์œˆ๋„์šฐ ์‚ฌ์šฉ์ž!) npm clean cache -force npm cache cleannpm cache clean --force ๊ทธ ํ›„ ๋‹ค์‹œ npm์„ ์„ค์น˜ํ•œ๋‹ค. npm install ์„ค์น˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด npm -v๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ฒ„์ „๊นŒ์ง€ ํ™•์ธํ•˜๋ฉด ๋! โ€ป์œ„ ๋‚ด์šฉ์€ ํ•ด๋‹น ์œ ํŠœ๋ธŒ ์˜์ƒ์„ ๋ณด๊ณ  ์—๋Ÿฌ๋ฅผ ๋”ฐ๋ผ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค..
babel ์‹คํ–‰ 1. ํ„ฐ๋ฏธ๋„์— ๋‘๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค. npm i -D @babel/core @babel/preset-env 2. ๋ฃจํŠธ๊ฒฝ๋กœ์— .babelrc.js ํŒŒ์ผ์ƒ์„ฑ ํ›„ ์•„๋ž˜์˜ ์ฝ”๋“œ ์ž‘์„ฑํ•œ๋‹ค. module.export = { presets: ['@babel/preset-env'] } 3. package.json ํŒŒ์ผ์— ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€ํ•œ๋‹ค. "browserslist": [ "> 1%", "last 2 versions" ] 4. js ํŒŒ์ผ์— async, await ๋ฌธ๋ฒ•์„ ์“ฐ๋ ค๋ฉด ์ถ”๊ฐ€๋กœ ํ„ฐ๋ฏธ๋„์— ์•„๋ž˜์ฝ”๋“œ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. npm i -D @babel/plugin-transform-runtime 5. .babelrc.js ํŒŒ์ผ์— ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€ํ•œ๋‹ค. module.exports = { presets: ['@babel/pr..
Vender Prefix(๊ณต๊ธ‰ ์—…์ฒด ์ ‘๋‘์‚ฌ) 1. ํ„ฐ๋ฏธ๋„์—์„œ ํŒจํ‚ค์ง€ ๋‘๊ฐœ๋ฅผ ์„ค์น˜ํ•œ๋‹ค. npm i -D postcss autoprefixer 2. package.json ํŒŒ์ผ์— browserslist ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค. "browserslist": [ "> 1%", "last 2 versions"] (browserslist ์˜ต์…˜์€ ํ˜„์žฌ npm ํ”„๋กœ์ ํŠธ์—์„œ ์ง€์›ํ•  ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฒ”์œ„๋ฅผ ๋ช…์‹œํ•˜๋Š” ์šฉ๋„์ด๋‹ค. ๊ทธ ๋ช…์‹œ๋ฅผ autoprefixer ํŒจํ‚ค์ง€๊ฐ€ ํ™œ์šฉํ•˜๊ฒŒ ๋œ๋‹ค) ( "browserslist": ["> 1%", "last 2 versions"]๋Š” ์ „์„ธ๊ณ„์— ์ ์œ ์œจ์ด 1% ์ด์ƒ์ธ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์˜ ๋งˆ์ง€๋ง‰ ๋‘๊ฐœ์˜ ๋ฒ„์ „๊นŒ์ง€๋Š” ์ง€์›์„ ํ•˜๊ฒ ๋‹ค๋Š” ๋ง) 3. ๋ฃจํŠธ๊ฒฝ๋กœ์— .postcssrc.js ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ ์•ˆ์— ์•„๋ž˜ ๋‚ด์šฉ ์ž…๋ ฅํ•œ๋‹ค. module.exports..
favicon ๋“ฑ๋ก 1. ์ผ๋ฐ˜ png ์ด๋ฏธ์ง€ ํ•˜๋‚˜๋ž‘ ico ์ด๋ฏธ์ง€ ํ•˜๋‚˜๋ฅผ ์ค€๋น„ํ•œ๋‹ค. 2. ico ์ด๋ฏธ์ง€๋Š” ico converter(https://www.icoconverter.com/) ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•ด png ์ด๋ฏธ์ง€๋ฅผ ico ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. 3. ํ„ฐ๋ฏธ๋„์— npm install -D parcel-plugin-static-files-copy ์ž…๋ ฅํ•˜์—ฌ ์„ค์น˜ํ›„ package.json ํŒŒ์ผ์— "staticFiles": { "staticPath": "static"} ๋‚ด์šฉ ์ถ”๊ฐ€ํ•œ๋‹ค. 4. images ํŒŒ์ผ์ƒ์„ฑ ํ›„ png ํŒŒ์ผ ๋„ฃ์–ด๋‘๊ณ , static ํŒŒ์ผ์ƒ์„ฑ ํ›„ ico ํŒŒ์ผ ๋„ฃ์–ด๋‘์–ด ํ„ฐ๋ฏธ๋„์— npm run dev ์žฌ์ž‘๋™ ์‹œํ‚ค๋ฉด ํŒŒ๋น„์ฝ˜์ด ์‚ฌ์ดํŠธ์— ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ. **3๋ฒˆ์„ ์ง„ํ–‰ํ•˜๋Š” ์ด์œ : ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์ž‘๋™์‹œํ‚ค๋ฉด ..