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

์ „์ฒด ๊ธ€

(21)
npm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ์‹œ ETIMEDOUT ์˜ค๋ฅ˜ ์›์ธ๊ณผ ํ•ด๊ฒฐ (registry ๋ฌธ์ œ) msw๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.npm i msw --save-dev ๋ณดํ†ต ์˜ค๋ž˜ ๊ฑธ๋ ค๋„ 1~2๋ถ„์ด๋ฉด ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋Š”๋ฐ 10๋ถ„ ๋„˜๊ฒŒ ์„ค์น˜ ์ค‘์ธ ๊ฒŒ ์ด์ƒํ–ˆ๋‹ค.๊ทธ๋ž˜์„œ ์บ์‹œ ์‚ญ์ œ ํ›„ ์žฌ์„ค์น˜ํ–ˆ์ง€๋งŒ ๋˜‘๊ฐ™์€ ํ˜„์ƒ์ด ๋ฐ˜๋ณต๋˜์—ˆ๊ณ  ํ•œ์ฐธ ๊ธฐ๋‹ค๋ฆฐ ๋์— ๋‚˜์˜ค๋Š” ๊ฑด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜€๋‹ค.npm error code ETIMEDOUT npm error syscall connect npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/msw failed, reason: connect ETIMEDOUT 104.16.6.34:443 npm error network This is a problem related to ne..
REST API์™€ GraphQL ๋น„๊ต ๊ทธ๋™์•ˆ ์ €๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ์„œ๋ฒ„ ํ†ต์‹  ์‹œ REST API๋ฅผ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ GraphQL ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ , REST API์™€ GraphQL์˜ ์ฐจ์ด์ ์„ ์ •ํ™•ํžˆ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด REST API์™€ GraphQL์„ ๋น„๊ตํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. REST APIREST(Representational State Transfer)๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. REST API๋Š” ๋ฆฌ์†Œ์Šค(URL) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๊ฐ ๋ฆฌ์†Œ์Šค๋Š” ๊ณ ์œ ํ•œ URL๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆฌ์†Œ์Šค๋Š” HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ)๋ฅผ ํ†ตํ•ด ์กฐ์ž‘๋ฉ๋‹ˆ๋‹ค.REST API์˜ ์žฅ์ ํ‘œ์ค€ํ™”: REST๋Š” ์ž˜ ์ •์˜๋œ ํ‘œ์ค€์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฐœ..
Next.js์—์„œ Tailwindcss ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ํ•ญ์ƒ Scss๋‚˜ styled-components๋ฅผ ์„ ํ˜ธํ•ด ์™”์ง€๋งŒ, ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ CSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์‚ฌ์šฉํ•ด ๋ณด๋‹ˆ ์‚ฌ์šฉ๋ฒ•์ด ๋งค์šฐ ๊ฐ„ํŽธํ•˜๊ณ , ๋ฌด์—‡๋ณด๋‹ค๋„ ํด๋ž˜์Šค๋ช…์„ ๊ณ ๋ฏผํ•˜๋Š” ์‹œ๊ฐ„์„ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๊ฐ€์žฅ ์ข‹์•˜๋‹ค. https://tailwindcss.com/docs/installation Installation - Tailwind CSSThe simplest and fastest way to get up and running with Tailwind CSS from scratch is with the Tailwind CLI tool.tailwindcss.com 1. ํ”„๋กœ์ ํŠธ์—์„œ tailwindcss, postcss, autoprefixer๋ฅผ ์„ค์น˜ํ•œ๋‹คi..
Promise๋ž€? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์–ธ์–ด์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ Promise์ด๋‹ค. Promise๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›น ์š”์ฒญ, ํŒŒ์ผ ์ฝ๊ธฐ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๋“ฑ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ง• 1์ž‘์—… ์„ฑ๊ณต ์‹œ then() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์‹คํŒจ ์‹œ catch() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.myPromise .then((result) => { console.log('์„ฑ๊ณต: ' + result); }) .catch((error) => { console.error('์‹คํŒจ: ' + error); });ํŠน์ง• 2Promise.all() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ Promise๋ฅผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์„ ๋ชจ..
ํด๋กœ์ €๋ž€? [์ฐธ๊ณ ] https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures ํด๋กœ์ € - JavaScript | MDNํด๋กœ์ €๋Š” ์ฃผ๋ณ€ ์ƒํƒœ(์–ดํœ˜์  ํ™˜๊ฒฝ)์— ๋Œ€ํ•œ ์ฐธ์กฐ์™€ ํ•จ๊ป˜ ๋ฌถ์ธ(ํฌํ•จ๋œ) ํ•จ์ˆ˜์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํด๋กœ์ €๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. JavaScript์—์„œ ํด๋กœ์ €๋Š” ํ•จ์ˆ˜ ์ƒdeveloper.mozilla.org ์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐœ๋…์ด์ง€๋งŒ ๊ทธ๋™์•ˆ ์†Œํ™€ํ•ด์ง€๋ฉฐ ์ •ํ™•ํ•œ ๊ฐœ๋…์„ ๋งŽ์ด ์žŠ์—ˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋Š˜ ํ™•์‹คํ•˜๊ฒŒ ๊ฐœ๋…์„ ์žก์•„๋†”์„œ ์•ž์œผ๋กœ๋Š” ์žŠ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธํด๋กœ์ €๋ž€ ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋•Œ์˜ ๋ฒ”์œ„๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์ด ๋ฒ”์œ„๋ฅผ ๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ..
browser-image-compression์„ ํ™œ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ์›น ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€ ํ™”๋ฉด์„ ์บก์ฒ˜ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.ํ•˜์ง€๋งŒ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€์™€๋Š” ๋‹ค๋ฅด๊ฒŒ html2canvas๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์บก์ฒ˜ํ•œ ์ด๋ฏธ์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.๋‹คํ–‰ํžˆ๋„ browser-image-compression๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋๊ณ  ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ์••์ถ•, ํฌ๋งท ์„ค์ • ํฌ๊ธฐ ์กฐ์ ˆ ๋“ฑ ์ด๋ฏธ์ง€๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์„œ๋ฒ„์™€์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ์›ํ™œํžˆ ์ด๋ฃจ์–ด์กŒ๋‹ค. npm i html2canvas browser-image-compressionhtml2canvas์™€ browser-image-compression ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„ค์น˜๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค const handleC..
[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฐ™์€ ์ˆซ์ž๋Š” ์‹ซ์–ด (Javascript) ๋ฌธ์ œ ์„ค๋ช…๋ฐฐ์—ด arr๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋ฐฐ์—ด arr์˜ ๊ฐ ์›์†Œ๋Š” ์ˆซ์ž 0๋ถ€ํ„ฐ 9๊นŒ์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฐฐ์—ด arr์—์„œ ์—ฐ์†์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ˆซ์ž๋Š” ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ๊ณ  ์ „๋ถ€ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์ œ๊ฑฐ๋œ ํ›„ ๋‚จ์€ ์ˆ˜๋“ค์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” ๋ฐฐ์—ด arr์˜ ์›์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด,arr = [1, 1, 3, 3, 0, 1, 1] ์ด๋ฉด [1, 3, 0, 1]์„ return ํ•ฉ๋‹ˆ๋‹ค.arr = [4, 4, 4, 3, 3] ์ด๋ฉด [4, 3]์„ return ํ•ฉ๋‹ˆ๋‹ค.๋ฐฐ์—ด arr์—์„œ ์—ฐ์†์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ˆซ์ž๋Š” ์ œ๊ฑฐํ•˜๊ณ  ๋‚จ์€ ์ˆ˜๋“ค์„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.์ œํ•œ์‚ฌํ•ญ๋ฐฐ์—ด arr์˜ ํฌ๊ธฐ : 1,000,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋ฐฐ์—ด arr์˜ ์›์†Œ์˜ ํฌ๊ธฐ : 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ  9๋ณด๋‹ค ์ž‘๊ฑฐ..
[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฐ€์šด๋ฐ ๊ธ€์ž ๊ฐ€์ ธ์˜ค๊ธฐ (Javascript) ๋ฌธ์ œ ์„ค๋ช…๋‹จ์–ด s์˜ ๊ฐ€์šด๋ฐ ๊ธ€์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜, solution์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. ๋‹จ์–ด์˜ ๊ธธ์ด๊ฐ€ ์ง์ˆ˜๋ผ๋ฉด ๊ฐ€์šด๋ฐ ๋‘ ๊ธ€์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.์ œํ•œ์‚ฌํ•ญs๋Š” ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ, 100์ดํ•˜์ธ ์ŠคํŠธ๋ง์ž…๋‹ˆ๋‹ค.์ž…์ถœ๋ ฅ ์˜ˆsreturn"abcde""c""qwer""we" ๋‚˜์˜ ํ’€์ดfunction solution(s) { let answer = ''; const sList = s.split(''); const sListLength = sList.length; sListLength % 2 ? answer = sList[Math.floor(sListLength/2)] : answer = sList[sListLength/2 - 1] + sList[sListLength/2..