react

WONNY_LOGยท2023๋…„ 4์›” 17์ผ
0

๐Ÿ’ก React๋ž€?ํŽ˜์ด์Šค๋ถ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”ย ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.


1. ์–ด๋– ํ•œ ํ๋ฆ„์œผ๋กœ ์˜ค๋Š˜๋‚  React๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๊ฐ€?

์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋ฉฐย ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ ย ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ์ฝ”๋“œ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œย Frontend Framework(Library)๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.๊ทธ ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ย Angular,ย Vue,ย Reactย ์ด๋‹ค.

๐Ÿ– ์ž ๊น)ย Frontend Framework(Library)์— ๋Œ€ํ•ด ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž.

:: Angular2010๋…„ Google์—์„œ ๊ฐœ๋ฐœํ•œ Framework.-์žฅ์ : TypeScript ๊ธฐ๋ฐ˜์œผ๋กœ ์•ˆ์ •์ ์ธ Frontend App ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด์žˆ๋‹ค.-๋‹จ์ : ๋ฌด๊ฒ๊ณ  ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต๋‹ค.

:: Vue2014๋…„ Evan You๋ผ๋Š” ๊ฐœ์ธ์ด ๊ฐœ๋ฐœํ•œ Framework.-์žฅ์ : ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ณ  ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค. ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ƒ๊ฒผ์ง€๋งŒ ์„ฑ์žฅ ์†๋„๊ฐ€ ์ •๋ง ๋น ๋ฅด๋‹ค.-๋‹จ์ : ์ธ์ง€๋„๊ฐ€ ๋‚ฎ์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ ์ฃผ๊ธฐ๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค.

:: React*โ€œ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒโ€*ย ์„ ๋ชฉํ‘œ๋กœ 2013๋…„ Facebook์—์„œ ๊ฐœ๋ฐœํ•œ Library.ย -์žฅ์ : ํŽ˜์ด์Šค๋ถ์˜ ์ง€์†์ ์ธ ๊ด€๋ฆฌ์™€ ํ•จ๊ป˜ย ์ƒํƒœ๊ณ„๊ฐ€ ํ™œ์„ฑํ™”ย ๋˜์–ด ์žˆ์–ด ๋‹ค์–‘ํ•œ ์ž๋ฃŒ, ๊ทธ๋ฆฌ๊ณ  React Native์˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊พธ์ค€ํžˆ ์ฆ๊ฐ€ํ•œ๋‹ค.-๋‹จ์ : Angular, Vue์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฆฌ์•กํŠธ๋Š” ์˜ค๋กœ์ง€ View๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. ๊ทธ๋งŒํผ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ดย third-party ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ex. React-router, Redux)๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿง Library? Framework?

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fb7cd887a-a763-4449-889c-a5dab7803922%2Fimage.png

  • Library?๊ฐœ๋ฐœ์‹œ ํ™œ์šฉ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋“ค์„ ๋ชจ์•„ ๋ชจ๋“ˆํ™”ํ•œ ๊ฒƒ์ด๋‹ค.
  • Framework?๊ธฐ๋ณธ์ ์ธ ๋ผˆ๋Œ€๊ฐ€ ์ด๋ฏธ ์™„์„ฑ๋˜์–ด์žˆ๊ณ  ๊ทœ์น™์ด ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด๋‹ค. ํ•„์ˆ˜์ ์ธ ์ฝ”๋“œ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ ์–ด๋А ์ •๋„์˜ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•จ.(node.js, django ๋“ฑ๋“ฑ..)

2. React์˜ ์ •์˜

ํŽ˜์ด์Šค๋ถ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”ย ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.๋ฆฌ์•กํŠธ์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜น์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”ย ๊ฐ€์žฅ ํฐ ์ด์œ ย ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ€์ƒ ๋”์„ ํ†ตํ•ดUI๋ฅผ ์ž๋™์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•ด ์ค€๋‹ค๋Š” ์ ์ด๋‹ค.๊ฐ€์ƒ ๋”(Virtual Dom)์€ย ์ด์ „ UI ์ƒํƒœ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•ด์„œ, ๋ณ€๊ฒฝ๋  UI์˜ ์ตœ์†Œ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ด ๊ธฐ์ˆ  ๋•๋ถ„์— ๋ถˆํ•„์š”ํ•œ UI ์—…๋ฐ์ดํŠธ๋Š” ์ค„๊ณ , ์„ฑ๋Šฅ์€ ์ข‹์•„์ง„๋‹ค.

3. ์ž‘์—… ํ™˜๊ฒฝ ์„ค์ •

(CRA๋ฅผ ์„ค์น˜, ํด๋”์™€ ํŒŒ์ผ์˜ ๊ตฌ์„ฑ)

:: Node.js

Node.js ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๋ฐ–(ex. ์„œ๋ฒ„)์—์„œ๋„ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์ด๋ฏ€๋กœ Node.js์™€ ์ง์ ‘์ ์ธ ์—ฐ๊ด€์€ ์—†์ง€๋งŒ, ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฃผ์š” ๋„๊ตฌ๋“ค(ex. ๋ฐ”๋ฒจ, ์›นํŒฉ)์ด Node.js ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.Node.js๋ฅผ ์„ค์น˜ํ•˜๋ฉดย npm(node package manager)ย ์ด ์ž๋™์œผ๋กœ ์„ค์น˜ ๋˜๋Š”๋ฐ npm์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋…ธ๋“œ(Node.js)๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ ํ•จ์œผ๋กœ์จ Node.js ์˜ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋…ธ๋“œ ๋ฒ„์ „์ด ์ •์ƒ์ ์œผ๋กœ ํ™•์ธ๋˜๋ฉด ์„ค์น˜๋„ ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์ด๋‹ค.

$ node -v

:: npm

Node ๊ธฐ๋ฐ˜์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉดย npm(node package manager)์ด๋ผ๋Š” ํŒจํ‚ค์ง€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. npm ์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ npm ๋ฒ„์ „์„ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์„ค์น˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

$ npm -v

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F6e0914c7-d74d-452d-a6a7-07ae322550e1%2Fimage.png

:: CRA(Create-React-App)

: ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ธํŒ… ํ•ด์ฃผ๋Š” ๋„๊ตฌ(toolchain)

๋ฆฌ์•กํŠธ๋Š” UI ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌ์ถ•ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๋“ค์ด ๋งŽ๋‹ค. ์ „๋ฐ˜์ ์ธ ์‹œ์Šคํ…œ์„ ์ง์ ‘ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ์‹ ๊ฒฝ์“ธ ๊ฒƒ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋Š” ์ง์ ‘ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์•กํŠธ ํŒ€์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ดย CRA(Create-React-App)์„ ๋งŒ๋“ค์—ˆ๋‹ค. CRA๋Š” ๋ฆฌ์•กํŠธ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค. CRA๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

CRA๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ํŒจํ‚ค์ง€ ๋ฒ„์ „๋งŒ ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค.

:: CRA ์„ค์น˜

// 1. Desktop - wecode ํด๋” ์ง„์ž…
cd Desktop/wecode

// 2. westagram-react ํ”„๋กœ์ ํŠธ ์„ค์น˜
npx create-react-app westagram-react

// 3. westagram-react ํ”„๋กœ์ ํŠธ ์ง„์ž…
cd westagram-react

// 4. ๋กœ์ปฌ ์„œ๋ฒ„ ๋„์šฐ๊ธฐ
npm start

4. Component์˜ ๊ฐœ๋…๊ณผ ์ข…๋ฅ˜

๐Ÿ’ก Component๋ž€?- ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ UI ๊ตฌ์„ฑ ๋‹จ์œ„์ด๋‹ค.

ex) instagram ๋ฉ”์ธ ํŽ˜์ด์ง€

  • instagram main ํŽ˜์ด์ง€๋ฅผ Component๋กœ ๋‚˜๋ˆˆ๋‹ค๋ฉด,
  • ํฌ๊ฒŒ Nav ์ปดํฌ๋„ŒํŠธ์™€ Main ์ปดํฌ๋„ŒํŠธ, ๊ทธ๋ฆฌ๊ณ  Main ์ปดํฌ๋„ŒํŠธ ์•ˆ์—๋Š” Feed ์ปดํฌ๋„ŒํŠธ์™€ MainRight ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด์™€ ๊ฐ™์ด ํ™”๋ฉด์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fdf0fc298-c33f-41b0-8ff4-d02d3dcfa680%2Fimage.png

:: ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ง•

  • ์žฌํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์— ์ข‹๋‹ค.
  • ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์ข‹๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋Š” ๋˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ - ์ž์‹ ์ปดํฌ๋„ŒํŠธ)

:: Class vs Functional Component

์ปดํฌ๋„ŒํŠธ์˜ ์ข…๋ฅ˜, ์ฆ‰ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Classํ˜• ์ปดํฌ๋„ŒํŠธ(Class Component)
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ(Functional Component)

1) Class Component

import React from 'react'

class Component extends React.Component {
  render() {
    return (
      <div><h1>This is Class Component!</h1></div>)
  }
}

export default Component
  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š”ย renderย ํ•จ์ˆ˜๊ฐ€ ๊ผญ ์žˆ์–ด์•ผ ํ•˜๊ณ , ๊ทธ ์•ˆ์— ๋ณด์—ฌ ์ฃผ์–ด์•ผ ํ• ย JSX๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2) Functional Component

import React from 'react'

const Component = () => {
  return (
    <div><h1>This is Functional Component!</h1></div>)
};

export default Component
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณด๊ธฐ์—๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์ž‘์„ฑํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค๋‹ค.lifecylce, state, props ๋“ฑ ์ฃผ์š” ๊ฐœ๋…๋“ค์„ ์ตํžˆ๊ธฐ์—๋Š” classํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ›จ์”ฌ ์ง๊ด€์ ์ด๊ณ  ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค.

5. JSX ๋ฅผ ์ •์˜์™€ ํŠน์„ฑ

๐Ÿ’ก JSX(JavaScript Syntax Extension)๋ž€?๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค.JSX๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

:: JSX ์žฅ์ 

  • HTML ํƒœ๊ทธ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๊ธฐ ์‰ฝ๊ณ  ์ต์ˆ™ํ•˜๋‹ค.
  • HTML ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์‹œ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ JSX ์•ˆ์—์„œ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

:: JSX ํŠน์ง•

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(์‹) ํ‘œํ˜„ :ย { ... javascript... }
  • classย -->ย classNameย ์ „ํ™˜
  • Inline Styling :ย <div style={{color : "red"}}>Hello React</div>
  • Self Closing tag :ย <div></div>ย orย <div />
  • ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๋Š” ์ตœ์ƒ์œ„ ์š”์†Œ (cf. React Fragments :ย <> ... </>) ํ•„์ˆ˜
<> //JSX์˜ ํฐ ํŠน์ง•, ๋‚ด๋ถ€ ์š”์†Œ๋“ค์„ ๊ฐ์‹ธ๋Š” ์ตœ์ƒ์œ„ ์š”์†Œ
  <div className="loginBtn" onClick={() => console.log("click")}>Login</div><br /><div style={{backgroundColor: "grey", height: "10px"}} /></>

0๊ฐœ์˜ ๋Œ“๊ธ€