๐Ÿ’ป My Work/๐Ÿ”ฅ React 31

[React/JS] ํ˜„์žฌ ๋‚ ์งœ, ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ

ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ตฌํ•ด๋ด…์‹œ๋‹ค! 00. new Date() const today = new Date(); console.log(today); new Date()๋Š” ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค๐ŸŒž 01. ํ˜„์žฌ ์—ฐ๋„/์›”/์ผ/์š”์ผ import * as React from "react"; export default function App() { const today = new Date(); const year = today.getFullYear(); // ๋…„๋„ const month = today.getMonth() + 1; // ์›” const date = today.getDate(); // ๋‚ ์งœ const day = today.getDay(); // ์š”์ผ console.log(year + "/" ..

[React] useNavigate Hook์œผ๋กœ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๊ธฐ(Hook ์ง์ ‘ ๋งŒ๋“ค๊ธฐ)

React Hook๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ฐ’ ์ ‘๊ทผ๊ณผ ์ž์‹ ์š”์†Œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” useState, useEffect ๊ฐ™์€ ๋‚ด์žฅ Hook์„ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ, ์ด ์ค‘ useNavigate๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•ด๋ณผ๊ฒŒ์š”~! ์ €๋Š” Hook์„ ์ง์ ‘ ๋งŒ๋“ค๊ฑด๋ฐ, ํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ useNavigate()๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. => ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋งจ ๋ฐ‘์—์„œ ์†Œ๊ฐœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค! 00. useNavigate usePage ๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. usePage.js import { useNavigate } from "react-router-dom"; function usePage() { /** ํŽ˜์ด์ง€ ์ด๋™ hook */ const navigate = useN..

[React] URLSearchParams๋กœ ๋™์ ๋ผ์šฐํŒ…(Dynamic Routing)ํ•˜๊ธฐ

watch?v= ์ด๋Ÿฐ ์‹์œผ๋กœ url์— ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ค„๊นŒ! https://avoc-o-d.tistory.com/71 [React] useNavigate, useParams๋กœ ๋™์ ๋ผ์šฐํŒ…(Dynamic Routing) ํ•˜๊ธฐ (GET - URL์— ํŒŒ๋ผ๋ฏธํ„ฐ) ํŽ˜์ด์ง€๋Š” ๋˜‘๊ฐ™์€๋ฐ, ์•ˆ์—์„œ ๋ Œ๋”๋˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋“ค ์žˆ์ฃ ! ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ํŠœ๋ธŒ์˜ ๊ฐ ์˜์ƒ ์ƒ์„ธํŽ˜์ด์ง€๊ฐ€ ์žˆ๊ฒ ๋„ค์š”. ๐Ÿคฉ ์ด๋ ‡๊ฒŒ Routes์˜ ๊ฒฝ๋กœ(URL)์— ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ avoc-o-d.tistory.com ์ €๋ฒˆ์— ์ž‘์„ฑํ•œ ๋™์ ๋ผ์šฐํŒ… ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ, useParams ๋กœ๋„ ๊ฐ€๋Šฅํ•œ๋ฐ URLSearchParams๋กœ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!! https://developer.mozilla.org/en-US/docs/Web/API/URLSearc..

[React] useNavigate, useParams๋กœ ๋™์ ๋ผ์šฐํŒ…(Dynamic Routing) ํ•˜๊ธฐ (GET - URL์— ํŒŒ๋ผ๋ฏธํ„ฐ)

ํŽ˜์ด์ง€๋Š” ๋˜‘๊ฐ™์€๋ฐ, ์•ˆ์—์„œ ๋ Œ๋”๋˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋“ค ์žˆ์ฃ ! ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ํŠœ๋ธŒ์˜ ๊ฐ ์˜์ƒ ์ƒ์„ธํŽ˜์ด์ง€๊ฐ€ ์žˆ๊ฒ ๋„ค์š”. ๐Ÿคฉ ์ด๋ ‡๊ฒŒ Routes์˜ ๊ฒฝ๋กœ(URL)์— ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฑฐ์ฃ . ์ œ๊ฐ€ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์„œ๋Š” ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. url์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋  ํŽ˜์ด์ง€(A) ๊ตฌํ˜„ (A)๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ ํŽ˜์ด์ง€(B)์—์„œ ๋ฐ์ดํ„ฐ์˜ id๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ useNavigate ์‚ฌ์šฉํ•˜์—ฌ (A)๋กœ ์ด๋™ (A)์˜ ํ˜„์žฌ url์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฝ‘์•„์„œ ๋ฐ์ดํ„ฐ GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ 00. ๋ Œ๋”ํ•  ํŽ˜์ด์ง€ ๊ตฌํ˜„ A.js import * as React from "react"; export default function A() { return ( (A)..

[JS] Map ์ž๋ฃŒ๊ตฌ์กฐ - useState๋กœ Value์— Object๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ

๊ฐ ํ‚ค์˜ ์ด๋ฆ„์— ๋งคํ•‘ํ•˜์—ฌ ํ† ๊ธ€์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก, map ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ ํƒ์—ฌ๋ถ€๋ผ๋Š” state๋ฅผ object๋กœ ์ €์žฅํ•ด ๊ด€๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ map ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๊ณ  ๊ฐ€๋ด…์‹œ๋‹ค. ์ฃผ์˜ํ•ด์ฃผ์‹ค ์ ์€! Object๋Š” Key๋ฅผ ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, Map์€ Key์˜ ํƒ€์ž…์„ ๋ณ€ํ™˜์‹œํ‚ค์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. let map = new Map(); map.set('1', 'str1'); // ๋ฌธ์žํ˜• ํ‚ค map.set(1, 'str2'); // ์ˆซ์žํ˜• ํ‚ค map.set(true, 'str3'); // ๋ถˆ๋ฆฐํ˜• ํ‚ค console.log(map.get('1')); // 'str1' console.log(map.get(1)); // 'str2' console.log(map.size); // 3 m..

[React] Firebase Authentication REST API - refresh Token์œผ๋กœ restAPI ์š”์ฒญํ•ด์„œ ์žฌ๋ฐœ๊ธ‰๋œ Id Token์–ป๊ธฐ(fetch๋กœ API ์š”์ฒญํ•˜๊ธฐ)

https://firebase.google.com/docs/reference/rest/auth#section-refresh-token Firebase ์ธ์ฆ REST API FirebaseVisionOnDeviceAutoMLImageLabelerOptions firebase.google.com ์ด๋Ÿฐ ์ง“์„ ํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ ์ต๋ช… ์œ ์ €๋กœ ์„œ๋น„์Šค๋ฅผ ์ฆ๊ธด๋‹ค.(์˜ˆ๋ฅผ ๋“ค์–ด, ํ€ด์ฆˆ ์‚ฌ์ดํŠธ์ธ ๊ฒฝ์šฐ์— ๋ฌธ์ œ๋ฅผ 100๊ฐœ ํ‘ผ ๊ฒฝ์šฐ) - ํ˜„์žฌ Auth: ์ต๋ช… ์œ ์ € -> ์ต๋ช… ํ† ํฐ refresh ๊ฐ€๋Šฅ ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค. - ํ˜„์žฌ Auth: ๋กœ๊ทธ์ธ ์œ ์ € -> ์ต๋ช… ํ† ํฐ refresh ๋ถˆ๊ฐ€๋Šฅ(ํ˜„์žฌ Auth๋Š” ๋กœ๊ทธ์ธ ์œ ์ €ํ•œํ…Œ ์žˆ์œผ๋‹ˆ๊นŒ) -> ๊ทธ๋Ÿผ ์ต๋ช… ํ† ํฐ refresh๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์ฃผ์ง€?!?!? ๋กœ๊ทธ์•„์›ƒ์„ ํ•œ๋‹ค. ๋‹ค์‹œ ์ต๋ช… ์œ ์ €๋กœ ๋Œ์•„์˜จ๋‹ค. ..

[React/JS] Async & Await

00. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ๋™๊ธฐ์  : ์š”์ฒญ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ ๋น„๋™๊ธฐ์  : ์š”์ฒญ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ 01. Async & Await JS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๋™๊ธฐ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋Š” Async & Await์œผ๋กœ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. /** ๋™๊ธฐ์  */ async function sync() { /** ์ฒซ ๋ฒˆ์งธ๋กœ ์‹คํ–‰๋  ํ•จ์ˆ˜ */ await f1(); /** ๋‘ ๋ฒˆ์งธ๋กœ ์‹คํ–‰๋  ํ•จ์ˆ˜ */ await f2(); /** ์„ธ ๋ฒˆ์งธ๋กœ ์‹คํ–‰๋  ํ•จ์ˆ˜ */ await f3(); } ๋งŒ์•ฝ f2๋Š” f1, f3 ์˜ ๊ฒฐ๊ณผ์™€ ์ƒ๊ด€์—†๋Š” ํ•จ์ˆ˜์ผ ๊ฒฝ์šฐ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋„ ์ƒ๊ด€์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. /** ๋™๊ธฐ์  */ asy..

[React] localStorage์— ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

https://developer.chrome.com/docs/devtools/storage/localstorage/?utm_source=devtools View and edit local storage - Chrome Developers How to view and edit localStorage with the Local Storage pane and the Console. developer.chrome.com Local Storage๋Š” ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ € ์ฒญ์†Œ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ด์šฉํ•˜๋Š” ํ† ํฐ ๋“ฑ์„ ์ €์žฅํ•ด๋†“๋Š” ๋ฐ์— ์“ฐ์ž…๋‹ˆ๋‹ค. 00. Local Storage์— ๋ฐ์ดํ„ฐ ์ €์žฅ, ์ ‘๊ทผ, ์‚ญ์ œ https://developer.mozilla.org/en-US/docs/Web/..

[React] Firebase - token์ด ํ•„์š”ํ•œ API ์š”์ฒญ ์‹œ(์‚ฌ์šฉ์ž ์‹๋ณ„ ํ•„์š”ํ•œ ๊ฒฝ์šฐ), header Authorization์— Bearer token ๋‹ด์•„์„œ ๋ณด๋‚ด๊ธฐ

https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ko ID ํ† ํฐ ํ™•์ธ | Firebase ์ธ์ฆ 2022๋…„ 10์›” 18์ผ์— ์˜คํ”„๋ผ์ธ๊ณผ ์˜จ๋ผ์ธ์œผ๋กœ ์ง„ํ–‰๋  Firebase Summit์— ์ฐธ์—ฌํ•˜์„ธ์š”. Firebase๋กœ ์•ฑ์„ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  ์•ˆ์‹ฌํ•˜๊ณ  ์•ฑ์„ ์ถœ์‹œํ•˜๋ฉฐ ์†์‰ฝ๊ฒŒ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”. ์ง€๊ธˆ ๋“ฑ๋กํ•˜๊ธฐ ์˜๊ฒฌ ๋ณด firebase.google.com ์‚ฌ์šฉ์ž๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์„œ๋น„์Šค๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด, ํ€ด์ฆˆ ์‚ฌ์ดํŠธ์ธ ๊ฒฝ์šฐ์—” ๋ณธ์ธ์ด ํ‘ผ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋Š” ์ผ์ด ์žˆ๊ฒ ๋„ค์š”. ํ˜น์€ ํ”„๋กœํ•„ ํŽ˜์ด์ง€๋ผ๋“ ๊ฐ€...๐Ÿ’ ์ด๋Ÿด ๋•Œ์—”, ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ token๊ฐ’์„ Bearerํƒ€์ž… ํ˜น์€ jwt๋กœ header Autho..

[React] Firebase - ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ํšŒ์›๊ฐ€์ž…(์‹ ๊ทœ ์‚ฌ์šฉ์ž ์ƒ์„ฑ) ๊ตฌํ˜„ํ•˜๊ธฐ

https://firebase.google.com/docs/auth/web/password-auth?hl=ko#create_a_password-based_account ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ ๊ณ„์ •์„ ์‚ฌ์šฉํ•ด Firebase๋กœ ์ธ์ฆํ•˜๊ธฐ Google์€ ํ‘์ธ ๊ณต๋™์ฒด๋ฅผ ์œ„ํ•œ ์ธ์ข…์  ํ‰๋“ฑ์„ ์ถ”๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์˜๊ฒฌ ๋ณด๋‚ด๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ ๊ณ„์ •์„ ์‚ฌ์šฉํ•ด Firebase๋กœ ์ธ์ฆํ•˜๊ธฐ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด firebase.google.com firebase์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” API๋ฅผ ์ด์šฉํ•ด์„œ, ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! 00. ์‹ ๊ทœ ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐฉ๋ฒ• Firebase ํ”„๋กœ์ ํŠธ์—์„œ ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. createUserW..