250x250
Rainbow๐ŸŒˆCoder
My dev Note๐Ÿ“’
Rainbow๐ŸŒˆCoder
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (411)
    • ๊ณต์ง€์‚ฌํ•ญ (0)
    • Debugger (10)
      • Visual Studio Debugger (1)
      • Chrome DevTools (3)
      • Visual Studio Code Debugger (4)
      • eclipse (1)
      • intelliJ (1)
    • OOP (2)
      • OOP (2)
    • TypeScript (54)
      • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript (54)
    • Javascript (87)
      • Javascript (45)
      • Node.js (19)
      • React (5)
      • FE ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ค์ • (3)
      • React์™€ Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ (6)
      • next.js (2)
      • pixi.js (7)
    • ๋งˆํฌ์—… (23)
      • Html & Css (23)
    • C# (80)
      • C# (12)
      • ์ด๊ฒƒ์ด C#์ด๋‹ค (68)
    • C++ (30)
      • c++ (27)
      • win api (3)
    • Unity (18)
      • Unity(๊ธฐ์ดˆ) (8)
      • Unity(C#์ค‘๊ธ‰) (5)
      • ์œ ๋‹ˆํ‹ฐ ํฌํ†ค(๋„คํŠธ์›Œํฌ) (4)
      • unity c# MyCode (1)
    • Java & Spring (29)
      • Java (11)
      • ์Šคํ”„๋ง (8)
      • Java Algorithm (9)
      • Javs Data Structures (1)
    • ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (15)
      • ์ž๋ฃŒ๊ตฌ์กฐ (5)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
    • ํ˜•์ƒ๊ด€๋ฆฌ (15)
      • Git (11)
      • ์†Œ์ŠคํŠธ๋ฆฌ (3)
    • ๊ทธ๋ž˜ํ”ฝ์Šค (7)
      • WebGl (7)
    • AWS (3)
      • aws (3)
    • ๋ฆฌ๋ˆ…์Šค (5)
      • ๋ฆฌ๋ˆ…์Šค (5)
    • ์ฑ… ๋ฆฌ๋ทฐ (13)
      • ํด๋ฆฐ์ฝ”๋“œ(์ฑ…๋ฆฌ๋ทฐ) (3)
      • ์œ ์ง€๋ณด์ˆ˜๊ฐ€๋Šฅํ•œ์ฝ”๋”ฉ์˜๊ธฐ์ˆ C#ํŽธ(์ฑ…๋ฆฌ๋ทฐ) (1)
      • ๋ฆฌํŒฉํ† ๋ง(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธํŒ) (9)
    • Server (2)
      • ๊ฒŒ์ž„ ์„œ๋ฒ„(๋„คํŠธ์›Œํฌ, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ,OS) (2)
    • ์„ค๊ณ„, ์•„ํ‚คํ…์ณ (4)
    • ํŒŒ์ด์ฌ (5)
    • ๋””์ž์ธํŒจํ„ด (2)
    • mocha (2)
    • Jest (1)
    • Spine (1)
    • ์ธ๊ณต์ง€๋Šฅ (1)
      • ํ˜ผ์ž๊ณต๋ถ€ํ•˜๋Š”๋จธ์‹ ๋Ÿฌ๋‹+๋”ฅ๋Ÿฌ๋‹ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์ปดํฌ์ง€์…˜
  • ใ…ฃใ„ท
  • ์œ„์ž„
  • MySQL

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Rainbow๐ŸŒˆCoder

My dev Note๐Ÿ“’

[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (6) npm ๋ฆฌ์•กํŠธ ๋กœ๋”ฉ์Šคํ”ผ๋„ˆ + ์œ„์น˜ ๋„์‹œ ๊ธฐ๋ฐ˜ ๋‚ ์”จ ์•ฑ ์™„์„ฑ
Javascript/React์™€ Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ

[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (6) npm ๋ฆฌ์•กํŠธ ๋กœ๋”ฉ์Šคํ”ผ๋„ˆ + ์œ„์น˜ ๋„์‹œ ๊ธฐ๋ฐ˜ ๋‚ ์”จ ์•ฑ ์™„์„ฑ

2022. 12. 10. 23:54
728x90

 

 

npm ๋ฆฌ์•กํŠธ ๋กœ๋”ฉ์Šคํ”ผ๋„ˆ

https://www.npmjs.com/package/react-spinners

 

react-spinners

A collection of react loading spinners. Latest version: 0.13.7, last published: 7 days ago. Start using react-spinners in your project by running `npm i react-spinners`. There are 714 other projects in the npm registry using react-spinners.

www.npmjs.com

npm install --save react-spinners

 

 

Example

import { useState, CSSProperties } from "react";
import ClipLoader from "react-spinners/ClipLoader";

const override: CSSProperties = {
  display: "block",
  margin: "0 auto",
  borderColor: "red",
};

function App() {
  let [loading, setLoading] = useState(true);
  let [color, setColor] = useState("#ffffff");

  return (
    <div className="sweet-loading">
      <button onClick={() => setLoading(!loading)}>Toggle Loader</button>
      <input value={color} onChange={(input) => setColor(input.target.value)} placeholder="Color of the loader" />

      <ClipLoader
        color={color}
        loading={loading}
        cssOverride={override}
        size={150}
        aria-label="Loading Spinner"
        data-testid="loader"
      />
    </div>
  );
}

export default App;

 

 

๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ทธ๋Œ€๋กœ~ ํ”„๋กœ์ ํŠธ์— ๋ณต๋ถ™ํ•ด๋ณธ๋‹ค.

import './App.css';
import { useEffect, useState } from 'react';
import WeatherBox from "./component/WaetherBox";
import WeatherButton from "./component/WeatherButton";
import ClipLoader from "react-spinners/ClipLoader";
import 'bootstrap/dist/css/bootstrap.min.css';

//1. ์•ฑ์ด ์‹คํ–‰๋˜์ž๋งˆ์ž ํ˜„์žฌ ์œ„์น˜ ๊ธฐ๋ฐ˜์˜ ๋‚ ์”จ๊ฐ€ ๋ณด์ธ๋‹ค.
//2. ๋‚ ์”จ ์ •๋ณด์—๋Š” ๋„์‹œ, ์„ญ์”จ, ํ™”์”จ ๋‚ ์”จ ์ƒํƒœ
//3. 5๊ฐœ์˜ ๋ฒ„ํŠผ์ด ์žˆ๋‹ค (1๊ฐœ๋Š” ํ˜„์žฌ ์œ„์น˜, 4๊ฐœ๋Š” ๋‹ค๋ฅธ ๋„์‹œ)
//4. ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

function App() {
	const [userWeather, setUserWeather] = useState(null);
	const [city, setCity] = useState("Your Weather");
	const cities = ['Your Weather', 'new york', 'toronto', 'paris', 'rondon'];
	let [loading, setLoading] = useState(true);
	let [color, setColor] = useState("#ffffff");


	const getCurrentLocation = () => {
		if (navigator.geolocation) {
			navigator.geolocation.getCurrentPosition((position) => {
				const latitude = position.coords.latitude;
				const longitude = position.coords.longitude;
				getWeatherByCurrentLocation(latitude, longitude);
			});
		} else {
			alert("Geolocation is not supported by this browser.");
		}
	}

	//await ์“ฐ๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜๋Š” async ์—ฌ์•ผ ํ•œ๋‹ค! 
	const getWeatherByCurrentLocation = async (lat, lon) => {
		let url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=b13282392fd34dd9436686c7c7ecda83&units=metric`;
		let response = await fetch(url) //๋น„๋™๊ธฐ(์ง๋…: url์„ patchํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ!) : url ๋กœ๋”ฉํ•œ ๋’ค ์‘๋‹ต๊ฐ’์„ ๋ฐ›๊ธฐ๋กœ ํ•จ
		let data = await response.json(); //์‘๋‹ต์—์„œ json ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ
		setUserWeather(data);
		console.log(data);
	}

	const getWeatherByCity = async () => {
		let url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=b13282392fd34dd9436686c7c7ecda83&units=metric`;
		//
		let response = await fetch(url) //๋น„๋™๊ธฐ(์ง๋…: url์„ patchํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ!) : url ๋กœ๋”ฉํ•œ ๋’ค ์‘๋‹ต๊ฐ’์„ ๋ฐ›๊ธฐ๋กœ ํ•จ
		let data = await response.json(); //์‘๋‹ต์—์„œ json ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ
		setUserWeather(data);
		console.log(data);
	}

	useEffect(() => {
		if (city == "Your Weather") {
			getCurrentLocation();
		} else {
			getWeatherByCity('city', city);
		}
	}, [city]);


	return (
		<div>
			<div className="sweet-loading">
				<button onClick={() => setLoading(!loading)}>Toggle Loader</button>
				<input value={color} onChange={(input) => setColor(input.target.value)} placeholder="Color of the loader" />

				<ClipLoader
					color={color}
					loading={loading}
					size={150}
					aria-label="Loading Spinner"
					data-testid="loader"
				/>
			</div>
			<div className='main'>
				<WeatherBox weather={userWeather} />
				<WeatherButton cities={cities} setCity={setCity} />
			</div>
			<div>
			</div>
		</div >
	);
}

export default App;

 

 

๊ธฐ๋ณธ ๊ฐ’์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์ฃผ๋˜,

	let [loading, setLoading] = useState(false);

๋ฐ์ดํ„ฐ๋ฅผ fetch ํ•˜๋Š” ๋™์•ˆ true๋กœ ํ•ด์ฃผ๋Š” ๋กœ์ง์œผ๋กœ ๋ฐ”๊พธ์–ด์ค€๋‹ค. 

fetch๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค์‹œ false๋กœ ๋Œ๋ ค์ค€๋‹ค.

 

 

App.js

import './App.css';
import { useEffect, useState } from 'react';
import WeatherBox from "./component/WaetherBox";
import WeatherButton from "./component/WeatherButton";
import ClipLoader from "react-spinners/ClipLoader";
import 'bootstrap/dist/css/bootstrap.min.css';

//1. ์•ฑ์ด ์‹คํ–‰๋˜์ž๋งˆ์ž ํ˜„์žฌ ์œ„์น˜ ๊ธฐ๋ฐ˜์˜ ๋‚ ์”จ๊ฐ€ ๋ณด์ธ๋‹ค.
//2. ๋‚ ์”จ ์ •๋ณด์—๋Š” ๋„์‹œ, ์„ญ์”จ, ํ™”์”จ ๋‚ ์”จ ์ƒํƒœ
//3. 5๊ฐœ์˜ ๋ฒ„ํŠผ์ด ์žˆ๋‹ค (1๊ฐœ๋Š” ํ˜„์žฌ ์œ„์น˜, 4๊ฐœ๋Š” ๋‹ค๋ฅธ ๋„์‹œ)
//4. ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

function App() {
	const [userWeather, setUserWeather] = useState(null);
	const [city, setCity] = useState("Your Weather");
	const cities = ['Your Weather', 'new york', 'toronto', 'paris', 'rondon'];
	let [loading, setLoading] = useState(false);


	const getCurrentLocation = () => {
		if (navigator.geolocation) {
			navigator.geolocation.getCurrentPosition((position) => {
				const latitude = position.coords.latitude;
				const longitude = position.coords.longitude;
				getWeatherByCurrentLocation(latitude, longitude);
			});
		} else {
			alert("Geolocation is not supported by this browser.");
		}
	}

	//await ์“ฐ๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜๋Š” async ์—ฌ์•ผ ํ•œ๋‹ค! 
	const getWeatherByCurrentLocation = async (lat, lon) => {
		let url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=b13282392fd34dd9436686c7c7ecda83&units=metric`;
		setLoading(true);
		let response = await fetch(url) //๋น„๋™๊ธฐ(์ง๋…: url์„ patchํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ!) : url ๋กœ๋”ฉํ•œ ๋’ค ์‘๋‹ต๊ฐ’์„ ๋ฐ›๊ธฐ๋กœ ํ•จ
		let data = await response.json(); //์‘๋‹ต์—์„œ json ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ
		setUserWeather(data);
		setLoading(false);
		console.log(data);
	}

	const getWeatherByCity = async () => {
		let url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=b13282392fd34dd9436686c7c7ecda83&units=metric`;
		setLoading(true);
		let response = await fetch(url) //๋น„๋™๊ธฐ(์ง๋…: url์„ patchํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ!) : url ๋กœ๋”ฉํ•œ ๋’ค ์‘๋‹ต๊ฐ’์„ ๋ฐ›๊ธฐ๋กœ ํ•จ
		let data = await response.json(); //์‘๋‹ต์—์„œ json ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค๋‹ฌ๋ผ
		setUserWeather(data);
		setLoading(false);
		console.log(data);
	}

	useEffect(() => {
		if (city == "Your Weather") {
			getCurrentLocation();
		} else {
			getWeatherByCity('city', city);
		}
	}, [city]);


	return (
		<div>
			<div className='main'>
				<ClipLoader className='react-spinners'
					color="#ffffff"
					loading={loading}
					size={150}
					aria-label="Loading Spinner"
					data-testid="loader"
				/>
				<WeatherBox weather={userWeather} />
				<WeatherButton cities={cities} setCity={setCity} loading={loading} setLoading={setLoading} />
			</div>
			<div>
			</div>
		</div >
	);
}

export default App;

๊ทธ๋ฆฌ๊ณ  ์–ด์ƒ‰ํ•œ ๋กœ๋”ฉ์Šคํ”ผ๋„ˆ์˜ ์œ„์น˜๋ฅผ ์˜ฎ๊ฒจ์ฃผ์—ˆ๋‹ค.

 

 

App.css

body{
	background-image : url(https://wallpaperaccess.com/full/5466320.jpg);
	height: 100vh;
	width: 100%;
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
}

.main{
	display: flex;
	flex-direction: column;
	margin: auto;
	justify-content: center;
	justify-content: space-evenly;
	height: 100vh;
}

.weather-info-parents{
	display: flex;
	justify-content: center;
}

.weather-info{
	width: 800px;
	border: 3px solid #aec6fe;
	border-radius: 10px;
	color: white;
	background-color:rgba(108, 144, 202, 0.4);
	padding: 100px;
}

.weather-info-text {
	width: 100%;
	text-align: center;
	padding: 3px;
}

.cityButtonGroup{
	display: flex;
	justify-content: center;
	justify-content: space-evenly;
	align-items: center;
	position:relative;
	width: 100%;
	overflow: hidden;
}

.react-spinners{
	position:absolute;
	width: 100%;
	top: 30%;
	left: 47%;
}

css ์ฐธ๊ณ ์ž๋ฃŒ1
css ์ฐธ๊ณ ์ž๋ฃŒ2

 

 

์ด์ œ, ์—ฌ๊ธฐ์„œ ๋กœ๋”ฉ์Šคํ”ผ๋„ˆ๊ฐ€ ๋Œ์•„๊ฐˆ ๋•Œ weather info์˜ data ๋ถ€๋ถ„์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ์ตœ์ข… ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•œ๋‹ค.

 

App.js

import './App.css';
import { useEffect, useState } from 'react';
import WeatherBox from "./component/WaetherBox";
import WeatherButton from "./component/WeatherButton";
import ClipLoader from "react-spinners/ClipLoader";
import 'bootstrap/dist/css/bootstrap.min.css';

function App() {
	const [userWeather, setUserWeather] = useState(null);
	const [city, setCity] = useState("Your Weather");
	const cities = ['Your Weather', 'new york', 'toronto', 'paris', 'rondon'];
	let [loading, setLoading] = useState(false);


	const getCurrentLocation = () => {
		if (navigator.geolocation) {
			navigator.geolocation.getCurrentPosition((position) => {
				const latitude = position.coords.latitude;
				const longitude = position.coords.longitude;
				getWeatherByCurrentLocation(latitude, longitude);
			});
		} else {
			alert("Geolocation is not supported by this browser.");
		}
	}

	const getWeatherByCurrentLocation = async (lat, lon) => {
		let url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=b13282392fd34dd9436686c7c7ecda83&units=metric`;
		setLoading(true);
		let response = await fetch(url)
		let data = await response.json();
		setUserWeather(data);
		setLoading(false);
		console.log(data);
	}

	const getWeatherByCity = async () => {
		let url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=b13282392fd34dd9436686c7c7ecda83&units=metric`;
		setLoading(true);
		let response = await fetch(url) 
		let data = await response.json();
		setUserWeather(data);
		setLoading(false);
		console.log(data);
	}

	useEffect(() => {
		if (city == "Your Weather") {
			getCurrentLocation();
		} else {
			getWeatherByCity('city', city);
		}
	}, [city]);


	return (
		<div>
			{loading ? <div className='main'>
				<ClipLoader className='react-spinners'
					color="#ffffff"
					loading={loading}
					size={150}
					aria-label="Loading Spinner"
					data-testid="loader"
				/>
				<WeatherBox weather={null} />
				<WeatherButton cities={cities} setCity={setCity} loading={loading} setLoading={setLoading} />
			</div> :
				<div className='main'>
					<WeatherBox weather={userWeather} />
					<WeatherButton cities={cities} setCity={setCity} loading={loading} setLoading={setLoading} />
				</div>}
			<div>
			</div>
		</div >
	);
}

export default App;

App.css

body{
	background-image : url(https://wallpaperaccess.com/full/5466320.jpg);
	height: 100vh;
	width: 100%;
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
}

.main{
	display: flex;
	flex-direction: column;
	margin: auto;
	justify-content: center;
	justify-content: space-evenly;
	height: 100vh;
}

.weather-info-parents{
	display: flex;
	justify-content: center;
}

.weather-info{
	width: 800px;
	border: 3px solid #aec6fe;
	border-radius: 10px;
	color: white;
	background-color:rgba(108, 144, 202, 0.4);
	padding: 100px;
}

.weather-info-text {
	width: 100%;
	text-align: center;
	padding: 3px;
}

.cityButtonGroup{
	display: flex;
	justify-content: center;
	justify-content: space-evenly;
	align-items: center;
	position:relative;
	width: 100%;
	overflow: hidden;
}

.react-spinners{
	position:absolute;
	width: 100%;
	top: 30%;
	left: 47%;
}

 

WeatherBox.js

import React from 'react'

const WaetherBox = ({ weather }) => {
	return (
		<div className='weather-info-parents'>
			<div className='weather-info'>
				<h3 className='weather-info-text'>๋„์‹œ {weather?.name}</h3>
				<h2 className='weather-info-text'>์ง€๊ธˆ ์˜จ๋„ {weather?.main?.temp} / ์Šต๋„ {weather?.main?.humidity}</h2>
				<h2 className='weather-info-text'>๋„ˆ์˜ ๋‚ ์”จ๋Š”? {weather?.weather[0]?.description}</h2>
			</div>
		</div>
	)
}

export default WaetherBox

 

WeatherButton.js

import React from 'react'
import { Button } from 'react-bootstrap';

const WeatherButton = ({ cities, setCity }) => {
	return (
		<div className='cityButtonGroup'>
			{cities.map((item, index) => (<Button variant="primary" key={index}
				onClick={() => {
					setCity(item)
				}}
			>{item}</Button>))}
		</div>
	)
}

export default WeatherButton
728x90

'Javascript > React์™€ Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (5) react one-way data flow + ์œ„์น˜ ๋„์‹œ ๊ธฐ๋ฐ˜ ๋‚ ์”จ ์•ฑ ๊ณ„์† making  (0) 2022.12.09
[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (4) ์œ„์น˜ ๋„์‹œ ๊ธฐ๋ฐ˜ ๋‚ ์”จ ์•ฑ (api ์—ฐ๊ฒฐ ๊ธฐ์ดˆ์ž‘์—…, UI์ž‘์—… )  (1) 2022.12.07
[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (3) ๋ฆฌ์•กํŠธ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ, ๋ผ์ดํ”„ ์‚ฌ์ดํด  (0) 2022.12.05
[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (2) ๋ฆฌ์•กํŠธ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„  (0) 2022.12.04
[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (1) ๋ฆฌ์•กํŠธ์˜ ์ปจ์…‰ state  (0) 2022.12.02
    'Javascript/React์™€ Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (5) react one-way data flow + ์œ„์น˜ ๋„์‹œ ๊ธฐ๋ฐ˜ ๋‚ ์”จ ์•ฑ ๊ณ„์† making
    • [React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (4) ์œ„์น˜ ๋„์‹œ ๊ธฐ๋ฐ˜ ๋‚ ์”จ ์•ฑ (api ์—ฐ๊ฒฐ ๊ธฐ์ดˆ์ž‘์—…, UI์ž‘์—… )
    • [React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (3) ๋ฆฌ์•กํŠธ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ, ๋ผ์ดํ”„ ์‚ฌ์ดํด
    • [React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (2) ๋ฆฌ์•กํŠธ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„
    Rainbow๐ŸŒˆCoder
    Rainbow๐ŸŒˆCoder
    ๋ชฐ๋ผ๋„ ๊ฒฐ๊ตญ์€ ์•„๋Š” ๊ฐœ๋ฐœ์ž, ๊ทธ๋Ÿฐ ์‚ฌ๋žŒ์ด ๋˜๊ธฐ ์œ„ํ•œ ๋งค์ผ์˜ ํ•œ๊ฑธ์Œ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”