์ค๋ฅํด๊ฒฐ
[ํธ๋ฌ๋ธ์ํ ] 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())..