์˜ค๋ฅ˜ํ•ด๊ฒฐ

    [ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] Layout Shift ํ•ด๊ฒฐํ•˜๊ธฐ

    ์˜จ๋ผ์ธ ์ „์‹œํšŒ๋ฅผ ๋ฌดํƒˆํ•˜๊ฒŒ ์šด์˜ํ•˜๊ณ  (์šด์˜ํ•˜๋Š” ๋™์•ˆ ํฐ ์ด์Šˆ๊ฐ€ ์—†์—ˆ๊ณ  ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉฐ ๊ณ„์† ๊ฐœ์„ ํ•ด๋‚˜์•„๊ฐ”๋‹ค!) ๋งํฌ๋“œ์ธ์—๋„ ๊ธ€์„ ์˜ฌ๋ฆฌ๋ฉฐ ์šด์˜ ๊ฒฝํ—˜์„ ํฌํ•จํ•ด ์›น์‚ฌ์ดํŠธ๋ฅผ ํ™๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค๋ฅผ ํ•˜๋ฉด์„œ ๋งŒ๋‚œ ํ›Œ๋ฅญํ•œ ๋ฉ˜ํ† ๋‹˜์ด ๊ณ„์‹œ๋Š”๋ฐ, ์—ฌ์ญค๋ณผ ๊ฒƒ์ด ์žˆ์–ด์„œ ์ด๊ฒƒ์ €๊ฒƒ ์—ฌ์ญค๋ณด๋‹ค๊ฐ€ ๋ฉ˜ํ† ๋‹˜๋„ ๋งํฌ๋“œ์ธ ๊ฒŒ์‹œ๊ธ€์„ ํ™•์ธํ–ˆ๋‹ค๋ฉฐ ๊ฐœ์„  ์‚ฌํ•ญ๋“ค์„ ์ถ”์ฒœํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ Layout Shift!!Layout Shift๋กœ ์ธํ•œ ๋ฌธ์ œ์ ๋งํฌ๋“œ์ธ์œผ๋กœ๋ถ€ํ„ฐ ์ฒ˜์Œ์œผ๋กœ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ ‘์†ํ•˜๋Š” ์‚ฌ์šฉ์ž(ํŠนํžˆ ๋ฐ์Šคํฌํƒ‘ ์‚ฌ์šฉ์ž)๋“ค์€ ์›น์„ฑ๋Šฅ์ด ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž๋Š” ์‚ฌ์šฉ์ž๋ณด๋‹ค ์ข‹์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์Šคํฌํƒ‘ ์ฒซ ํ™”๋ฉด์— ๋กœ๋”ฉ๋˜๋Š” ๋น„๋””์˜ค๊ฐ€ ๋А๋ฆฌ๊ฒŒ ๋กœ๋”ฉ๋˜์—ˆ๊ณ , ์ด๋กœ ์ธํ•ด ๋กœ๊ณ  ์ด๋ฏธ์ง€๊ฐ€ ์œ„๋กœ ์˜ฌ๋ผ์˜ค๋Š” Layout Shift ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜..

    VSCode Vitest "์ด ์ž‘์—… ์˜์—ญ์—์„œ ์•„์ง ๋ฐœ๊ฒฌ๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค." ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

    vitest ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜์™€ extension ์„ค์น˜, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๊นŒ์ง€ ๋ชจ๋‘ ๋‹ค ํ•œ ์ดํ›„, vitest extention์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ• ๋•Œ ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ํ•ญ๋ชฉ์ด ๋œจ์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.ํ•ด๋‹น ์ด์Šˆ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ฝค๋‚˜ ๋งŽ์ด ์žˆ๋‹ค.https://github.com/vitest-dev/vscode/issues/196 Vitest extension completely non functional on mac · Issue #196 · vitest-dev/vscodeDescribe the bug Vitest completely fails to work on any of my vitest repos To Reproduce Steps to reproduce the behavi..

    [Docker] docker: Error response from daemon: Ports are not available | address already in use ํฌํŠธ์ถฉ๋Œ ํ•ด๊ฒฐ

    ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ๋„์ค‘ 3000๋ฒˆ ํฌํŠธ๊ฐ€ ๋กœ์ปฌ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉ์ค‘์ด์–ด์„œ ํฌํŠธ์ถฉ๋Œ(์ด๋ฏธ ์‚ฌ์šฉ์ค‘) ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค. ์—ด๋ ค์žˆ๋Š” port ๋‹ซ๊ณ  ์ƒˆ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•1) ์—ด๋ฆฐ ํฌํŠธ ํ™•์ธํ•˜๊ธฐsudo lsof -PiTCP -sTCP:LISTEN2) ํŠน์ • ํฌํŠธ ํ™•์ธํ•˜๊ธฐsudo lsof -i :[port]sudo lsof -i :3000 // example3) ํฌํŠธ ๋‹ซ๊ธฐํŠน์ • ํฌํŠธ๋ฅผ ํ™•์ธํ•œ ๊ฒฐ๊ณผ์—์„œ PID๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํฌํŠธ๋ฅผ ๋‹ซ์•„์ค„ ์ˆ˜ ์žˆ๋‹ค.sudo kill -9 [PID] ์ดํ›„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํŠน์ • ํฌํŠธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ์ž˜ ์ด๋ฃจ์–ด์งˆ ๊ฒƒ์ด๋‹ค. ๋”๋ณด๊ธฐ์ฐธ๊ณ https://jongsky.tistory.com/41 (Mac) port ํ™•์ธ ๋ฐฉ๋ฒ• ๋ฐ 5000 port ์‚ญ์ œ ๋ฐฉ๋ฒ•1. ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ docker-compose๋ฅผ..

    [ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] vite+react-ts+tailwind ์ž‘๋™์•ˆ๋จ ํ•ด๊ฒฐ

    ์ด๋ฒˆ์— ๋น„ํŠธ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  tailwind๋ฅผ ์ ์šฉ์‹œํ‚ค๋Š”๋ฐ tailwind๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•„ ์‚ฝ์งˆ์„ ์ •๋ง ๋งŽ์ด ํ–ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์˜จ ๋‹จ๊ณ„๋กœ ๋™์ผํ•œ ๊ณผ์ •์„ ์ง„ํ–‰ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์Šคํƒ€์ผ ์ ์šฉ์ด ์•ˆ๋์ง€๋งŒ ๊ฒฐ๊ตญ ํ•ด๊ฒฐํ•˜์—ฌ ์ด๊ฑด ๊ธฐ๋กํ•ด๋‘๊ณ  ๋‚˜์ค‘์—๋„ ๋˜‘๊ฐ™์€ ์ด์Šˆ ๋ฐœ์ƒ์‹œ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๋Š” ๋งˆ์Œ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.. ๊ตฌ๊ธ€๋ง ์ง„์งœ ๋งŽ์ดํ–ˆ๋‹ค.. ๐Ÿ‘‰๐Ÿป ๋ฌธ์ œ์ƒํ™ฉ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” vite.config.ts์—์„œ ์„ค์ •ํ•˜๋ผ๋Š” ๊ฒƒ์ด ์—†์—ˆ๋Š”๋ฐ, ๊ตฌ๊ธ€๋ง์„ ํ•˜๋‹ค๋ณด๋‹ˆ vite๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋”ฐ๋กœ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.๊ทธ๋ž˜์„œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ plugin์— ์ถ”๊ฐ€ํ•ด์คฌ๋Š”๋ฐ๋„ style์ด ์ ์šฉ์ด ์•ˆ๋๋‹ค..import tsconfigPaths from "vite-tsconfig-paths";import tailwindcss from ..

    [ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] Git ํŒŒ์ผ๋ช… ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜ ์ธ์‹ ๋ถˆ๊ฐ€ ๋ฌธ์ œ

    ๋”๋ณด๊ธฐ๋™์•„๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ช…์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ํ•„์š”๊ฐ€ ์žˆ์–ด์„œ ๋ณ€๊ฒฝํ–ˆ๋˜ ์ ์ด ์žˆ์—ˆ๋‹ค. ๋‹น์—ฐํžˆ git์ด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ธ์ง€ํ–ˆ์„๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ (๊ทธ๋ƒฅ ๋‹น์—ฐํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค) ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์ด ์žˆ์–ด์„œ git add . ๋กœ ๋ฐ”๋กœ ํ•ฉ์ณ์„œ commit์„ ์ง„ํ–‰ํ–ˆ๋‹ค(์ด๊ฒƒ๋„ ๋‚ด ์‹ค์ˆ˜,, ์–ด๋–ค ํŒŒ์ผ์ด ์–ด๋–ค ์ƒํƒœ์—์„œ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋Š”์ง€ ๊ณ„์† ํ™•์ธํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ปค๋ฐ‹ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์˜€์–ด์•ผ ํ–ˆ๋Š”๋ฐ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋“ค ๋‹ค ๋“ค์–ด๊ฐ”๊ฒ ์ง€~ํ•˜๊ณ  ๋„˜์–ด๊ฐ”์—ˆ๋‹ค..) ๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ๋ฐ”๊ฟ”๋†จ๋˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐ˜์˜์•ˆ๋œ ์ƒํƒœ๋กœ ๊นƒํ—ˆ๋ธŒ์— ๊ณ„์† ๋‚จ์•„์žˆ๊ฒŒ ๋๊ณ ,, ๊ทธ ๋ฒ„์ „์„ ์ฑ„์€์ด๊ฐ€ cloneํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค(๋ฌธ์ œ์˜ ์‹œ๋ฐœ์ ...) ์ฑ„์€์ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ• ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ์—์„œ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ช…์„ ์ˆ˜์ •ํ•ด์„œ(์™œ๋ƒํ•˜๋ฉด ํ˜„์žฌ ์ฝ”๋“œ ๋‚ด์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ช…์€ ๋‚ด ๋ฒ„์ „..

    Express.js CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

    ๐Ÿ‘‡๐Ÿป ํ•ด๊ฒฐ๋ฒ•์€ ๋งจ์•„๋ž˜์—ํ’€์Šคํƒ๊ตฌํ˜„์ค‘, ํ”„๋ก ํŠธ์—์„œ๋Š” axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ์™€ API ์—ฐ๋™์„ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•˜์˜€๋‹ค. ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด http ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋”ฐ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , exportํ•˜์—ฌ axios๋ฅผ ๋” ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค. // http.tsimport axios, { AxiosRequestConfig } from "axios";const BASE_URL = "http://localhost:3000";const DEFAULT_TIMEOUT = 30000;export const createClient = (config?: AxiosRequestConfig) => { const axiosInstance = axios.create({ baseU..

    zsh: command not found: nvm ํ•ด๊ฒฐ

    ๋”๋ณด๊ธฐvite๋กœ ๋ฆฌ์•กํŠธ ์•ฑ์„ ์ƒ์„ฑํ•˜๊ณ  npm install์„ ํ•˜๋‹ค๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ฒŒ ๋˜์—ˆ๊ณ , ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” ๋…ธ๋“œ ๋ฒ„์ „์ด ์ƒ์ดํ•˜๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— nvm์„ ํ†ตํ•ด ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.๋…ธ๋“œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋‹ค.$ nvm install 18.12.1zsh: command not found: nvm1. nvm ์„ค์น˜ ์—ฌ๋ถ€ ํ™•์ธ๋‚ด ๊ฒฝ์šฐ nvm์ด ์„ค์น˜๊ฐ€ ์•ˆ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์˜€๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด nvm์„ ์„ค์น˜ํ•ด์ฃผ์—ˆ๋‹ค.nvm -v // 0.39.7 ๋ฒ„์ „์ด ๋œจ์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ Homebrew๋กœ ์„ค์น˜ํ•ด์ค€๋‹ค.brew updatebrew install nvmmkdir ~/.nvm ์„ค์น˜ํ›„ ์•„๋ž˜ 2๋ฒˆ ์ง„ํ–‰2. zshrc ์„ค์ •nvm์ด ์กด์žฌํ•œ๋‹ค๋ฉด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์ด ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ..

    api.channel.io API ๊ฐ€์ ธ์˜ค๊ธฐ ์—๋Ÿฌ ํ•ด๊ฒฐ - plugin key

    ์ž˜๋งŒ ๋˜๋˜ ๋™์•„๋ฆฌ ์›น์‚ฌ์ดํŠธ๊ฐ€ ๊ฐ‘์ž๊ธฐ POST ํ˜ธ์ถœ ์ค‘์— ์•„๋ž˜์™€ ๊ฐ™์€ 403 forbidden ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค. {type: "constraintUrlError", status: 403, errors: [{message: "this url is constraint"}],…}errors : [{message: "this url is constraint"}]language : "ko"status : 403type : "constraintUrlError"constraintUrlError์— ๋Œ€ํ•ด์„œ ๊ฒ€์ƒ‰๋„ ํ•ด๋ดค์ง€๋งŒ ๋งˆ๋•…ํ•œ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ญ์‹œ, ์˜ค๋ฅ˜๋ฅผ ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค ๋ด์•ผํ•œ๋‹ค. ์˜ค๋ฅ˜์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฃผ์†Œ๊ฐ€ ์žˆ์—ˆ๋‹ค. https://api.channel.io/front/v6/elastic/pl..

    TypeError: Cannot destructure property '๋ณ€์ˆ˜๋ช…' of 'req.body' as it is undefined.

    request body์— ์˜ฌ๋ฐ”๋ฅธ json ํ˜•์‹์œผ๋กœ ๊ฐ’์„ ๋ณด๋‚ด์คฌ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค.TypeError: Cannot destructure property 'user_id' of 'req.body' as it is undefined. ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” body๊ฐ’์— ์žˆ๋Š” user_id๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ, body๋ฅผ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. express๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž. const express = require('express')const app = express();app.use(express.json()); ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” app.use(express.json());์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์ด๋‹ค. app.use(express.json())..