[React 21] - Under-Fetching / Over-Fetching / Regex / Recoil

yiwoojungยท2022๋…„ 9์›” 5์ผ
0

{C} Codecamp FE 06

๋ชฉ๋ก ๋ณด๊ธฐ
18/21

์ด๋ฒˆ์ฃผ ๋‚ด์šฉ

  1. ๊ธ€๋กœ๋ฒŒ ์Šคํ…Œ์ดํŠธ Recoil
  2. ๋กœ๊ทธ์ธ ์—ญ์‚ฌ AccessToken / RefreshToken
  3. Next.js ๋ Œ๋”๋ง Diffing / Hydration
  4. Closure / HOC / HOF
  5. React-hook-form

๐Ÿ‘พ ์˜ค๋Š˜์˜ ๋ชฉํ‘œ

  1. Graphql-variables
  2. Rest์™€ GraphQL ์ฐจ์ด Under-Fetching / Over-Fetching
  3. ์ •๊ทœํ‘œํ˜„์‹ Regular Expresstion Regex
  4. Recoil๊ณผ fetchPolicy

ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜์™€ ๋˜‘๊ฐ™์€๋ฐ ์‹คํ–‰๋ฐฉ๋ฒ•์€ ์œ„์™€ ๊ฐ™๋‹ค.

props

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— props๋Š” ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฆ„์ด ๊ผญ props์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค.

el, index


๋˜ํ•œ map์ด๋‚˜ filter ๋“ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ž‘์„ฑํ•ด์ฃผ๋˜ el๊ณผ index๋„ ์ด๋ฆ„์ด ๋‹ฌ๋ผ์ ธ๋„ ๋œ๋‹ค.

prev

prev๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.


0. Graphql-variables

$๊ฐ€ ๋ถ™์€ ์• ๋“ค์€ ๋ณ€์ˆ˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์š”์ฒญ์„ ํ• ๋•Œ ํ‚ค๊ฐ’๊ณผ ํ†ต์ผ๋งŒ ๋˜๋ฉด ๋œ๋‹ค.

์—ฌ๋Ÿฌ ์š”์ฒญ์„ ํ•œ๋ฒˆ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

1. Under-Fetching / Over-Fetching

Under-Fetching ์–ธ๋”ํŒจ์นญ

Rest-API๋Š” ํ•œ ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ API๋ฅผ ํ•œ๊ฐœ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ์ ์—์„œ Rest-API๋Š” ์–ธ๋”ํŒจ์นญ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ GraphQL์€ ์ด๋Ÿฌํ•œ ์–ธ๋”ํŒจ์นญ์˜ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•ด์„œ ํ•œ๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ ๋ชจ๋‘ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

Over-Fetching ์˜ค๋ฒ„ํŒจ์นญ

Rest-API๋Š” ์›ํ•˜๋Š” ์š”์†Œ๋ณด๋‹ค ๋” ๋งŽ์ด ๊ฐ€์ ธ์˜ค๋Š” ์˜ค๋ฒ„ํŒจ์นญ ๋ฌธ์ œ๋„ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— GraphQL์€ ์›ํ•˜๋Š” ์š”์†Œ๋งŒ ๋ฝ‘์•„์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํŒจ์นญ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


2. ์ •๊ทœํ‘œํ˜„์‹ Regular Expresstion Regex

  • ์ž…๋ ฅ๊ฐ’์ด ์™ผ์ชฝ์˜ ์กฐ๊ฑด๊ณผ ๊ฐ™์œผ๋ฉด true, ๋‹ค๋ฅด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋ฉ”์ผ ๊ฒ€์ฆํ•˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹

  • \w ํ•˜๋‚˜์˜ ๋ฌธ์ž ๋˜๋Š” ์ˆซ์ž
  • ์‹œ์ž‘๊ณผ ๋์„ ์•Œ๋ ค์ฃผ๋Š” ^(์‹œ์ž‘) $(๋)
    • ์‹œ์ž‘๊ณผ ๋์„ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์ด ํฌํ•จ๋งŒ ๋˜์–ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ผญ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • ๋ฌธ์ž๊ฐ€ ํ•œ๊ฐœ๊ฑฐ๋‚˜ ๊ทธ ์ด์ƒ์ด๋ฉด +๋กœ ํ‘œ๊ธฐ

  • ์—†๊ฑฐ๋‚˜ ํ•œ ๊ฐœ ์ผ๋•Œ๋Š” ?

  • ์—†๊ฑฐ๋‚˜ ํ•œ๊ฐœ๊ฑฐ๋‚˜ ๊ทธ ์ด์ƒ์ด๋ฉด * ๋กœ ํ‘œ๊ธฐ

  • .์€ ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธ

  • ์—ญ์Šฌ๋ž˜์‹œ\๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›๋ž˜์˜ ์˜๋ฏธ๋ฅผ ํƒˆํ”ผํ•ด์•ผ ํ•œ๋‹ค.

์ „ํ™”๋ฒˆํ˜ธ ๊ฒ€์ฆํ•˜๋Š” ์ •๊ทœํ‘œํ˜„์‹

  • \d digit, ์ˆซ์ž๋ฅผ ์˜๋ฏธ
  • {3,4} ์ž๋ฆฟ์ˆ˜๋ฅผ ์˜๋ฏธ 3๊ฐœ ๋˜๋Š” 4๊ฐœ
  • [a-zA-Z] ๋ฌธ์ž๋ฅผ ์˜๋ฏธ
  • \s ์ŠคํŽ˜์ด์Šค๋ฐ”, ๊ณต๋ฐฑ์„ ์˜๋ฏธ

3. Recoil

state๊ฐ€ ์—ฌ๋Ÿฌ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•  ๋•Œ prop-drilling ์—†์ด redux๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— state๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ redux๋Š” ์„ธํŒ…ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— mobX, swr ๋“ฑ์˜ ๊ธ€๋กœ๋ฒŒ ์Šคํ…Œ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.
๋” ๋‚˜์•„๊ฐ€ ์ตœ๊ทผ์—๋Š” createProduct๋“ฑ api๋ฅผ ์ €์žฅํ•˜๋Š” ์Šคํ…Œ์ดํŠธ์™€ prop-drilling์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ global-state๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
api๋ฅผ ์ €์žฅํ•˜๋Š” ์Šคํ…Œ์ดํŠธ๋ฅผ Rest์™€ GraphQL์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”๋ฐ ๊ฐ ๊ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ React-query์™€ Apollo-client ์œผ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค. ๋‘ ๊ฐœ ๋ชจ๋‘ useMutation, useQuery๋กœ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ์šฉ๋ฐฉ์‹์€ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ global-state๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌ์•กํŠธ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” context-api๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ•˜๊ณ  createContext, useContext๋กœ ์‚ฌ์šฉํ•˜๋ฉด๋˜๊ณ  ๊ธฐ์กด์˜ useState์™€ ์‚ฌ์šฉ๋ฒ•์ด ๋น„์Šทํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋„ ๋ฌธ์ œ์ ์ด ์žˆ์–ด์„œ ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Recoil์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋‹ค. Recoil๋„ context-api๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋ฒ•์ด ๋น„์Šทํ•˜๋‹ค.
(Recoil์ด Redux์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. Redux๋Š” React-query์™€ Apollo-client๋กœ ๋Œ€์ฒด๋˜์—ˆ๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ Recoil๋กœ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.)

fetchPolicy

์ด๋ ‡๊ฒŒ api์™€ api๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ๊ธ€๋กœ๋ฒŒ-์Šคํ…Œ์ดํŠธ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ ์ด์œ ๋Š” fetchPolicy ๋•Œ๋ฌธ์ด๋‹ค. fetchPolicy๋ž€ ํŒจ์น˜ ์ •์ฑ…์ธ๋ฐ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

const {data} = useQuery()

๋‹ค์Œ์ฒ˜๋Ÿผ apollo-client์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์บ์‹œ-์Šคํ…Œ์ดํŠธ(๊ธ€๋กœ๋ฒŒ-์Šคํ…Œ์ดํŠธ)์— ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ฒŒ ๋˜๋ฉด undefined๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์—์„œ data๋Š” ๊ธ€๋กœ๋ฒŒ ์Šคํ…Œ์ดํŠธ์—์„œ ๊ฐ€์ ธ์˜จ state์ด๊ธฐ ๋•Œ๋ฌธ์— state๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜์–ด ์ด๋กœ ์ธํ•ด์„œ ๋ฐ”๋€ state๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋ฆฌ๋žœ๋”๋ง ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด ๋•Œ ๋งŒ์•ฝ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ํŒจ์น˜๋ฅผ ํ–ˆ๋‹ค๋ฉด ์ด data๊ฐ€ ์ด๋ฏธ ์บ์‹œ-์Šคํ…Œ์ดํŠธ(๊ธ€๋กœ๋ฒŒ-์Šคํ…Œ์ดํŠธ)์— ์ €์žฅ๋˜์–ด ์žˆ์–ด์„œ ๋˜ ์ƒˆ๋กญ๊ฒŒ ๋ฐฑ์—”๋“œ์— ์š”์ฒญํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง•์„ fetchPolicy์˜ cache-first ๋ผ๊ณ  ํ•œ๋‹ค. ์ด ์˜ต์…˜์ด default ๊ฐ’์ด๋‹ค. (์ด ์˜ต์…˜์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ๋Š”๋ฐ network-only๋กœ ์„ค์ •์„ ํ–ˆ๋‹ค๋ฉด ์บ์‹œ์— ์•ˆ๊ฐ€๊ณ  ๋ฌด์กฐ๊ฑด ๋ฐฑ์—”๋“œ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งค๋ฒˆ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค๋ฉด network-only๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. )
์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค ๋ณด๋‹ˆ ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ state๋ฅผ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๋‘๊ฐœ๋ฅผ ๋‚˜๋ˆŒ ํ•„์š”๊ฐ€ ์ƒ๊ฒจ api์™€ ์ผ๋ฐ˜ ๊ธ€๋กœ๋ฒŒ-์Šคํ…Œ์ดํŠธ๋ฅผ ๋‚˜๋ˆ„๊ฒŒ ๋˜์—ˆ๋‹ค.


fetchPolicy๋Š” ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.




Apollo Client Devtools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด apolli-client์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” state๋ฅผ chrome์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

React Developer Tools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ๋กฌ์—์„œ React State๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

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