์œ ๋ฐ๋ฏธ์ทจ์—…๋ถ€ํŠธ์บ ํ”„

Express.js CR GET //file Data GET app.get("/posts", async (req, res) => { res.json(posts); //JSONํ˜•์‹์œผ๋กœ ์‘๋‹ต๋ณด๋‚ด๊ธฐ }); app.get("/posts/:postId", (req, res) => { const postId = req.params.postId; const post = posts.find((post) => post.id === Number(postId)); res.json(post); }); //axios๋กœ GET app.get("/todos", async (req, res) => { const response = await axios.get( "https://jsonplaceholder.typicode.com/to..
Next.js React Query React Query๋ฅผ ํ†ตํ•ด, useEffect์™€ data-fetch๋ฅผ ํ•œ๋ฒˆ์— ํ•  ์ˆ˜ ์žˆ๋‹ค. useQuery({ queryKey: ["til", { category: "trending" }] }); //category์™ธ์— page, sort๊ฐ™์€๊ฒƒ๋„ ๊ฐ™์ด ๋„ฃ๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. โ—๏ธ react query๋Š” ์„œ๋ฒ„์™€ ๋™๊ธฐํ™” ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋”์‹ local์ชฝ data๋ฅผ ๋‚ ๋ฆฌ๊ณ  ์ƒˆ๋กœ ๋ฐ›์•„์˜ค๋Š” ์ž‘์—…์„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. (invalidate) ๐Ÿ‘‰๐Ÿป key๋ฅผ ๊ตฌ๋ถ„ํ•ด, ์ „์ฒด ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ til๋งŒ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. โœ“queryKey: ๋ถ„์„ํ•˜๊ณ  ์ •๋ฆฌํ•œ๋‹ค. โœ“queryFn: fetch์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ , fetch๋˜๋ฉด queryKey์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋กœ ์ •๋ฆฌ๋˜์–ด ๋“ค์–ด๊ฐ„๋‹ค. โœจ Nex..
immer ๋ฐฐ์—ด์ด๋‚˜, ๊ฐ์ฒด๊ฐ™์€ ๋ถˆ๋ณ€์„ฑ ํƒ€์ž…์„ ๊ฐ€์ง„ state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ์œ„ํ•ด์„ , ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž (...)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ depth๊ฐ€ ํฐ ๊ฐ์ฒด๋ฅผ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜๊ธฐ์—” ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋กœ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„  ๊ต‰์žฅํžˆ ํž˜๋“ ์ผ์ด๋‹ค. โœจimmer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, draft๋ฅผ ์ฃผ๋Š”๋ฐ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋œ ๊ฐ์ฒด์ด๋‹ค! [๊ธฐ์กด์˜ ๋ฐฉ์‹] else if (action.type === ADD_FRIEND) { const newFriend = action.payload; const newState = { ...state, friends: [...state.friends, newFriend] }; return newState; [immer] const newState = produce( (state, (draft) => { con..
NEXFLEX ๊ณผ์ œ โœ๏ธ ์˜ค๋Š˜ ๋ฐฐ์šด context API๋ฅผ ํ™œ์šฉํ•ด์„œ ๋‹‰๋„ค์ž„์„ ์ˆ˜์ •ํ• ์ˆ˜ ์žˆ๊ณ , ํ—ค๋”์— ๋‹‰๋„ค์ž„์„ ๋„์›Œ์•ผํ•˜๋ฉฐ ์ข‹์•„์š”๋ฒ„ํŠผ๊ณผ ์ข‹์•„์š” ์ทจ์†Œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค. HomePage์—์„œ ์ข‹์•„์š”, ์ข‹์•„์š” ์ทจ์†Œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋งˆ์ดํŽ˜์ด์ง€์— ์ด์™€ ๊ฐ™์ด ์ข‹์•„์š”ํ•œ ์˜ํ™” ๋ชฉ๋ก๋“ค์ด ๋‹ด๊ฒจ์•ผํ•œ๋‹ค. ๋ฌผ๋ก  ์ƒ์„ธํŽ˜์ด์ง€์—์„œ๋„ ์ข‹์•„์š”๊ฐ€ ๋œ ์˜ํ™”๋ผ๋ฉด ํ‘œ์‹œ๋˜์–ด์•ผํ•œ๋‹ค. ๐Ÿ›  ๊ฐ•์‚ฌ๋‹˜์˜ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด์ž ๐Ÿ“Œ ์ข‹์•„์š” ๋ฒ„ํŠผ์„ ํ† ๊ธ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, likedMovies์˜ ์ „์—ญ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•œ๋‹ค. {!likedMovies.some((likedMovie) => likedMovie.title === movie.title) ? : some()์œผ๋กœ ์ข‹์•„์š”ํ•œ ์˜ํ™”๋“ค์ด ๋‹ด๊ธด likedMovie์™€ ํ˜„์žฌ ํด๋ฆญ๋œ movied๊ฐ€ ์ผ์น˜์—ฌ๋ถ€(boolean..
๋ฐฐ์—ด ์ƒํƒœ์˜ ๋ถˆ๋ณ€์„ฑ state ์ถ”๊ฐ€: ์ƒˆ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(... )๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ์กด ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜๊ณ  ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ const [items, setItems] = useState(['์‚ฌ๊ณผ', '๋ฐ”๋‚˜๋‚˜']); const addItem = (item) => { setItems([...items, item]); }; ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋กœ ์ด์ „์˜ items๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋„ฃ๊ณ , ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐ ํ˜•์‹์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. โœจ ์ œ๊ฑฐ: ํŠน์ • ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ๋Š” filter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ์ƒˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์š”. const [items, setItems] = useState(['์‚ฌ๊ณผ', '๋ฐ”๋‚˜๋‚˜']); const removeItem = ..
SASS Sass(๋˜๋Š” Syntactically Awesome Stylesheets)๋Š” CSS์˜ ํ™•์žฅ๋œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์Šคํƒ€์ผ ์‹œํŠธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Sass๋Š” ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด CSS ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ CSS์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ณ  ์ค‘๋ณต์„ ์ค„์ด๋ฉฐ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. โ—๏ธSASS๋กœ ์ž‘์„ฑํ•˜๋ฉด CSS๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ž‘์—…์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, CRA๊ฐ€ ํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค. npm install -D sass #layout-header { background-color: yellowgreen; height: 80px; padding: 0 3rem; display: flex; align-items: center; .layout-header-logo { > a { font-..
โœจํ˜„์žฅ์ˆ˜์—… 2์ผ์ฐจ ๐Ÿ™Œ๐Ÿป Javascript(fetch) + React fetch const endpoint = "https://jsonplaceholder.typicode.com/todos/1"; fetch(endpoint).then(async (response) => { const data = await response.json(); console.log(data); }); const endpoint = "https://jsonplaceholder.typicode.com/todos/1"; fetch(endpoint) .then((response) => response.json()) .then((data) => console.log(data)); async function getToDo() { const..
โœจํ˜„์žฅ์ˆ˜์—… 1์ผ์ฐจ ๐Ÿ™Œ๐Ÿป Javascript SEO SEO๋Š” "Search Engine Optimization"์˜ ์•ฝ์ž๋กœ, ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ๋†’์€ ์ˆœ์œ„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์—”์ง„์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ ๋†’์€ ์›นํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ์ค€์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘‰๐Ÿป h1 ํƒœ๊ทธ๋Š” ํ•œ ํŽ˜์ด์ง€๋‹น 1๊ฐœ์”ฉ ์‚ฌ์šฉํ•œ๋‹ค. ๐Ÿ‘‰๐Ÿป imgํƒœ๊ทธ์˜ alt๋Š” next.js์—์„œ ์—๋Ÿฌ์˜ ์›์ธ์ด ๋ ์ˆ˜ ์žˆ๊ณ , ์ ‘๊ทผ์„ฑ SEO์ ์ˆ˜์—์„œ ๋†’์ผ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๐Ÿ‘‰๐Ÿป ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ ๋˜ํ•œ SEO ์ตœ์ ํ™” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ฒซ ํ˜„์žฅ๊ฐ•์˜ ์‹ค์Šต์ด์˜€๋‹ค! ์งง์€ ์‹œ๊ฐ„๋‚ด์— ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š๋ผ ์ข€ ํž˜๋“ค์—ˆ์ง€๋งŒ ๋‹คํ–‰ํžˆ ์ œ์‹œ๊ฐ„ ๋‚ด์— ์™„์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฒซ ํƒ€์ž„์–ดํƒ์ด..
Yuuuki
'์œ ๋ฐ๋ฏธ์ทจ์—…๋ถ€ํŠธ์บ ํ”„' ํƒœ๊ทธ์˜ ๊ธ€ ๋ชฉ๋ก