Socket.IO ๋™์ž‘๊ณผ์ • ์‰ฝ๊ฒŒ ๋ณด๊ธฐ
ยท
๐Ÿ”ง Library/WebSocket
Socket.IO๋ž€? ์‹ค์‹œ๊ฐ„, ์–‘๋ฐฉํ–ฅ, event๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์ œ๊ณตํ•œ๋‹ค. ํ•œ๋งˆ๋””๋กœ, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ž„์˜๋กœ ์„ค์ •ํ•˜๊ณ , ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. websocket์ด๋ผ๋Š” web api์˜ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ค‘ websocket์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋ฟ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ websocket api๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„๋„, socket.io๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ์ง€์›๋œ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์—ฐ๊ฒฐ ๊ณผ์ • ์ดํ•ดํ•˜๊ธฐ 1. ์ผ๋‹จ ์„œ๋ฒ„ ์—ด๊ธฐ (pug ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ ์„œ๋ฒ„๋ฅผ ์—ด์—ˆ๋‹ค) import express from "express"; import http from "http"; import { Server } ..
์ˆœ์ˆ˜ websocket ๋‹ค๋ค„๋ณด๊ธฐ
ยท
๐Ÿ”ง Library/WebSocket
websocket์ด๋ž€?websocket์€ ํ”„๋กœํ† ์ฝœ. ์ฆ‰, ํ†ต์‹ ์˜ ๊ธฐ์ˆ ์ด๋‹ค. ์›น์—์„œ ํ†ต์‹ ํ”„๋กœํ† ์ฝœ ํ•˜๋ฉด httpํ”„๋กœํ† ์ฝœ์ด ์ƒ๊ฐ๋‚œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํ”„๋กœํ† ์ฝœ์€ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์— ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. httpํ”„๋กœํ† ์ฝœ์˜ statelessํŠน์„ฑ์— ๋”ฐ๋ผ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์—ฐ๊ฒฐ์„ ๋Š์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. websocket์€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋‚˜์˜จ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋Œ€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ํŽธํ•˜๋‹ค! ์ด์ œ ๊ธฐ๋ณธ์ ์ธ websocket์˜ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๋А๊ปด๋ณด์ž์ฝ”๋”ฉ ์„œ๋ฒ„์ธก js ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์ž. ๊ธฐ๋ณธ์ ์œผ๋กœ express ์™€ ws๋ฅผ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค. 1. http ์„œ๋ฒ„ ์—ด๊ธฐ, index.html์—ฐ๊ฒฐconst express = require("express"); const ap..
Uncaught TypeError: Cannot read properties of undefined ๋น„๋™๊ธฐ๋ฅผ ์ด์šฉํ–ˆ์„๋•Œ ๋ Œ๋”๋ง ์ˆœ์„œ์ฐจ์ด์— ์˜ํ•ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜
ยท
๐Ÿ”ง Library/React JS
์ธ๊ธฐ์˜ํ™” ์ถ”์ฒœ ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค ๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€๋งŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” movie๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š”๋ฐ ๊ทธ๋Ÿด๋ฆฌ๊ฐ€ ์—†๋‹ค... ์˜ค๋ฅ˜ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; const Detail = () => { const [detail, setDetail] = useState({}); const { id } = useParams(); const getDetail = async () => { const json = await ( await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id..
React์—์„œ input ์ž…๋ ฅ์ด ์•ˆ๋˜๋Š” ๊ฒฐ์ •์ ์ธ ์ด์œ 
ยท
๐Ÿ”ง Library/React JS
1. ์•ˆ๋˜๋Š” ์ด์œ ์™€ , ChatGPT์˜ ๋‹ต๋ณ€ ChatGPT์˜ ๋‹ต๋ณ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. React์—์„œ input ํƒœ๊ทธ์˜ value ์†์„ฑ์— ์ƒํƒœ๊ฐ’์„ ๋„ฃ์œผ๋ฉด, ๊ทธ ๊ฐ’์€ ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” React์—์„œ๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ input ํƒœ๊ทธ์˜ value ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ์ด๋ฅผ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ธ์‹ํ•˜๊ณ , ์ด์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ value ๊ฐ’์ด ์ฝ๊ธฐ ์ „์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ..
coin api ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, useEffect()
ยท
๐Ÿ”ง Library/React JS
coin์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ, ๋ Œ๋”๋ง์‹œ ๋‹จ ํ•œ๋ฒˆ๋งŒ ๊ฐ€์ ธ์˜ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, useEffect๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์šฉํ•œ๋‹ค. useEffect(()=>{}, []) []์ธ์ž์— ์•„๋ฌด๊ฒƒ๋„ ์ ์ง€ ์•Š์œผ๋ฉด, ๋ Œ๋”๋ง ํ›„ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. ์˜ˆ์‹œ ์ƒํƒœ๊ฐ’ coins์— api๋ฅผ ์ €์žฅํ•˜๊ณ , coins.map์„ ํ†ตํ•ด ๋‚ด๋ถ€์š”์†Œ๋ฅผ ๊ทธ๋ ค๋ณด๋Š” ์ฝ”๋“œ๋‹ค. https://api.coinpaprika.com/v1/tickers import React, { useEffect } from "react"; function App() { const [coins, setCoins] = React.useState([]); useEffect(() => { fetch("https://api.coinpaprika.com/v1/tickers") .then((res..
React.useState() ๋ Œ๋”๋ง
ยท
๐Ÿ”ง Library/React JS
useState๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. React.useState()๋Š” [state, modifier]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ดํ•ด๋ฅผ ์œ„ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. const [๊ฐ’, ๊ฐ’ ์„ธํŒ… ํ•จ์ˆ˜] = React.useState(์ดˆ๊ธฐ๊ฐ’); ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ. import React, { useEffect } from "react"; function App() { const [counter, setCounter] = React.useState(0); const handleClick = () => { setCounter(counter + 1); }; return ( {counter} CLICK ); } export default App; ์ƒ์ˆ˜์ธconst๋กœ ์„ ์–ธ์„ ํ–ˆ๋Š”๋ฐ๋„ counter๋ฅผ ..
React์™€ JSX, ReactDOM.render์˜ ํŠน์ง•
ยท
๐Ÿ”ง Library/React JS
ํšจ์œจ์„ฑ JSX๋Š” JavaScript์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค. JSX๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ html๊ณผ js๋ฅผ js๊ณต๊ฐ„์—์„œ ์ž์œ ์ž์ œ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ฑธ ๋ณด๊ณ  ๋†€๋ผ์› ๋‹ค. ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ JSX๋Š” JavaScript XML์˜ ์•ฝ์ž์˜€๋‹ค. ๋‹ค๋ฃฐ๋•Œ๋Š” ์š”๋Ÿฐ์‹์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค. const element = Hello, world; React์—์„œ JSX์‚ฌ์šฉ์ด ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๋Œ€๋ถ„์˜ ์‚ฌ๋žŒ์€ js์ฝ”๋“œ ์•ˆ์—์„œ UI๊ด€๋ จ ์ž‘์—…์„ ํ•  ๋•Œ ์‹œ๊ฐ์ ์œผ๋กœ ๋” ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. React์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์œ„์˜ element์™€ ๊ฐ™์€๊ฑธ ์„ ์–ธ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. const element = React.createElement("h1", {id: "greet"}, "Hello World"); ๋ณด๊ธฐ๋„ ๋ถˆํŽธํ•˜๊ณ , ์ •๋ง ๋”์ฐํ•˜๋‹ค...