1. External Store

์ƒ์กด์ฝ”๋“œ ๋“ฑ๋ก ์ „ ์ƒ๋‹ด์„ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋Š” ํ™€๋งจ์˜ ๋ง์ด ๋– ์˜ค๋ฅธ๋‹ค. ์–ด๋– ํ•œ ๊ด€์ ์—์„œ ์ด๋ฅผ ๊ฐ•์กฐํ–ˆ์„๊นŒ? ๊ฐ•์˜์—์„œ๋Š” ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ UI๋ฅผ TS๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋‹ด๋‹นํ•˜๋Š” ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์œ ๋ คํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ์„ค๋ช…ํ–ˆ๋‹ค.

Keyword

  1. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

  2. Layered Architecture

  3. Flux Architecture

  4. useReducer

  5. useCallback


1. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์ด ๊ฐ๊ฐ ์ž์‹ ์˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ๋‹ค๋ฅธ ์š”์†Œ์™€์˜ ๊ฒฐํ•ฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์„ค๊ณ„ ์›์น™์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค. MVC ํŒจํ„ด์€ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋กœ Model, View, Controller๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

Layered Architecture์—์„  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€๊นŒ์šด ๊ฒƒ๊ณผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋จผ ๊ฒƒ์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ(UI๋ฅผ ๋‹ค๋ฃจ๋Š” ํ™”๋ฉด) -> ์ค‘๊ฐ„(Business Logic) -> ๊ฐ€์žฅ ๋จผ ๊ฒƒ(๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ถ€๋ถ„)


2. Layered Architecture

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜(=ํŒจํ„ด)์ด๋‹ค. ๊ฐ ๊ณ„์ธต์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ์˜ ํŠน์ • ์—ญํ• ๊ณผ ๊ด€์‹ฌ์‚ฌ(ํ™”๋ฉด ํ‘œ์‹œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰, DB ์ž‘์—… ๋“ฑ)๋ณ„๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์ด๋Š” Layered Architecture ์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ธ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ (Separation of Concern) ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํŠน์ • ๊ณ„์ธต์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ํ•ด๋‹น ๊ณ„์ธต์— ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋‹ค๋ฅธ ๊ณ„์ธต์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์€ ๊ด€์‹ฌ์ด ์—†๋‹ค๋Š” ์–˜๊ธฐ. ์ด๋กœ ์ธํ•ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ณ„์ธต๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ์ผ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๊ทธ๋Œ€๋กœ์ž„์—๋„ UI๋ฅผ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๊ณ ์žฅ๋‚  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ ์ผ๋งŒ์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์‰ฌ์›Œ์ง„๋‹ค.

Layered Architecture
  1. Presentation Layer: ํ™”๋ฉด์— ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ณ  UI๋ฅผ ํ†ตํ•œ ์œ ์ € ์ธํ„ฐ๋ ‰์…˜์„ ๊ด€์‹ฌ์‚ฌ๋กœ ๋‘”๋‹ค. (ex. View, Controller)

  2. Business Layer: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๊ด€์‹ฌ์‚ฌ๋กœ ๋‘”๋‹ค.

  3. Persistence layer: ๊ฐ์ฒด ๊ด€๊ณ„ํ˜• ๋งคํ•‘(ORM)๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ฒ˜๋ฆฌ๋ฅผ ๊ด€์‹ฌ์‚ฌ๋กœ ๋‘”๋‹ค.

  4. Database layer: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์œ„์น˜ํ•œ ๊ณ„์ธต


3. Flux Architecture

Redux์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ™œ์šฉํ•œ ๋ฆฌ์•กํŠธ์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜, ๊ณง๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ธฐ ๋ณด๋‹จ ํŒจํ„ด์— ๊ฐ€๊น๋‹ค. ์ฆ‰ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ •์˜ํ•œ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๋‹ค.

FLUX data flow

FLUX data flow
  • Action: ๋ฐ์ดํ„ฐ ๋ณ€ํ™”๋ฅผ ์ฃผ๊ธฐ์œ„ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋™์ž‘

  • Dispatcher: ์Šคํ† ์–ด๋กœ ์•ก์…˜์„ ๋ฐœ์†กํ•˜๋Š” ์—ญํ• 

  • Store: ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„, ์ˆ˜์‹ ํ•œ ์•ก์…˜์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ

  • View: ์Šคํ† ์–ด์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ™”๋ฉด, ์œ ์ € ์ธํ„ฐ๋ ‰์…˜์ด ๋ฐœ์ƒํ•˜๋ฉด ๋™์ผํ•œ FLUX Cycle์ด ๋ฐ˜๋ณต๋œ๋‹ค.

์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด ๊ณผ์ •์ด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅธ๋‹ค๋Š” ๊ฒƒ.

MVC ํŒจํ„ด

Facebook์—์„œ FLUX ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งŒ๋“ ์ด์œ ๊ฐ€ MVC ํŒจํ„ด์—์„œ ์‹œ์ž‘๋œ ๊ฒƒ์œผ๋กœ ์ด์— ๋Œ€ํ•ด ์•Œ๊ณ  ๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

  • ์ปจํŠธ๋กค๋Ÿฌ: ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  • ๋ชจ๋ธ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ชจ๋ธ์˜ ์—…๋ฐ์ดํŠธ๋Š” ๋ทฐ์— ๋ฐ˜์˜๋œ๋‹ค.

  • ๋ทฐ: ์‚ฌ์šฉ์ž๊ฐ€ ๋ทฐ๋ฅผ ํ†ตํ•ด ํ…Œ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

MVC ์•ˆํ‹ฐํŒจํ„ด

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์œ ์ € ์ธํ„ฐ๋ ‰์…˜์ด ๋ทฐ๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•˜๊ณ , ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ•ด๋‹น ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋˜๋‹ค๋ฅธ ๋ทฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ณ , ์ด ๋ทฐ๊ฐ€ ๋˜ ์–ด๋–ค ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์„œ๋กœ์„œ๋กœ๊ฐ€ ์˜์กดํ•˜๊ฒŒ ๋˜๋Š” ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ธฐ๋Šฅ์ด ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ๋ณต์žก์„ฑ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ์˜ˆ์ธก๋ถˆ๊ฐ€๋Šฅ ํ•ด์ง€๋ฉฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ FLUX ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•œ ๊ฒƒ

๊ฐ ๊ตฌ์„ฑ์š”์†Œ์˜ ์—ญํ• ์€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ๋ทฐ์™€ ๋ชจ๋ธ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  ๋ชจ๋ธ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ, ๋ทฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, Facebook์—์„œ ์„ค๋ช…ํ•˜๋Š” ํŒจํ„ด์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” MVC ํŒจํ„ด์˜ ํ๋ฆ„๊ณผ๋Š” ์ฐจ์ด๊ฐ€ ์ข€ ์žˆ๋‹ค. ํ˜น์ž๋Š” Facebook์—์„œ ์ž˜๋ชป๋œ MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๊ฑฐ๋‚˜, SPA ๊ตฌ์กฐ์— MVC ํŒจํ„ด์„ ์–ต์ง€๋กœ ๋ผ์›Œ๋งž์ถ”๋‹ค๋ณด๋‹ˆ ์ด๋Ÿฐ ํŒจํ„ด์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๋ง๋„ ์žˆ๋‹ค. Facebook์—์„œ ๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์–ด๋– ํ•œ ๊ด€์ ์œผ๋กœ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ํ”„๋ก ํŠธ์—”๋“œ ๊ด€์ ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ, ๊ฐ๊ฐ์˜ ๋ชจ๋ธ์€ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ, ๋ทฐ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋œ UI๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์ด ๊ฐ€์ ธ์˜ฌ ์‹œ์Šคํ…œ ๋ณต์žก์„ฑ ์ฆ๊ฐ€๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.


4. useReducer

์ปดํฌ๋„ŒํŠธ์—์„œ ๋ณต์žกํ•œ ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ useReducer hook์„ ์‚ฌ์šฉํ•œ๋‹ค.

useReducer hook ํ˜•ํƒœ

const ['์ƒํƒœ ๊ฐ์ฒด', 'dispatch ํ•จ์ˆ˜'] = useReducer('reducer ํ•จ์ˆ˜', '์ดˆ๊ธฐ ์ƒํƒœ', '์ดˆ๊ธฐ ํ•จ์ˆ˜');

useReducer ํ•จ์ˆ˜๋Š” state์™€ action ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ์ƒˆ๋กœ์šด state๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. dispatch ํ•จ์ˆ˜๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š”๋ฐ ์ธ์ž๋กœ action ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค.

action ๊ฐ์ฒด

์–ด๋– ํ•œ ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ์ •์˜ํ•œ type ์†์„ฑ๊ณผ ํ•ด๋‹น ํ–‰๋™๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ payload ์†์„ฑ์„ ๋‹ด๊ณ ์žˆ๋‹ค.

reducer๊ฐ€ ๋ญ” ๋œป ์ด์ง€..?

reduce๋ผ๋Š” ์ค„์ด๋‹ค๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ reducer์˜ ๋œป์„ ์ฐพ์•„๋ณด๋ฉด ๊ฐ์ถ•๊ธฐ๋ผ๊ณ  ๋‚˜์˜จ๋‹ค. ๋ญ”์†Œ๋ฆฌ์ธ๊ฐ€ ์‹ถ์—ˆ๋Š”๋ฐ ๋ณธ๋ž˜ reduce์˜ ๋œป์€ ๋ณ€๊ฒฝ์ด๋ผ๋Š” ์˜๋ฏธ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— reducer๋Š” ํ˜„์žฌ ์ƒํƒœ(previousState)๋ฅผ ์ƒˆ๋กœ์šด ์ƒํƒœ(newState)๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.


5. useCallback

React์—์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” hook์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๋‚ด๋ถ€์— ์„ ์–ธํ•œ ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋˜๋Š”๋ฐ useCallback์„ ํ†ตํ•ด ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)

ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ๋™์ผํ•œ ์ž…๋ ฅ์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•  ๋•Œ ์บ์‹ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์ด๋‹ค.

const memoizedFunction = useCallback('ํ•จ์ˆ˜', '๋ฐฐ์—ด');
  • ๋‘๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์‚ฝ์ž…ํ•œ ์š”์†Œ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ•จ์ˆ˜๋ฅผ ์žฌ์„ ์–ธํ•œ๋‹ค.

  • ๊ทธ๋Ÿฐ๋ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ ์„ ์–ธ๋˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์‹คํ–‰๋˜๋Š”์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์„ฑ๋Šฅ์ƒ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด useCallback()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํฐ ์˜๋ฏธ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ์†ํ•ด์ผ ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ ๋™๋“ฑ์„ฑ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด(์ •ํ™•ํžˆ๋Š” ์ผ๊ธ‰๊ฐ์ฒด)๋กœ ์ทจ๊ธ‰๋˜๋Š”๋ฐ, ๋™์ผํ•œ ์ฝ”๋“œ์˜ ํ•จ์ˆ˜์ผ์ง€๋ผ๋„ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ํŒ๋‹จํ•œ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์˜ํ•œ ์ฐธ์กฐ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.(๊ฐ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๊ฐ™์ง€์•Š๋‹ค)

const add1 = () => x + y; 
const add2 = () => x + y; 
add1 === add2 // false

์ด๋Ÿฌํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์„ฑ์€ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„˜๊ธฐ๊ฑฐ๋‚˜, ์ž์‹์ปดํฌ๋„ŒํŠธ์˜ props๋กœ ๋„˜๊ธธ ๋•Œ ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๊ฐ€ ๋‹ฌ๋ผ์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ

fetch API๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” fetchData ํ•จ์ˆ˜์™€ useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ ์˜ˆ์‹œ๋‹ค.

import React, { useState, useEffect } from "react";

function Profile({ userId }) {
  const [user, setUser] = useState(null);

  const fetchUser = () =>
    fetch(`https://your-api.com/users/${userId}`)
      .then((response) => response.json())
      .then(({ user }) => user);

  useEffect(() => {
    fetchUser().then((user) => setUser(user));
  }, [fetchUser]);

  // ...
}
  • fetchUser์˜ ํ•จ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด useEffect๋ฅผ ํ˜ธ์ถœํ•ด ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ฐ›์•„์˜ค๋Š” ๋กœ์ง์ด๋‹ค.

  • ๋ฌธ์ œ์ ์€ ํ•จ์ˆ˜์˜ ๋™๋“ฑ์„ฑ์œผ๋กœ ์ธํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง„๋‹ค.

  • userId๊ฐ’๊ณผ ์ƒ๊ด€์—†์ด fetchUser ํ•จ์ˆ˜๋Š” ๋ Œ๋”๋ง๋  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— useEffect์˜ effect ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  user ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋˜๊ณ  ๋‹ค์‹œ fetchUser ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์ด๋Ÿฐ ์‚ฌ์ดํด์˜ ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ด๋Ÿด๋•Œ useCallback hook์„ ์ด์šฉํ•ด ํ•จ์ˆ˜์˜ ๋™๋“ฑ์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.

import React, { useState, useEffect } from "react";

function Profile({ userId }) {
  const [user, setUser] = useState(null);

  const fetchUser = useCallback(
    () =>
      fetch(`https://your-api.com/users/${userId}`)
        .then((response) => response.json())
        .then(({ user }) => user),
    [userId]
  );

  useEffect(() => {
    fetchUser().then((user) => setUser(user));
  }, [fetchUser]);

  // ...
}
  • useCallback() ํ›…์„ ์ด์šฉํ•ด ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๊ฐ’์„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€์‹œํ‚จ๋‹ค.

  • fetchUserํ•จ์ˆ˜๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ userId๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”ํ•œ ์žฌํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

useMemo

useMemo hook๋˜ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๊ธฐ์กด๊ณผ ๋™์ผํ•œ ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์บ์‹ฑ๋œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

Last updated