React

[TIL/React] 2023/06/09

loading spinner ๊ตฌํ˜„ํ•˜๊ธฐ ๐ŸŸฃ loading spinner๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ, action์ด ๋ฌด์—‡์ธ์ง€ console์— ์ฐ์–ด๋ดค๋‹ค. action์€ ๊ธฐ๋ณธ์ ์œผ๋กœ '๊ฐ์ฒด'์ด๋‹ค. action ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ 'requestStatus๋ผ๋Š” key์™€ fulfilled๋ผ๋Š”

2023๋…„ 6์›” 9์ผ2min read

loading spinner ๊ตฌํ˜„ํ•˜๊ธฐ ๐ŸŸฃ

loading spinner๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ, action์ด ๋ฌด์—‡์ธ์ง€ console์— ์ฐ์–ด๋ดค๋‹ค. action์€ ๊ธฐ๋ณธ์ ์œผ๋กœ '๊ฐ์ฒด'์ด๋‹ค. action ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ 'requestStatus๋ผ๋Š” key์™€ fulfilled๋ผ๋Š” value'๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด requestStatus๋ฅผ ํ™œ์šฉํ•ด์„œ 'pending'์ผ ๋•Œ์—๋Š” loading spinner๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ , 'fulfilled'์ผ ๋•Œ์—๋Š” UI ๋‹จ์—์„œ ๋‚˜ํƒ€๋‚˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

slice ํŒŒ์ผ์—์„œ ์ดˆ๊ธฐ๊ฐ’์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , pending์— ๋Œ€ํ•œ case๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋˜์ž๋งˆ์ž thunk ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

ํ™”๋ฉด์„ ๋„์šฐ๋Š” ์ˆœ๊ฐ„ useEffect๋ฅผ ํ†ตํ•ด thunk ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , pending์— ๋Œ€ํ•œ case๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ requestStatus๊ฐ€ pending์ด๋ฉด ์ดˆ๊ธฐ๊ฐ’ loading์„ true๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” loading์ด true์ด๋ฉด '๋กœ๋”ฉ์ค‘'์ด๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

๋ณ„๊ฑฐ ์•„๋‹Œ ๊ณผ์ •์ด์—ˆ๋Š”๋ฐ ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด์„œ fulfilled์ผ ๋•Œ state.push๋ฅผ state.todo.push๋กœ ๋ณ€๊ฒฝํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์„ ๋†“์ณค๋‹ค. fulfilled์ผ ๋•Œ๋Š” loading์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜๊ธฐ์—, ๊ณ„์†ํ•ด์„œ ๋กœ๋”ฉ ํ™”๋ฉด์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ์œ„ ์บก์ณ๋ณธ์˜ ์ฝ˜์†”์„ ๋ณด๋ฉด loading data๊ฐ€ true๋กœ ์ž˜ ๋ณ€ํ™˜๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

spinner๋Š” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ปดํฌ๋„ŒํŠธ์ด๊ธฐ์— src์˜ commons ํŒŒ์ผ ๋‚ด๋ถ€์— ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค. keyframes๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. if ๋ฌธ ๋‚ด์— ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์šฉํ•˜๋ฉด, ์œ„์™€ ๊ฐ™์ด loading spinner๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

Add Todo Area & Delete Btn ๐ŸŸฃ

์ถ”๊ฐ€๋œ Todo๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜์—ญ์— ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € useSelector๋ฅผ ํ†ตํ•ด todo์— ๋Œ€ํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค. ํ•ด๋‹น todo๋Š” value์™€ id๋ผ๋Š” key๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ(=๋ฐฐ์—ด)์ด๋‹ค. ๋”ฐ๋ผ์„œ todo์˜ isDone ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 'todo๊ฐ์ฒด.value.isDone'์˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

~~์œ„ ์ ‘๊ทผ์„ ํ†ตํ•ด '์™„๋ฃŒ๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ'์„ noCompleteArray๋ผ๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ–ˆ๋‹ค. todo์นด๋“œ์—์„œ์˜ elem์€ ๊ฒฐ๊ตญ todo๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋™์ผํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์œผ๋กœ title์„ ๋ Œ๋”๋งํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฝ˜์†”์—์„œ todo์—๋Š” ํ•ด๋‹น data๊ฐ€ ๋‹ด๊ธฐ๋Š”๋ฐ, noCompleteArray๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. Add Click์—์„œ inputValue๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ isDone๊ณผ id์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•ด์ฃผ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค.~~

์•„๋‹ˆ๋‹ค id๋Š” add๋ฅผ clickํ•  ๋•Œ ๋ณด๋‚ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ ํŽ˜์ด์ง€ ๊ตฌ๋ถ„ ๋จผ์ € ๐ŸŸฃ

์‹œํ—˜๊ธฐ๊ฐ„ ์ด์Šˆ๋กœ ์ž ์ • ์ค‘๋‹จํ–ˆ์—ˆ๋‹ค. ๋‹ค์‹œ ์ฐจ๊ทผ์ฐจ๊ทผ ์‹œ์ž‘ํ•œ๋‹ค.

Delete button์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, ์‚ฌ์‹ค์€ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์‚ญ์ œ ์ž‘์—…์„ ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.

๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ title์„ ํด๋ฆญํ•ด์„œ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, title์— ๋Œ€ํ•ด onClick event๊ฐ€ ํ•„์š”ํ•˜๊ณ  ํ•ด๋‹น event๋Š” navigate์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  main๊ณผ detail๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ฃผ์†Œ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

๊ฐ€์žฅ ๋จผ์ € input field์™€ todo field, ๋‘ ์ปดํฌ๋„ŒํŠธ๋ฅผ main์œผ๋กœ ๋ฌถ์–ด์คฌ๋‹ค.

ํŒŒ์ผ์ด ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

More to read

REST API

ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์‚ฌ์ด

HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ๋ณด๋ƒˆ๋˜ ์š”์ฒญ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ผ์ข…์˜ ์•ฝ์†์ด๋ฉฐ, API๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ, ๋ฐฑ์—”๋“œ๋Š” ์ž˜ ๋ชจ๋ฅด๋Š” ํ”„๋ก ํŠธ์—”๋“œ์˜ ์Šฌํ”ˆ ์‚ฌ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.์•„๋ž˜๋Š” ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์Œ์—๋„, ๋ฐฑ์—”๋“œ์—์„œ ์ƒํƒœ ์ฝ”๋“œ

JWT

ํ† ํฐ ๊ด€๋ฆฌ ๋ฐฉ์‹ ํ†บ์•„๋ณด๊ธฐ

0. ๋“ค์–ด๊ฐ€๋ฉฐ ๐ŸŽฏ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฃผ์–ด์ง„ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ์ž‘์—…์€ ์ธ๊ฐ€๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ธ๊ฐ€๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ์—๋Š” ๋งŽ์€ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ, ์˜ค๋Š˜์€ ์„ธ์…˜ ์ธ์ฆ ๋ฐฉ

A2A

A2A / MCP ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜

0. ๋“ค์–ด๊ฐ€๋ฉฐ โœ๏ธ Google for Developers์—, ๋ ˆ์Šคํ† ๋ž‘ ๊ณต๊ธ‰๋ง ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์—ฎ์€ 6๋Œ€ ํ”„๋กœํ† ์ฝœ(MCP, A2A, UCP, AP2, A2UI, AG-UI)์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ๊ฒŒ์‹œ๋œ ์ดํ›„, MCP์™€ A2A๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ