๐Ÿ’ป๐Ÿ’€/๊ฐœ๋ฐœ 27

[React] ์ปดํฌ๋„ŒํŠธ ๊ฐ•์ œ Re-renderํ•˜๊ธฐ (re-render ์›๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด)

์›๊ธ€: How and when to force a React component to re-render (์ฃผ์˜โ• ์˜์—ญ ๋‹ค์ˆ˜ ์กด์žฌ) ๋ฆฌ์•กํŠธ๋Š” ๋ณดํ†ต ์ž๋™์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ•์ œ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฆฌ์•กํŠธ์˜ ๋ฆฌ๋ Œ๋” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์›น ๋ฐœ์ „์˜ ์‹œ์ž‘์—์„œ๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ HTML๊ณผ CSS๊ฐ€ ์›น ์‚ฌ์ดํŠธ์˜ ์‹œ๊ฐ์ ์ธ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ JavaScript๊ฐ€ ๋“ฑ์žฅํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋Š” ๋ Œ๋”๋ง๋œ ํŽ˜์ด์ง€์˜ HTML์„ ์ฝ๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฅผ DOM API๋ผ๊ณ  ํ•œ๋‹ค. jQuery์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ DOM API ์œ„์— ํ–ฅ์ƒ๋œ ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์ง„ ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์˜ ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ–ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜..

[JS] Web APIs์— ๋Œ€ํ•ด

1. APIs๋ž€ API(Application Programming Interfaces)๋ž€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง„ ์ผ์ข…์˜ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ๋“ค์˜ ๋ชจ์Œ, ๊ตฌ์„ฑ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. API๋Š” ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ฌธ๋ฒ•์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์›น์•ฑ์—์„œ 3D ๊ทธ๋ž˜ํ”ฝ ๊ฐœ๋ฐœ์„ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? GPU๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” C๋‚˜ C++๊ณผ ๊ฐ™์€ low-level ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Ÿฐ ๊ฒƒ๋“ค์„ ์•Œ์ง€ ๋ชปํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋‚˜ ํŒŒ์ด์ฌ๊ณผ ๊ฐ™์€ high-level ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ APIs ํด..

[JS] ๋ฐฐ์—ด APIs: splice์™€ slice์˜ ๋น„๊ต

TL;DR slice() ๋ฉ”์„œ๋“œ๋Š” ๋ณต์‚ฌ+์ถ”์ถœ์˜ ๊ฐœ๋…, splice() ๋ฉ”์„œ๋“œ๋Š” ์ œ๊ฑฐ+์ถ”์ถœ์˜ ๊ฐœ๋…์ด๋‹ค. ๋•Œ๋ฌธ์— ์›๋ณธ ๋ฐฐ์—ด์ด ์œ ์ง€๋˜์–ด์•ผ ํ•  ๋•Œ๋Š” slice() ๋ฉ”์„œ๋“œ๋ฅผ, ์›๋ณธ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ๋Š” splice() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํŠนํžˆ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๊ณง๋ฐ”๋กœ ๊ทธ ์œ„์น˜์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด splice() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฌธ์ œ ์•„๋ž˜ array ๋ฐฐ์—ด์˜ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ์ฑ„, ๋งจ ์•ž์˜ ๋‘ ์›์†Œ๊ฐ€ ์ œ๊ฑฐ๋œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ถœ๋ ฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋‘˜ ์ค‘ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์จ์•ผํ• ๊นŒ? const array = [1, 2, 3, 4, 5];1. splice() Removes elements from an array and, if necessary, inserts new elements in their pl..

[React] Webpack์œผ๋กœ ๊ตฌ์ถ•ํ•œ React ํ”„๋กœ์ ํŠธ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(.env) ์‚ฌ์šฉํ•˜๊ธฐ

TL;DR Webpack์„ ํ†ตํ•ด ์ง์ ‘ ๊ตฌ์„ฑํ•œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ .env ํŒŒ์ผ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ REACT_APP_์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•„๋„ ๋จ dotenv ํŒจํ‚ค์ง€: DefinePlugin์„ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ์ „์—ญ ๋ณ€์ˆ˜ ์ •์˜ dotenv-webpack ํŒจํ‚ค์ง€: ํ”Œ๋Ÿฌ๊ทธ์ธ์— new Dotenv() ์ถ”๊ฐ€ CRA๋ฅผ ํ†ตํ•ด ๊ตฌ์ถ•ํ•œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๋ณ€์ˆ˜๋ช…์€ ๋ฐ˜๋“œ์‹œ REACT_APP_์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ ๋ณ„๋„์˜ ์„ค์ • ์—†์ด /src ๋””๋ ‰ํ† ๋ฆฌ์˜ ํ•˜์œ„ ํŒŒ์ผ์—์„œ process.env๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ ‘๊ทผ 1. ์‚ฝ์งˆ๊ธฐ '๋ฆฌ์•กํŠธ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ' ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๊ตฌ๊ธ€๋งํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ dotenv ํŒจํ‚ค์ง€ ์„ค์น˜ -> ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .env ํŒŒ์ผ ์ƒ์„ฑ -> REACT_APP_์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ณ€์ˆ˜ ์ž‘์„ฑ -> ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ณณ์—์„œ r..

[Git] ๊นƒํ—ˆ๋ธŒ ์ธ์ฆ personal access token์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ(git config credential ์„ค์ • ์ฃผ์˜)

1. ๊นƒ 403 ์—๋Ÿฌ ๋ฐœ์ƒ ๊นƒํ—ˆ๋ธŒ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์— push๋ฅผ ํ•˜๋ ค๋Š”๋ฐ ๋œฌ๊ธˆ์—†์ด ์ ‘๊ทผ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉฐ 403 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 8์›” 13์ผ๋ถ€ํ„ฐ ๋”์ด์ƒ ๊นƒํ—ˆ๋ธŒ ๊ณ„์ •์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค. remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information. fatal: unable to access '': The reque..

[React] resize ์ด๋ฒคํŠธ ๋‹ค๋ฃจ๊ธฐ

+ 2022.07.13 ์ถ”๊ฐ€ ๋Œ“๊ธ€์„ ๋ฌด์‹œํ• ๊นŒ ํ•˜๋‹ค๊ฐ€ ์•„๋ฌด๋ž˜๋„ ๋‚˜์˜ ์ž‘๊ณ  ๋‹ค ์“ฐ๋Ÿฌ์ ธ๊ฐ€๋Š” ๊ตฌ๋ฉ๊ฐ€๊ฒŒ ๊ฐ™์€ ๋ธ”๋กœ๊ทธ์— ์ด๋Ÿฐ ์˜๊ฒฌ์ด ๋“ค์–ด์˜ค๋Š” ์ผ์ด ๋˜ ์žˆ์„๊นŒ ์‹ถ์–ด ๋Šฆ๊ฒŒ๋ผ๋„ ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ฒจ๋ณธ๋‹ค. ๋จผ์ € ์ด ๊ธ€์€ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋“ฑ๋กํ•œ ์‹œ์ ๋ณด๋‹ค ํ›จ์”ฌ ์ด์ „์— ์“ด ๊ธ€์ด๋‹ค. ๊ทธ ๋‹น์‹œ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด์„œ ๋‚˜๋„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ์ด๊ณ , ๋„ˆ๋ฌด ์œ ์ตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ๋งˆ์Œ์œผ๋กœ ๊ธ€์„ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์‹œ๊ฐ„์ด ๊ฝค ์ง€๋‚ฌ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๊ธฐ์–ต๋‚˜๋Š” ๊ฑด ์™ธ๊ตญ ๊ธ€์„ ํ† ์”จํ•˜๋‚˜ ์•ˆ ํ‹€๋ฆฌ๊ณ  ๊ทธ๋Œ€๋กœ ๋ฒ ๊ปด ๋ฒˆ์—ญํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ ์ตœ๋Œ€ํ•œ ๋‚˜์˜ ์–ธ์–ด๋กœ ์ •๋ฆฌํ•˜๊ณ  ์†Œ์Šค๋„ ์ง์ ‘ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ณ  ๋‚ด ๋ฐฉ์‹ ๋Œ€๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค(์ด๊ฒŒ ๋” ๋‚˜์œ ๊ฑธ๊นŒ?ใ… ใ… ). ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์— ํ˜น์‹œ๋‚˜ ์›๊ธ€์„ ์ฐพ์•„๋ดค๋Š”๋ฐ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ธ€์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค..๐Ÿ˜ฅ ํ•˜์ง€๋งŒ ์–ผ์ถ” ๊ฐ€์žฅ ๋น„์Šทํ•ด๋ณด์ด๊ณ  ๋‚˜๋„ ๋‚ฏ์ด ๊ฐ€์žฅ ์ต..

[Firebase] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— CSV ํŒŒ์ผ Importํ•˜๊ธฐ

Firebase๋ž€ Firebase๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ํ•„์š” ์—†์ด ์ฆ‰, ์„œ๋ฒ„๋ฆฌ์Šค๋กœ ๋น ๋ฅด๊ฒŒ ์›น์•ฑ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ๊ทธ ์‚ฌ์ „ ์ž‘์—…์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ Mock ๋ฐ์ดํ„ฐ๋ฅผ Firebase์— importํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ด๋‹ค. ๐Ÿ›‘ ์ด๋ ‡๊ฒŒ importํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ๋ฎ์–ด์”Œ์›Œ์ ธ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ๋ฐ์ดํ„ฐ์™€ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„  ์•ˆ๋œ๋‹ค! 1. CSV → JSON ๋ณ€ํ™˜ Firebase ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— importํ•˜๊ธฐ ์œ„ํ•ด์„  JSON ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ..