๋ฆฌ์•กํŠธ

Redux๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ, useNavigate๋กœ ๋ผ์šฐํŒ…ํ•˜๋ฉด์„œ ํ•จ๊ป˜ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. useNavigate์™€ useLocation์ด๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค! 1. useNavigate() useNavigate๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋™ ๊ฒฝ๋กœ๋กœ state๊ฐ’ ์ „๋‹ฌํ•˜๊ธฐ const navigte() = useNavigate(); navigate("์ด๋™ํ•  ๊ฒฝ๋กœ", state:{ "์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ" }); 2. useLocation() useLocation์„ ์จ์„œ props ๋ฐ›๊ธฐ const { state } = useLocation();
๋งจ๋‚  ์ •ํ•ด์ ธ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ด์šฉํ•œ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๋งŒํ•˜๋‹ค๊ฐ€ ๋ชจ์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด UI๋ฅผ ์งœ์•ผํ•˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋‹ค. ๋ฐ‘๋ฐฅ์„ ๊น”์•„๋ณด์ž๋ฉด ใ…‹ใ…‹... ์ฒ˜์Œ๋ถ€ํ„ฐ ๋นŒ๋“œํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ค‘๊ฐ„์— ๋ผ์—ฌ๋“  ํ”„๋กœ์ ํŠธ์˜€๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ๋ถ€ํ„ฐ ๋ฒ„๋ฒ…์ด๊ธด ํ–ˆ๋‹ค. ์ž ์ด์ œ ๋ฐ‘๋ฐฅ์€ ๊น”๋ฆผ. ๋‚ด๊ฐ€ ํ•ด์•ผํ•  ๋ชฉ๋ก 1. swiper ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ด๋‹ค. 2. navigator ๋ฒ„ํŠผ์„ ๋‚˜์˜ค๊ฒŒํ•˜๊ณ  ์ฒซ ์Šฌ๋ผ์ด๋“œ์—์„œ๋Š” ์™ผ์ชฝ ๋ฒ„ํŠผ์ด ์‚ฌ๋ผ์ง€๊ฒŒ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ๋Š” ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์ด ์‚ฌ๋ผ์ง€๊ฒŒํ•œ๋‹ค. 3. ์Šฌ๋ผ์ด๋“œ๋Š” ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ๋กœ๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•œ๋‹ค. Code import React, { useState } from 'react'; import { Swiper, SwiperSlide } from 'swiper/react'; const Projects = () => { const [sw..
์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ธฐ์กด์— ํ•ด์˜ค๋˜ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ์ด๋ฒˆ์—๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ณด๋‚ด์„œ url๋ฅผ ๋ฐ›์•„์™€์„œ ๋‹ค์‹œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ create ํ˜น์€ update๋ฅผ ํ•ด์ค˜์•ผํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ์— ๊ธฐ์กด์— url์ด ์žˆ๋Š” ์ƒํƒœ๋ฉด pass๋ฅผ ํ•˜๊ณ  ์ƒˆ๋กœ ๋„ฃ์€ ์ด๋ฏธ์ง€๋งŒ url์„ ๋‹ค์‹œ ๋ฐ›์•„์™€์„œ update๋ฅผ ํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒƒ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. api๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— console.log๋กœ body๋ฅผ ์ฐ์œผ๋ฉด ๋ถ„๋ช…ํžˆ ์—…๋ฐ์ดํŠธ ๋œ ์ด๋ฏธ์ง€ url์ด ์ฐํžˆ๋Š”๋ฐ, ๋ง‰์ƒ api๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด payload์— ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์ด ์•ˆ ์ฐํžˆ๋Š” ๊ฒƒ์ด๋‹ค!!!!!!!! ๋ฐ˜๋‚˜์ ˆ์„ ๋ถ™์žก๊ณ  ๋Š˜์–ด์ ธ์žˆ๋Š”๋ฐ ๋ฏธ์น ์ง€๊ฒฝ... async - await๋ฅผ ์จ์„œ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์คฌ๋Š”๋ฐ ๋ญ๊ฐ€ ๋ถˆ๋งŒ์ด๋‹ˆ?! ๋ญ๊ฐ€ ์ž˜ ๋ชป ๋œ๊ฑด๋ฐ?! .... ๋ฌธ์ œ..
React-Query ๋น„๋™๊ธฐ ํ†ต์‹  fetch, axios ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃจ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ช‡ ๊ฐ€์ง€ ์žˆ์ง€๋งŒ react-query๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค(์บ์‹ฑ, ๊ฐ’ ์—…๋ฐ์ดํŠธ, ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋“ฑ)์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ๋„ ๋งค์šฐ ๊ฐ„๋‹จํ•ด์ง‘๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๋กœ์ง์„ store์—์„œ ๊ฐœ๋ฐœํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ๋งŽ์Šต๋‹ˆ๋‹ค. store๋Š” client์—์„œ state๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋‚ด๋ถ€์— client data ์™€ server data ๊ฐ€ ๊ณต์กด์„ ํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„์ด ์ƒ๊ฒจ๋‚ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉด์„œ ํ˜ผ๋ž€์„ ๋นš์–ด๋‚ด๋Š”๋ฐ react-query๋ฅผ ..
์ด๋ฏธ์ง€ํŒŒ์ผ์„ ๋งŽ์ด ๋‹ค๋ฃจ๋Š” ์—…๋ฌด๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค. ๊ฐ‘์ž๊ธฐ ์ถ”๊ฐ€๋œ ์–ด๋–ค ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด์„œ ํ”„๋ก ํŠธ์ชฝ์—์„œ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฐ”๊ฟ”์„œ ์ „๋‹ฌํ•ด์•ผํ•  ์ผ์ด ์ƒ๊ฒผ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐพ์•„์„œ ์“ฐ๊ฒŒ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ React Image File Resizer ๋„“๋”” ๋„“์€ ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์—์„œ ์—†๋Š”๊ฒŒ ์—†๋‹ค. ์ด๋ฏธ์ง€์˜ width, height, format ๋“ฑ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํŒจํ‚ค์ง€์ด๋‹ค. ์„ค์น˜ํ•˜๊ธฐ npm i react-image-file-resizer or yarn add react-image-file-resizer ์‚ฌ์šฉํ•˜๊ธฐ //๋ถˆ๋Ÿฌ์˜ค๊ธฐ import Resizer from "react-image-file-resizer"; //์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ•  ๊ฑด์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ฐจ๋ก€ ์ฐจ๋ก€ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. Resizer.imageFileResizer( file, //๋ฐ”..
useRef ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ์—…๋ฌด๋ฅผ ๋ณด๋‹ค๊ฐ€ ์‚ฌ์šฉํ•  ์ผ์ด ์ƒ๊ฒผ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณธ๋‹ค!! useRef ์‚ฌ์šฉํ•˜๊ธฐ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ฃผ๋กœ useRef๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŠน์ • DOM ์š”์†Œ์—๊ฒŒ ์ ‘๊ทผํ•ด์•ผํ•  ๋•Œ์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ์— ์ƒ๊ธด ์Šคํฌ๋กค ๋™์ž‘์„ ์ œ์–ดํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋•Œ useRef๋ฅผ ์จ์„œ ํ•˜๋ฉด ๋œ๋‹ค. ์ด ์™ธ์—๋„ ํฌ์ปค์Šค๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค๋˜์ง€, ํฌ๊ธฐ๋ฅผ ํŠน์ •ํ•ด์•ผํ•œ๋‹ค๋˜์ง€ DOM์š”์†Œ์— ๋Œ€ํ•œ ์„ธ์„ธํ•œ ๊ฒƒ๋“ค์ด ํ•„์š”ํ•  ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์ €๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์“ฐ๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— useRef hook์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šคํ˜•์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋„ ์จ์•ผํ•˜๊ณ . ์‚ด์ง ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. useRef ์„ ์–ธํ•˜๊ธฐ ์„ ์–ธ ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. useRef ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ  ๊ทธ ์•ˆ์— ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค...
๐Ÿ“ข Error: App(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null. โœ… ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ ์ •๋ง ๊ฐ„๋‹จํ•œ ์—๋Ÿฌ! ์ตœ๊ทผ์— ๋งŒ๋‚œ ์—๋Ÿฌ๋“ค์€ ๊ธฐ๋ณธ 2์‹œ๊ฐ„ ์žก์•˜๋˜๊ฒƒ ๊ฐ™์•˜๋Š”๋ฐ, ์ด ์—๋Ÿฌ๋Š” ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฐพ์•„๋ƒˆ๋‹ค. ๊ด„ํ˜ธ๊ฐ€ ์–ด๋”˜๊ฐ€์—์„œ ๋ฏธ์”ฝ๋˜์—ˆ๋˜๊ฒƒ!! ๊ทธ๋ž˜์„œ return ์˜ ์ž๋ฆฌ์— return ์ด ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์•„์„œ ์ƒ๊ธด ์—๋Ÿฌ์ด๋‹ค! ์–ด๋”˜๊ฐ€์—์„œ return ์„ ์ œ๋Œ€๋กœ ํ•ด์ฃผ์ง€ ๋ชป ํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ์—๋Ÿฌ์ด๋‹ˆ, ์ฐฌ์ฐฌํžˆ ์ฝ”๋“œ๋ฅผ ์‚ดํ”ผ๋‹ค๋ณด๋ฉด ๋ฐ”๋กœ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค!
ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋Š” ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”? ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•  ๋•Œ, ํ˜น์€ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜์ง€ ์•Š์•„๋„ ์ค‘์š”ํ•œ ์กด์žฌ์ž…๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๋•Œ์—๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์งœ๋‘๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉด ํ•˜๊ธฐ ์ „๊ณผ ํ›„์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™ธ์—๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‘๋ฉด ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชป ํ•œ ์—๋Ÿฌ๋“ค์„ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ์„œ์ ์—์„œ๋„ ์ด ์ค‘์š”์„ฑ์„ ๊ต‰์žฅํžˆ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. React Testing Library๋Š” ์„ธ๋ถ€์ ์ธ ๊ตฌํ˜„์‚ฌํ•ญ๋ณด๋‹ค๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ div ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ณด๋‹ค div ํ…Œ๊ทธ์˜ ๋ฉ”์„ธ์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์ž˜ ๋…ธ์ถœ..
* ๋ฉด์ ‘์—์„œ ๋ฐ›์•˜๋˜ ์งˆ๋ฌธ์ธ๋ฐ, ๋‹ต์€ ๊ณ ์‚ฌํ•˜๊ณ  ์งˆ๋ฌธ ์ž์ฒด๋ฅผ ์ดํ•ด ๋ชป ํ•  ์ •๋„์˜€์œผ๋‹ˆ, ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๊ฐœ๋…์ด์˜€์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ฅ Custom Hooks ๋‘ ๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์—์„œ ๊ฐ™์€ ๋กœ์ง์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์™€ Hook ๋˜ํ•œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค - ์ด์ƒ ๊ณต์‹ ์ž๋ฃŒ์— ๋‚˜์˜จ ์„ค๋ช…์ธ๋ฐ, ์•„์ง ์ดํ•ดํ•˜๊ธฐ์—๋Š” ๋ถ€์กฑํ•œ ์„ค๋ช… ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ํ›… ํ™œ์šฉ ๋ฉ”์†Œ๋“œ๋“ค์„ ํ•˜๋‚˜๋กœ ์ค„์—ฌ์คŒ์œผ๋กœ์จ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ณด๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ custom hooks์ž…๋‹ˆ๋‹ค ์ด๋ฆ„์€ use๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. custom hook์€ ๋‹ค๋ฅธ hook์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค custom hook์€ ์กฐ๊ฑด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์—ญ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์ข‹์„ ๊ฑฐ..
์•Œ๊ณ ๋ณด๋ฉด ๋„˜๋‚˜ ์œ ์šฉํ•œ ์‚ฌ์ดํŠธ์ธ Netlify! ์ฃผ๋กœ ํ˜ธ์ŠคํŒ…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ผ๋Š”๋ฐ, netlify dev ๋ผ๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ์–ด์„œ ๋ฐฑ์—”๋“œ๋ถ€๋ถ„๊นŒ์ง€ ์‚ด์ง ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. dev ๊ธฐ๋Šฅ์„ ์•Œ๊ฒŒ ๋œ์ง€ ์–ผ๋งˆ ์•ˆ ๋˜์„œ ๊นŠ์ด ๊ณต๋ถ€๋ฅผ ์•„์ง ๋ชป ํ–ˆ์ง€๋งŒ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Œ ใ…Ž ์˜ค๋Š˜์€ react netlify ๋ฐฐํฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž! Netlify ( https://app.netlify.com/ ) 1. ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค ์ด๋ฉ”์ผ๋กœ๋„ ๊ณ„์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ git๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. git ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด ์†์‰ฝ๊ฒŒ ๊ณ„์ •์„ ๋งŒ๋“œ์‹ค ์ˆ˜ ์žˆ์–ด์š” 2. ์ƒ๋‹จ ๋ฉ”๋‰ด์˜ [Sites] ๋‚˜ [new site from git] ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. netlify๋กœ ๋ฐฐํฌํ•˜๋Š”๊ฒŒ ๋ฌด๋ฃŒ๋ผ๋Š” ์ด์ ๋„ ์žˆ์ง€๋งŒ, git์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐ”๋กœ..
๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ๐Ÿ“š โญ๋“ค์–ด๊ฐ€๋ฉฐ ์‹ค์ „ ํ”„๋กœ์ ํŠธ์— ๋“ค์–ด๊ฐ€๋Š” ๊ธฐ๋Šฅ๊ณผ ๋””์ž์ธ์„ ์‚ดํŽด๋ณด๋‹ค๊ฐ€ ๋‹น์—ฐํ•˜๊ฒŒ ๋ฌดํ•œ ์Šคํฌ๋กค์„ ์จ์•ผํ•œ๋‹ค๋Š” ์˜๊ฒฌ์ด ๋‚˜์™”๋‹ค. ๊ฐ•์˜๋ฅผ ๋ณด๋ฉฐ ๊ตฌํ˜„ํ•ด๋ณธ ์ ๋„ ์žˆ๊ณ  ์ด์ „ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ๊ตฌํ˜„์„ ์ง์ ‘ ํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ๋ดค๋˜ ์ ์ด ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณธ ๊ฒƒ๊ณผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ฒœ์ง€ ์ฐจ์ด๋ผ๋Š” ์ . ๋ฉ”์ธ ํŽ˜์ด์ง€ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ธ๋ฐ ๋‚ด๊ฐ€ ๋งก๊ฒŒ ๋œ ํŽ˜์ด์ง€๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ๋”ฐ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. โญ react-infinite-scroll-component ๋ฆฌ์•กํŠธ์—์„œ ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, 1) ๋ธŒ๋ผ์šฐ์ €์˜ onScroll์„ ์ด์šฉํ•ด์„œ scrollHeight ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ๋‹ค. 2) Intersection..
๋ฆฌ์•กํŠธ๋กœ ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด ๊ฒŒ์‹œํŒ์— ๋“ค์–ด๊ฐ€๋Š” ๊ธฐ๋Šฅ ์ค‘์— ํ•˜๋‚˜๊ฐ€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋“ฑ๋กํŽ˜์ด์ง€๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ  ๋ฉ”์ธ ํŽ˜์ด์ง€๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผํ•ด์„œ router์„ ์จ์•ผํ–ˆ๋‹ค. React Router ๋ฆฌ์•กํŠธ๋Š” SPA (Single Page Application) ๋ฐฉ์‹์œผ๋กœ์จ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ธฐ์กด์˜ MPA ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€ ์•ˆ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ html ํŒŒ์ผ์—์„œ ํšŒ์›์ถ”๊ฐ€ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ํด๋ฆญ์‹œ html์ด ๋ฐ”๋€Œ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํšŒ์›์ถ”๊ฐ€.js๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ Œ๋”๋งํ•ด์˜ค๋Š” ๋ฐฉ์‹์ด SPA์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ react-router๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ(Ming) ๐Ÿฐ
'๋ฆฌ์•กํŠธ' ํƒœ๊ทธ์˜ ๊ธ€ ๋ชฉ๋ก