Frontend ๐Ÿ“š/React

[์ฝ”๋”ฉ์• ํ”Œ] ์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ Part9 - ์„ฑ๋Šฅ๊ฐœ์„  1: ๊ฐœ๋ฐœ์ž๋„๊ตฌ, lazy import

leejaejae 2023. 10. 29. 16:06

- props๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ ์ถœ๋ ฅ์ด ์•ˆ๋œ๋‹ค๊ฑฐ๋‚˜, ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์—ˆ๋Š๋ฐ ์•ˆ๋ณด์ด๋Š” ๋ฒ„๊ทธ๊ฐ™์€ ๊ฒŒ ์ƒ๊ธด๋‹ค๋ฉด
- ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์ผœ์„œ Elements ํƒญ ์‚ดํŽด๋ณด๋ฉด ๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์„  ๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ๋ฅผ ์‹ค์ œ html css๋กœ ๋ณ€ํ™˜๋˜์–ด์„œ ๋ณด์—ฌ์ง„๋‹ค.
- ๊ทธ๊ฒŒ ์‹ซ๊ณ  ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฏธ๋ฆฌ ๋ณด๊ณ  ์‹ถ์œผ๋ฉด ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ด์„œ ์ผœ๋ณด๋ฉด ๋œ๋‹ค.


โœ๏ธ ํฌ๋กฌ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ: React Developer Tools

https://chrome.google.com/webstore/

 

Chrome ์›น ์Šคํ† ์–ด

Chrome์— ์‚ฌ์šฉํ•  ์œ ์šฉํ•œ ์•ฑ, ๊ฒŒ์ž„, ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ํ…Œ๋งˆ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”.

chrome.google.com

- ํฌ๋กฌ ์›น์Šคํ† ์–ด ๋“ค์–ด๊ฐ€๋ฉด ํ™•์žฅํ”„๋กœ๊ทธ๋žจ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
- ์—ฌ๊ธฐ์„œ React developer Tools ์„ค์น˜ํ•˜๋ฉด Compoents ํƒญ์ด ์ƒ๊ธฐ๋Š”๋ฐ, ๋‚ด๊ฐ€ ๊ฐœ๋ฐœ์ค‘์ธ ๋ฆฌ์•กํŠธ์‚ฌ์ดํŠธ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฏธ๋ฆฌ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

- ์™ผ์ชฝ์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๊ณ 
- ์™ผ์ชฝ ์ƒ๋‹จ ์•„์ด์ฝ˜ ๋ˆŒ๋Ÿฌ์„œ ์ปดํฌ๋„ŒํŠธ ์ฐ์–ด๋ณด๋ฉด ๊ฑฐ๊ธฐ ์žˆ๋Š” state, props ๋“ฑ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค.


โœ๏ธ Profiler ํƒญ์—์„œ ์„ฑ๋Šฅํ‰๊ฐ€ ๊ฐ€๋Šฅ

- Profiler ํƒญ ๋“ค์–ด๊ฐ€์„œ
→ ๋…นํ™”๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ณ 
→ ํŽ˜์ด์ง€ ์ด๋™์ด๋‚˜ ๋ฒ„ํŠผ์กฐ์ž‘์„ ํ•ด๋ณด๊ณ 
→ ๋…นํ™” ๋๋‚ด๋ฉด
- ๋ฐฉ๊ธˆ ๋ Œ๋”๋ง๋œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด์ค€๋‹ค.


โœ๏ธ Redux Developer Tools
- ์ด๊ฒƒ๋„ ํฌ๋กฌ ์›น์Šคํ† ์–ด์—์„œ ์„ค์น˜ ๊ฐ€๋Šฅ
- Redux store์— ์žˆ๋˜ state๋ฅผ ์ „๋ถ€ ํ™•์ธ๊ฐ€๋Šฅํ•˜๋‹ค.
- ๊ทธ๋ฆฌ๊ณ  dispatch ๋‚ ๋ฆด ๋•Œ ๋งˆ๋‹ค ๋ญ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค. store ๋ณต์žกํ•ด์ง€๋ฉด ์œ ์šฉํ•˜๋‹ค.

 

โœ๏ธ lazy import

- ๋ฆฌ์•กํŠธ ์ฝ”๋“œ ๋‹ค ์งฐ์œผ๋ฉด npm run build ์ž…๋ ฅํ•ด์„œ html css js ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
- ํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ๋กœ ๋งŒ๋“œ๋Š” Single Page Application์˜ ํŠน์ง•์€ html, js ํŒŒ์ผ์ด ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋œ๋‹ค.
- ๊ทธ ์•ˆ์— ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  App/Detail/Cart ๋ชจ๋“  ๋‚ด์šฉ์ด ๋“ค์–ด์žˆ์–ด์„œ ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๊ฐ€ ํฌ๋‹ค.
- ๊ทธ๋ž˜์„œ ๋ฆฌ์•กํŠธ ์‚ฌ์ดํŠธ๋“ค์€ ์ฒซ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ฆฌ๋‹ค.

- ๊ทธ๊ฒŒ ์‹ซ๋‹ค๋ฉด js ํŒŒ์ผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋ฉด ๋œ๋‹ค.
- ์ชผ๊ฐœ๋Š” ๋ฐฉ๋ฒ•์€ import ๋ฌธ๋ฒ•์„ ์•ฝ๊ฐ„ ๊ณ ์น˜๋ฉด ๋œ๋‹ค. 

- ์ง€๊ธˆ ๋ฉ”์ธํŽ˜์ด์ง€ ๋ณด๋ฉด Detail, Cart๋ฅผ import ํ•ด์„œ ์“ฐ๊ณ  ์žˆ๋Š”๋ฐ ์ด๋Ÿฐ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•์œผ๋กœ import ํ•ด๋†“์œผ๋ฉด ์ข‹๋‹ค.

// App.js

import {lazy, Suspense, useEffect, useState} from 'react'

const Detail = lazy( () => import('./routes/Detail.js') )
const Cart = lazy( () => import('./routes/Cart.js') )

// lazy ์‚ฌ์šฉํ•˜๋ฉด ๋‹น์—ฐํžˆ Detail ์ปดํฌ๋„ŒํŠธ ๋กœ๋“œ๊นŒ์ง€ ์ง€์—ฐ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•œ๋‹ค. 
// Suspense๋กœ Detail ์ปดํฌ๋„ŒํŠธ ๊ฐ์‹ธ๊ธฐ(๊ท€์ฐฎ์œผ๋ฉด <Suspense> ์ด๊ฑธ๋กœ <Routes> ์ „๋ถ€ ๊ฐ์‹ธ๋„ ๋œ๋‹ค.
// -> Detail ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋”ฉ์ค‘์ผ ๋•Œ ๋Œ€์‹  ๋ณด์—ฌ์ค„ html ์ž‘์„ฑ๋„ ๊ฐ€๋Šฅํ•ด์ง.
<Suspense fallback={ <div>๋กœ๋”ฉ์ค‘์ž„</div> }> 
  <Detail shoes={shoes} />
</Suspense>

- lazy ๋ฌธ๋ฒ•์œผ๋กœ๋„ ๋˜‘๊ฐ™์€ import๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ ์ด ๊ฒฝ์šฐ์—” "Detail ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด import ํ•ด์ฃผ์„ธ์š”" ๋ผ๋Š” ๋œป์ด ๋œ๋‹ค.
- ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ํ•ด๋†“์œผ๋ฉด Detail ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ jsํŒŒ์ผ๋กœ ์ชผ๊ฐœ ์ค€๋‹ค. 
- ๊ทธ๋ž˜์„œ ์ฒซ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์€๋ฉด ์‚ฌ์šฉ ใ„ฑ ใ„ฑ 


๋ณธ ํฌ์ŠคํŒ…์€ << React ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ๊นŒ์ง€! >> ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.