๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ

    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..

    [Next.js] ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

    Next.js๋Š” ์„œ๋ฒ„์‚ฌ์ด๋“œ๋ Œ๋”๋ง์„ ์ง€์›ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์˜ ์žฅ์ ์€ ์•„๋ž˜ ํฌ์ŠคํŒ…์— ์ •๋ฆฌํ•ด๋†“์•˜๋‹ค. SSR์˜ ๊ฒฝํ—˜์„ ์Œ“๊ณ  ์‹ถ์–ด์„œ Next.js๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.2024.05.30 - [Front-end/React] - [React] ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ๋‹ค์ด๋ธŒ 4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์ฃผ์š” ์ •๋ฆฌ [React] ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ๋‹ค์ด๋ธŒ 4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์ฃผ์š” ์ •๋ฆฌ1. ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ž€?์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ฝ์ž์ธ SPA๋Š” ๋ Œ๋”๋ง๊ณผ ๋ผ์šฐํŒ…์— ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. SPAworld-developer.tistory.comํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐnpx create-next-app@latest ๋งŒ์•ฝ typescript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ..

    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())..

    [React] ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ๋‹ค์ด๋ธŒ 4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์ฃผ์š” ์ •๋ฆฌ

    1. ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ž€?์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ฝ์ž์ธ SPA๋Š” ๋ Œ๋”๋ง๊ณผ ๋ผ์šฐํŒ…์— ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. SPA๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌํ˜„๋˜๋ฉฐ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์•„์˜ค์ง€ ์•Š๋Š”๋‹ค. ์ตœ์ดˆ์— ์ฒซ ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์˜จ ์ดํ›„์— ํŽ˜์ด์ง€ ์ „ํ™˜ ๋‹จ๊ณ„์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ธŒ๋Ÿฌ์šฐ์ €์˜ history.pushState์™€ history.replaceState๋กœ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ HTML์„ ๋‚ด๋ ค๋ฐ›์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ๋ชจ๋“  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. SPA๋Š” ์ตœ์ดˆ ์ฒซ ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์„ ๋•Œ๋Š” SSR์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ดํ›„์—๋Š” CSR์„ ์ด์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. 1.1 SPA์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜คํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ..

    [React] SPA, CSR์€ ๊ฐ™์„๊นŒ ๋‹ค๋ฅผ๊นŒ

    ๋‹ต๋ถ€ํ„ฐ ์ด์•ผ๊ธฐ ํ•˜์ž๋ฉด SPA, CSR์€ ๊ฐ™์ง€ ์•Š๋‹ค. ์• ์ดˆ์— ๋น„๊ต ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค. CSR(Client Side Rendering)์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๋นˆ HTML๋งŒ ๋ฐ›์•„์˜ค๊ณ , ๋ฐ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ static ํŒŒ์ผ๋“ค์ด ๋กœ๋“œ๋œ ์ดํ›„์— ์š”์ฒญํ•ด์„œ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋จSSR(Server Side Rendering)CSR๊ณผ ๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ชจ๋‘ ์‚ฝ์ž…ํ•˜์—ฌ ์™„์„ฑ๋œ HTML์„ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋จSPA(Single Page Application)์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฒซ ํŽ˜์ด์ง€๋งŒ ๋ฐ›์•„์˜ค๊ณ  ์ดํ›„์—๋Š” ๋™์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์•„์˜ค์ง€ ์•Š๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งํ•จ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ๋•Œ ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š์ŒMPA(Multiple Page Appl..

    express์—์„œ API ๊ตฌํ˜„์‹œ URL parameters ๋ฐ›๋Š” ๋ฐฉ๋ฒ•

    ๋ฌธ์ œ ํ•ด๊ฒฐ ์š”์•ฝURL parameters ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” ์•„๋ž˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.API ์ฃผ์†Œ๋Š” /games/:gameId๋กœ ํ•œ๋‹ค.const id = req.params.gameId;const game_id = req.params.gameId;const {gameId} = req.params;API ๊ตฌํ˜„ ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๊ฐ€ URL parameters์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ GET method๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ gameId๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์ž„์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” API ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋‹ค. // games.jsconst express = require("express");const router = express.Router();const {gameDetail} = require('../control..

    Node.js์—์„œ .env ๋ณ€์ˆ˜ ์•ˆ๋ถˆ๋Ÿฌ์™€์ง

    express๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋˜์ค‘ port๋ฒˆํ˜ธ๋Š” env์— ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.๊ทธ๋Ÿฐ๋ฐ ๊ณ„์† localhost:3000์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์‹คํ–‰ํ–ˆ๋˜ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.// app.jsconst express = require("express");const app = express();const dotenv = require("dotenv");dotenv.config();app.listen(process.env.PORT);๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์›์ธ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.1. PORT๋ฒˆํ˜ธ ๋‹ค๋ฆ„//.envPORT=3000ํฌํŠธ๋ฒˆํ˜ธ๋Š” ์ž˜ ๋“ค์–ด๊ฐ”์œผ๋‹ˆ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. 2. ๋ชจ๋“ˆ์ด ์ •์ƒ์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์•ˆ๋จ//package.json{ "dependencies": { "dotenv": "^16.4.5", ..

    ๋‘๋“œ๋ฆฌ๋ฉด ์—ด๋ฆฌ๋”๋ผ

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

    [Crop] ํ”„๋กœ์ ํŠธ ํŒ€์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ!

    ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ๊ณ„๊ธฐSSR์— ๋Œ€ํ•ด ๊ฒฝํ—˜์„ ์Œ“๊ณ  ์‹ถ์–ด์„œ Next.js๋ฅผ ์‚ฌ์šฉํ•ด๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.๋˜, ๊ทธ๋ƒฅ "ํ™”๋ฉด์ƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์™„์„ฑ!" ์œผ๋กœ ๋๋‚ฌ๋˜ ์ด์ „ ํ”„๋กœ์ ํŠธ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ธ์ •์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ์„ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ๋ Œ๋”๋ง์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ํŽ˜์ด์ง€์—์„œ ์‹œ๊ฐ„์„ ์ค„์—ฌ๋ณด๊ณ  ์‹ถ์—ˆ๊ณ ,,,๊ทธ๋‹ˆ๊นŒ ๊ฒฐ๊ตญ ์„ฑ๋Šฅ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•œ ๊ฒฝํ—˜์˜ ๊ฐˆ๊ธ‰ํ•จ์ด ์ปค์„œ ์ด๋ฅผ ์ค‘์ ์œผ๋กœ ๋‘” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ–ˆ๋‹ค. ๋˜ ํŒŒ๋“œ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋• ์˜ค๋ฅ˜ํ•ด๊ฒฐ์„ ๊ธฐ๋กํ•  ์‹œ๊ฐ„์ด ์ •๋ง ๋ถ€์กฑํ•ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๊ธฐ๋กํ•ด๋†“์ง€ ๋ชปํ–ˆ๋‹ค(์•„์ฃผ ํฐ ์‹ค์ˆ˜์˜€๋‹ค)๊ทธ๋•Œ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์‚ดํŽด๋ณด๋Š”๊ฒŒ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์•„์„œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜„์žฌ ์‹œ์ ์—์„œ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•˜๊ณ ,์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด์„œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ๊ณ ๋ฏผํ•ด์„œ ๊ธฐ๋กํ•ด๋ณด๋ ค๊ณ ..