React

[TIL/React] 2023/08/29

1\. ver2 ๐ŸŸขlayout์˜ ํ๋ฆ„์„ ๋†“์นœ ๊ฒฐ๊ณผ๋Š” ์ฒ˜์ฐธํ•˜๋‹ค. ๊ดœ์ฐฎ๋‹ค ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ. ์ฐจ๋ถ„ํžˆ ๊ณ ๋ฏผ์„ ๋…น์—ฌ๋‚ผ ver2 ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.์ตœ์ƒ๋‹จ App.js์—์„œ๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋“ค์„, PageContainer๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ๊ณ  ์žˆ๋‹ค.PageCont

2023๋…„ 8์›” 29์ผ2min read

1. ver2 ๐ŸŸข

layout์˜ ํ๋ฆ„์„ ๋†“์นœ ๊ฒฐ๊ณผ๋Š” ์ฒ˜์ฐธํ•˜๋‹ค. ๊ดœ์ฐฎ๋‹ค ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ. ์ฐจ๋ถ„ํžˆ ๊ณ ๋ฏผ์„ ๋…น์—ฌ๋‚ผ ver2 ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

์ตœ์ƒ๋‹จ App.js์—์„œ๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋“ค์„, PageContainer๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ๊ณ  ์žˆ๋‹ค.

PageContainer๋กœ ๊ฐ์‹ธ์ง„ ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์€, ํ—ค๋”์™€ ํ‘ธํ„ฐ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. PageContainer์˜ ํ•ต์‹ฌ์€ content์— ์žˆ๋Š”๋ฐ, ์ตœ์†Œ ๋†’์ด์™€ ๋„“์ด๋ฅผ ๋ทฐํฌํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •ํ•˜๊ณ  'flex-grow: 1' ์„ ์ ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

1) 100vh์™€ 100%๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด์— ๋Œ€ํ•˜์—ฌ...

๊ฐ€์žฅ ๋จผ์ € ์†์„ ๋ณธ ๊ณณ์€ ComponentWrapper๋ฅผ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋Œ์–ด์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด์—ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์ธ๋ผ์ธ ๋ถ€๋ถ„์— 'minHeight: 100vh'๊ฐ€ ์•„๋‹ˆ๋ผ 'height: 100%'๊ฐ€ ์ ์šฉ๋˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ฐ€์žฅ ๋ฐ”๊นฅ wrapper์ธ PageContainer์—์„œ ์ตœ์†Œ ๋†’์ด๋ฅผ 100vh๋กœ ์„ค์ •ํ–ˆ์œผ๋‹ˆ, ๊ทธ๋Œ€๋กœ ํ•˜์œ„ wrapper์—์„œ๋Š” 100%๋ฅผ ์ ์šฉํ•˜๋ฉด ๋˜์ง€ ์•Š๊ฒ ๋ƒ๋Š” ๋…ผ๋ฆฌ์˜€๋‹ค.

ํ•˜์ง€๋งŒ 'height: 100%'๋ฅผ ์ ์šฉํ•˜๋ฉด '์ปจํ…์ธ ์˜ ๋†’์ด์— ๋Œ€ํ•œ 100%'๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜์–ด์„œ, ๊ฒฐ๊ณผ์ ์œผ๋กœ PageContainer์˜ ์ ˆ๋ฐ˜์ •๋„๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. 'minHeight: 100vh'๋ฅผ ์ธ๋ผ์ธ์— ์ถ”๊ฐ€ํ•ด์„œ ๋ทฐํฌํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

โœŽ ํ•œ๋งˆ๋””๋กœ page container ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ wrapper๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ ๋ณ„๋„๋กœ height๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

2) input์ด wrapper ๋ฐ”๊นฅ์œผ๋กœ ํŠ€์–ด๋‚˜์˜ค๋Š” ๊ฑด์— ๋Œ€ํ•˜์—ฌ...

input๊ณผ button์€ ๋ชจ๋‘ form ํƒœ๊ทธ ๋‚ด๋ถ€์— ์œ„์น˜ํ•ด ์žˆ๋‹ค. ๊ณ ๋กœ width์™€ padding์„ ๋˜‘๊ฐ™์ด ์ ์šฉํ•˜๋ฉด, ์›ํ•˜๋Š”๋Œ€๋กœ ๋™์ผํ•œ ํฌ๊ธฐ์˜ input๊ณผ button์ด ๊ทธ๋ ค์ง€์ง€ ์•Š๊ฒ ๋ƒ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด 'box-sizing: border-box'๋ฅผ ํ†ตํ•ด input๊ณผ button์˜ ๊ทœ๊ฒฉ์„ ๋งž์ท„๋‹ค.

1. ์ˆ˜์ •๋œ ๋ชจ์Šต ๐ŸŸข

2. validation ์ฒ˜๋ฆฌ ์—ฐ์Šต ๐ŸŸ 

validation์— ๊ด€ํ•œ ํŒŒ์ผ์—์„œ๋Š”, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋งŒ!์„ํ•˜๊ณ , ์—๋Ÿฌ์— ๊ด€ํ•œ ์ง์ ‘์ ์ธ ์ฒ˜๋ฆฌ๋Š” ํŽ˜์ด์ง€ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.

isValidLogIn ํ•จ์ˆ˜๋Š” email ๋˜๋Š” password ์ค‘, ํ•œ ํ•„๋“œ๋งŒ ์•„๋ฌด ๊ฐ’์ด ์ž…๋ ฅ๋˜์ง€ ์•Š์•„๋„ false๋ฅผ returnํ•œ๋‹ค. ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๋‹ค ์ฑ„์›Œ์ง„ ๊ฒฝ์šฐ์— ํ•œํ•˜์—ฌ true๋ฅผ return ํ•œ๋‹ค.

index.js๋Š” TIL์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋ณด๋‹ˆ๊นŒ ๊ตณ์ด ์™œ ๋”ฐ๋กœ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์–ด์จŒ๋“  ๊ฐ๊ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ•จ์ˆ˜๋“ค์„ validation์ด๋ผ๋Š” ์ƒ์ˆ˜์— ๋‹ด์•„์„œ exportํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์˜ ์ œ์ถœ ๋ฒ„ํŠผ์—์„œ ์ง์ ‘์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค. case๋Š” ๋‹ค์Œ ๋„ค ๊ฐ€์ง€๋‹ค.

1. email ํ•„๋“œ๊ฐ€ ๋น” -> ์ฝ˜์†”์€ true, alert ๋“ฑ์žฅ 2. password ํ•„๋“œ๊ฐ€ ๋น” -> ์ฝ˜์†”์€ true, alert ๋“ฑ์žฅ 3. email, password ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ ๋น” -> ์ฝ˜์†”์€ true, alert ๋“ฑ์žฅ 4. email, password ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ ์ฑ„์›Œ์ง -> ์ฝ˜์†” ์ž…๋ ฅ ์—†์Œ, ํ•ด๋‹น alert ๋“ฑ์žฅ ์•ˆ ํ•จ

1)

2)

3)

4)

ํ…Œ์ŠคํŠธ ์™„๋ฃŒ!, ์ด์ œ ํ”„๋กœ์ ํŠธ์— ์ž˜ ์ ์šฉํ•  ์ผ๋งŒ ๋‚จ์•˜๋‹ค.

ํšŒ๊ณ  ๐Ÿ”ต

๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ๋ฐ›์•„๋“ค์ด๋Š” ํ‰์˜จํ•จ์„, ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฐ”๊พธ๋Š” ์šฉ๊ธฐ๋ฅผ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ฐจ์ด๋ฅผ ๋ถ„๋ณ„ํ•˜๋Š” ์ง€ํ˜œ๋ฅผ ์ฃผ์˜ต์†Œ์„œ.

-๋ผ์ธํ™€๋“œ ๋‹ˆ๋ถ€์–ด, ํ‰์˜จ์„ ๋น„๋Š” ๊ธฐ๋„ ไธญ

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๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ