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

์ „์ฒด ๊ธ€

(90)
CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ  React์šฉ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Emotion์˜ ๋‘ ๋ฒˆ์งธ๋กœ ํ™œ๋ฐœํ•œ ์œ ์ง€๋ณด์ˆ˜์ž์ธ Sam์˜ ํฌ์ŠคํŠธ๋ฅผ ๋ฒˆ์—ญํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. https://dev.to/srmagura/why-were-breaking-up-wiht-css-in-js-4g9b Why We're Breaking Up with CSS-in-JSHi, I'm Sam — software engineer at Spot and the 2nd most active maintainer of Emotion, a...dev.to ์ด ํฌ์ŠคํŠธ์—์„œ๋Š” ์™œ CSS-in-JS์— ๋งค๋ ฅ์„ ๋А๊ผˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ํŒ€์ด ์—ฌ๊ธฐ์„œ ๋– ๋‚˜๊ธฐ๋กœ ํ–ˆ๋Š”์ง€ ๊นŠ์ด ์žˆ๊ฒŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. 1. CSS-in-JS๋ž€ ๋ฌด์—‡์ธ๊ฐ€?์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, CSS-in-JS๋Š” JavaScript๋‚˜ TypeSc..
CSS-in-JS๋ž€ CSS-in-JS๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์Šคํƒ€์ผ์„ ์„ ์–ธ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ธ๋ผ์ธ ์Šคํƒ€์ผ์ด CSS-in-JS์ผ๊นŒ? ์•„๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์— ๊ด€ํ•ด ์•Œ์•„๋ณด์ž. ์ธ๋ผ์ธ ์Šคํƒ€์ผ VS CSS-in-JS ๋จผ์ € ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์‚ดํŽด๋ณด์ž.const textStyles = { color: white, backgroundColor: black}const SomeComponent = () => { return ( inline style );}; ์œ„ ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ DOM ๋…ธ๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐํ•œ๋‹ค.inline style ๋‹ค์Œ์œผ๋กœ CSS-in-JS ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์ž.import styled from "styled-components";cons..
๊ธฐ์กด์˜ Vite์—์„œ Next.js๋กœ ์ „ํ™˜ํ•˜๋Š” ์ด์œ  ํŒ€์›๊ณผ์˜ ๋…ผ์˜ ๋์— ๊ธฐ์กด์˜ Vite ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Next.js๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ์ „ํ™˜์„ ๊ฒฐ์ •ํ•œ ๊ฐ€์žฅ ํฐ ์ด์œ ๋กœ๋Š” ๋„คํŠธ์›Œํฌ ํญํฌ ํ˜„์ƒ์„ ์ œ๊ฑฐํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๊ธฐ์กด์— ์ž‘์—…ํ•˜๋˜ repository๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์—์„œ Next.js migration ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ด๋‹ค. 1. ๋А๋ฆฐ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๊ธฐ๋ณธ์ ์ธ React์šฉ Vite ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ–ˆ๋‹ค๋ฉด, ์ด๋Š” SPA๋กœ, ์ด ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.- ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „, React ์ฝ”๋“œ์™€ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒˆ๋“ค์ด ๋‹ค์šด๋กœ๋“œ๋˜๊ณ  ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.- ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๊ณผ ์˜์กด์„ฑ์ด ์ถ”๊ฐ€๋ ์ˆ˜๋ก ์• ํ”Œ๋ฆฌ..
Call by Value VS Call by Reference ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ฃผ์š” ๋ฐฉ์‹์ธ ์ฐธ์กฐ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.Call by Value: ๊ฐ’์— ์˜ํ•œ ์ฐธ์กฐ ๋ฐฉ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ '๊ฐ’' ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์—์„œ ๊ธฐ๋ณธ ํƒ€์ž…, ์ฆ‰ ์ˆซ์ž, ๋ฌธ์ž์—ด, ๋ถˆ๋ฆฌ์–ธ ๋“ฑ์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ค€๋‹ค.ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„, ์›๋ณธ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ์›๋ณธ์˜ ๋ณต์‚ฌ๋ณธ์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.let num = 10;function changeValue(x) { x = 20; // ๋ณต์‚ฌ๋œ ๊ฐ’ 'x'๋งŒ 20์œผ๋กœ ๋ณ€๊ฒฝ}changeValue(num);// num์€ ์—ฌ์ „ํžˆ 10์ž…๋‹ˆ๋‹ค. ์›๋ณธ..
Dependent Queries useQuery dependent Query์ข…์†(๋˜๋Š” ์ˆœ์ฐจ์ ) ์ฟผ๋ฆฌ๋Š” ์ด์ „ ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๋‹ค. // ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐconst { data: user } = useQuery({ queryKey: ['user', email], queryFn: getUserByEmail,})const userId = user?.id// ์‚ฌ์šฉ์ž์˜ ํ”„๋กœ์ ํŠธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐconst { status, fetchStatus, data: projects,} = useQuery({ queryKey: ['projects', userId], queryFn: getProjectsByUser, // userId๊ฐ€ ์กด์žฌํ•  ๋•Œ๊นŒ์ง€ ์ฟผ๋ฆฌ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. enabl..
Parallel Queries "Parallel"(๋ณ‘๋ ฌ) ์ฟผ๋ฆฌ๋Š” fetching ๋™์‹œ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ‘๋ ฌ๋กœ, ์ฆ‰ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค. Manual Parallel Queries: ์ˆ˜๋™ ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ์˜ ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ณ„๋‹ค๋ฅธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. TanStack Query์˜ useQuery ๋ฐ useInfiniteQuery ํ›…์„ ์›ํ•˜๋Š” ๋งŒํผ ๋‚˜๋ž€ํžˆ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. function App () { // ๋‹ค์Œ ์ฟผ๋ฆฌ๋“ค์€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋œ๋‹ค const usersQuery = useQuery({ queryKey: ['users'], queryFn: fetchUsers }) const teamsQuery = useQuery({ queryKey: ['teams'], queryFn: fet..
Lv.3 ํ‘œ ํŽธ์ง‘ "U X": ํ˜„์žฌ ์„ ํƒํ•œ ํ–‰์—์„œ X์นธ ์œ„์— ์žˆ๋Š” ํ–‰์„ ์„ ํƒํ•œ๋‹ค."D X": ํ˜„์žฌ ์„ ํƒํ•œ ํ–‰์—์„œ X์นธ ์•„๋ž˜์— ์žˆ๋Š” ํ–‰์„ ์„ ํƒํ•œ๋‹ค."C": ํ˜„์žฌ ์„ ํƒํ•œ ํ–‰์„ ์‚ญ์ œํ•œ ํ›„, ๋ฐ”๋กœ ์•„๋ž˜ ํ–‰์„ ์„ ํƒํ•œ๋‹ค. ๋‹จ, ์‚ญ์ œ๋œ ํ–‰์ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ํ–‰์ธ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์œ— ํ–‰์„ ์„ ํƒํ•œ๋‹ค."Z": ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ญ์ œํ•œ ํ–‰์„ ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌํ•œ๋‹ค. ๋‹จ, ํ˜„์žฌ ์„ ํƒํ•œ ํ–‰์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์‚ฌ์šฉํ•  ๋ฐฉ๋ฒ•์€ ์‹ค์ œ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๋Œ€์‹ , ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ์—ฐ์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ๊ฐํ•ด๋ณด๊ธฐ์‚ญ์ œ๋œ ํ–‰์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋งˆ์ง€๋ง‰ ํ–‰์ด ์‚ญ์ œ๋˜์—ˆ์„ ๋•Œ, ๋ฐ”๋กœ ์œ„์˜ ํ–‰์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•๋ฐฐ์—ด์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ ๋„ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ์‚ญ์ œ๊ฐ€ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•ํ–‰ ์‚ญ์ œ๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„, ํ˜„์žฌ ์„ ํƒํ•œ ํ–‰์˜ ์œ„, ์•„๋ž˜ ํ–‰์ด ์„œ๋กœ ๋ถ™๋„๋ก up..
๋ฐฐ์—ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽธ) ๋„์„œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•const arr = [0, 0, 0, 0, 0, 0];๋ฐฐ์—ด ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•const arr1 = new Array(6); // [undefined, undefined, ...]const arr2 = [...new Array(6)].map((_, i) => i + 1); // [1, 2, 3, 4, 5, 6]Array.fill() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•const arr = new Array(6).fill(0); [0, 0, 0, 0, 0, 0] 2์ฐจ์› ๋ฐฐ์—ด// 2์ฐจ์› ๋ฐฐ์—ด์„ ๋ฆฌํ„ฐ๋Ÿด๋กœ ํ‘œํ˜„const arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 1..