1.External Store

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

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

๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์˜€์„ ๋•Œ ์–ป๋Š” ์ด์ 

  1. ๋ชจ๋“ˆ์„ฑ(Modularity): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์ž‘์€ ์ž์ฒด ํฌํ•จ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋‚˜๋ˆ„๋ฉด ์œ ์ง€ ๊ด€๋ฆฌ์™€ ์žฌ์‚ฌ์šฉ์ด ๋” ์‰ฌ์›Œ์ง„๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํŠน์ • ์ฑ…์ž„์— ์ค‘์ ์„ ๋‘์–ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  2. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ(Code reusability): ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด๋‚˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ํ˜‘์—…(Collaboration): ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•  ๋•Œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ๋™์‹œ์— ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฐœ์„ ๋ฐŸ์„ ์—ผ๋ ค ์—†์ด ํ• ๋‹น๋œ ๊ด€์‹ฌ์‚ฌ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

React๊ด€์ ์—์„œ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๊ณผ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. ๊ตฌ์„ฑ ์š”์†Œ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(Component-based architecture): React๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ตฌ์„ฑ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ณ ์œ ํ•œ ๋…ผ๋ฆฌ์™€ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ์บก์Šํ™”ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜์—ฌ ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. SRP(Single Responsibility Principle): SRP์— ๋”ฐ๋ผ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ๋˜๋Š” ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

  3. ์ปจํ…Œ์ด๋„ˆ ๋ฐ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ตฌ์„ฑ ์š”์†Œ(Container and Presentational Components): ์Šค๋งˆํŠธ ์ปดํฌ๋„ŒํŠธ์™€ ๋ค ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ ๋„ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐœ๋…์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ๋Š” ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ˜๋ฉด ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ œ๊ณต๋œ ์†Œํ’ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ UI๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘”๋‹ค.

  4. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(State management libraries): React๋Š” useState ๋ฐ useReducer๋ผ๋Š” ์ž์ฒด ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณด๋‹ค ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ Redux ๋˜๋Š” MobX์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์•™ ์ง‘์ค‘์‹ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.

  5. ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(Separate data fetching): React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” API ๋˜๋Š” ๊ธฐํƒ€ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋…ผ๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ ๋˜๋Š” ํ›„ํฌ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

Layered Architecture

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

Layered Architecture์—์„œ ๊ฐ ๊ณ„์ธต์€ ๊ด€๋ จ ๊ธฐ๋Šฅ์˜ ๋…ผ๋ฆฌ์  ๊ทธ๋ฃน์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ํŠน์ • ์ž‘์—… ์ง‘ํ•ฉ์„ ๋‹ด๋‹นํ•˜๋ฉฐ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ณ„์ธต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต(Presentation Layer): ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ์ด ๊ณ„์ธต์€ ์‹œ์Šคํ…œ๊ณผ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ •๋ณด ํ‘œ์‹œ ๋ฐ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์บก์ฒ˜์— ์ค‘์ ์„ ๋‘”๋‹ค. ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์—๋Š” ์›น ํŽ˜์ด์ง€, ๋ชจ๋ฐ”์ผ ์•ฑ ํ™”๋ฉด ๋˜๋Š” ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.

  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต(Application Layer): ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ณ„์ธต์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๊ทœ์น™์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์‹œ์Šคํ…œ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹ค์ œ ๋™์ž‘ ๋ฐ ์ž‘์—…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์—์„œ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•„์š”ํ•œ ์ž‘์—…์˜ ์‹คํ–‰์„ ์กฐ์ •ํ•œ๋‹ค. ์ด ๊ณ„์ธต์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ, ์›Œํฌํ”Œ๋กœ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ทœ์น™ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•œ๋‹ค.

  3. ๋„๋ฉ”์ธ ๊ณ„์ธต(Domain Layer): ๋„๋ฉ”์ธ ๊ณ„์ธต์€ ๋„๋ฉ”์ธ๋ณ„ ๋…ผ๋ฆฌ๋ฅผ ์บก์Šํ™”ํ•˜๊ณ  ๋ฌธ์ œ ๋„๋ฉ”์ธ๊ณผ ๊ด€๋ จ๋œ ๊ฐœ๋… ๋ฐ ์—”ํ„ฐํ‹ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ์ฒด, ์—”ํ„ฐํ‹ฐ ๋ฐ ๊ทœ์น™์ด ํฌํ•จ๋œ๋‹ค. ๋„๋ฉ”์ธ ๊ณ„์ธต์€ ํŠน์ • ๊ธฐ์ˆ ์ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋…๋ฆฝ์ ์ด๋ฉฐ ์ธํ”„๋ผ ๋ฐ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•œ๋‹ค.

  4. ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต(Data Access Layer): ์ง€์†์„ฑ ๊ณ„์ธต์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ถ”์ƒํ™”ํ•œ๋‹ค. ์ด ๊ณ„์ธต์€ ์ฟผ๋ฆฌ ์‹คํ–‰, ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค, ๋„๋ฉ”์ธ ๊ฐœ์ฒด ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต์„ ๋‹ด๋‹นํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๋ณต์žก์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์œ„ ๊ณ„์ธต์„ ๋ณดํ˜ธํ•˜๊ณ  ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  5. ์ธํ”„๋ผ ๊ณ„์ธต(Infrastructure Layer): ์ธํ”„๋ผ ๊ณ„์ธต์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์„œ๋น„์Šค ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค ํ†ตํ•ฉ, ํŒŒ์ผ ์‹œ์Šคํ…œ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ๋กœ๊น…, ์บ์‹ฑ ๋ฐ ๋ณด์•ˆ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ๋‹ค. ์ธํ”„๋ผ ๊ณ„์ธต์€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ง€์›ํ•˜๊ณ  ์ƒ์œ„ ๊ณ„์ธต์ด ํšจ๊ณผ์ ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Layered Architecture์˜ ์ฃผ์š” ์ด์ 

  1. ๋ชจ๋“ˆํ™” ๋ฐ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ(Modularity and separation of concerns): Layered Architecture๋Š” ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๋ณ„๊ฐœ์˜ ๊ณ„์ธต์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ๊ณ„์ธต์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“ˆ์‹ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ๋‹ค.

  2. ์œ ์—ฐ์„ฑ ๋ฐ ํ™•์žฅ์„ฑ(Flexibility and scalability): Layered Architecture๋Š” ์ „์ฒด ์‹œ์Šคํ…œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๊ฐœ๋ณ„ ๊ณ„์ธต์„ ๊ต์ฒดํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ํ—ˆ์šฉํ•œ๋‹ค. ์ƒˆ๋กœ์šด ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ณ„์ธต์„ ์ œ๊ฑฐํ•˜์—ฌ ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ˆ˜์šฉํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ฑ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ์„ฑ์žฅํ•˜๊ณ  ์ง„ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

  3. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ(Code reusability): ์‹œ์Šคํ…œ์„ ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด ๋˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ์ฝ”๋“œ ์ค‘๋ณต์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

  4. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ(Testability): Layered Architecture๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. ๊ฐ ๊ณ„์ธต์€ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณด๋‹ค ์ง‘์ค‘์ ์ด๊ณ  ๋Œ€์ƒ์ด ์ง€์ •๋œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ฐ€๋Šฅํ•œ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋ฐ ์ข…๋‹จ ๊ฐ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ ๊ณ„์ธต์—์„œ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‹œ์Šคํ…œ์ด ์ „์ฒด์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Flux Architecture

Flux ์•„ํ‚คํ…์ฒ˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด์ด๋‹ค. Facebook์—์„œ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค. Flux๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋”ฐ๋ฅด๋ฏ€๋กœ ๋ณต์žกํ•œ ์ƒํƒœ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•  ์ˆ˜ ์žˆ๋‹ค.

Flux ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์ฃผ์š” ๊ตฌ์„ฑ

  1. Dispatcher: Dispatcher๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ค‘์•™ ํ—ˆ๋ธŒ ์—ญํ• ์„ ํ•œ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์ž‘์—…์„ ์ˆ˜์‹ ํ•˜๊ณ  ์ ์ ˆํ•œ ์ €์žฅ์†Œ๋กœ ๋ฐœ์†กํ•œ๋‹ค. ์ž‘์—…์ด ์ˆœ์ฐจ์ ์ด๊ณ  ๊ฒฐ์ •์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•œ๋‹ค. Dispatcher๋Š” ๋“ฑ๋ก๋œ ์ฝœ๋ฐฑ ๋ชฉ๋ก์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์ž‘์—…์ด ๋ฐœ์†ก๋  ๋•Œ ์ด๋ฅผ ์•Œ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  2. Actions: Actions์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. "์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ๋‹ค." ๋˜๋Š” "์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค."์™€ ๊ฐ™์ด ๋ฐœ์ƒํ•œ ์ƒํ™ฉ์„ ์„ค๋ช…ํ•˜๋Š” ์ผ๋ฐ˜ JavaScript ๊ฐœ์ฒด์ด๋‹ค. ์•ก์…˜์€ ์•ก์…˜ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ํ—ฌํผ ํ•จ์ˆ˜์ธ ์•ก์…˜ ์ƒ์„ฑ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค. ์ž‘์—…์ด ์ƒ์„ฑ๋˜๋ฉด Dispatcher๋กœ ๋ฐœ์†ก๋œ๋‹ค.

  3. Stores: Stores์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํฌํ•จ๋œ๋‹ค. ๋ฐœ์†ก๋œ ์ž‘์—…์— ์‘๋‹ตํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. Stores๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ทฐ(๊ตฌ์„ฑ ์š”์†Œ)์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ ๋…ธ์ถœ์„ ๋‹ด๋‹นํ•œ๋‹ค. ์ž‘์—…์„ ์ˆ˜์‹ ํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Dispatcher์— ๋“ฑ๋กํ•œ๋‹ค. Stores์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ทฐ์— ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

  4. Views: ์ข…์ข… React ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ‘œ์‹œ๋˜๋Š” Views๋Š” Stores์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ๋งค์žฅ์„ ๊ตฌ๋…ํ•˜๊ณ  ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค. Stores๊ฐ€ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฉด ๋ทฐ๋Š” Stores์—์„œ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์Šค์Šค๋กœ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ๋‹ค.

Flux ์•„ํ‚คํ…์ฒ˜์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค.

  1. ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ๋˜๋Š” ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ๋Š” Dispatcher๋กœ ๋ฐœ์†ก๋˜๋Š” ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค.

  2. Dispatcher๋Š” ์กฐ์น˜๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ ์ ˆํ•œ ์ƒ์ ์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  3. Stores๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  4. Stores๊ฐ€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  5. Views(๊ตฌ์„ฑ ์š”์†Œ)๋Š” ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ €์žฅ์†Œ์—์„œ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

  6. Views๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค์Šค๋กœ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ๋‹ค.

Flux ์•„ํ‚คํ…์ฒ˜ ์‚ฌ์šฉ์˜ ์ด์ 

  1. ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Predictable data flow): Flux์˜ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜๊ณ  ํ๋ฅด๋Š”์ง€ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์€ ๋””๋ฒ„๊น…์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ์›์ธ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

  2. ์ค‘์•™ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ(Centralized state management): Flux Stores๋Š” ์ค‘์•™ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠนํžˆ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์ด ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒํƒœ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ์œ ์ง€ ๋ณด์ˆ˜์„ฑ(Maintainability): Flux์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๋” ๋‚˜์€ ์ฝ”๋“œ ๊ตฌ์„ฑ ๋ฐ ๋ชจ๋“ˆํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ(Dispatcher, Actions, Stores, Views)์—๋Š” ํŠน์ • ์ฑ…์ž„์ด ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ โ€‹โ€‹์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ํ™•์žฅ์„ฑ(Scalability): Flux๋Š” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ๋ฐ ์ƒํƒœ ์ƒํ˜ธ ์ž‘์šฉ์ด ์žˆ๋Š” ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„ ๋ฐ ์ค‘์•™ ์ง‘์ค‘์‹ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ํ™•์žฅํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

useReducer

React์—์„œ useReducer ํ›„ํฌ๋Š” ๋ณต์žกํ•œ ์ƒํƒœ ๋ฐ ์ƒํƒœ ์ „ํ™˜์„ ๋ณด๋‹ค ์ œ์–ด๋˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜์ด๋‹ค. ์ด๊ฒƒ์€ useState ํ›„ํฌ์˜ ๋Œ€์•ˆ์ด๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐ’์ด ํฌํ•จ๋œ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ ์ „ํ™˜์ด ์ด์ „ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•œ๋‹ค.

useReducer ํ›„ํฌ๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์™€ ์ดˆ๊ธฐ ์ƒํƒœ๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. reducer function์€ ๋‹ค๋ฅธ ์ž‘์—…์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ดˆ๊ธฐ ์ƒํƒœ ์ธ์ˆ˜๋Š” ์ƒํƒœ์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

reducer ํ•จ์ˆ˜๋Š” state์™€ action ๋‘ ๊ฐ€์ง€ ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. action type์„ ํ™•์ธํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. reducer ํ•จ์ˆ˜๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋”๋ผ๋„ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

import React, { useReducer } from 'react';

// Reducer function
const reducer = (state, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    case 'RESET':
      return { count: 0 };
    default:
      return state;
  }
};

// Component using useReducer
const Counter = () => {
  const [state, dispatch] = useReducer(reducer, { count: 0 });

  const increment = () => {
    dispatch({ type: 'INCREMENT' });
  };

  const decrement = () => {
    dispatch({ type: 'DECREMENT' });
  };

  const reset = () => {
    dispatch({ type: 'RESET' });
  };

  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
      <button onClick={reset}>Reset</button>
    </div>
  );
};

useReducer๋ฅผ ์‚ฌ์šฉ ์‹œ ์ด์ 

  1. ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ(Complex state management): useReducer๋Š” ์—ฌ๋Ÿฌ ๊ฐ’ ๋˜๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๊ด€๋ จ๋œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ๋ณต์žกํ•œ ์ƒํƒœ ์ „ํ™˜ ๋ฐ ๋…ผ๋ฆฌ๋ฅผ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์—…๋ฐ์ดํŠธ(Predictable updates): ์ƒํƒœ ์ „ํ™˜์€ ํŠน์ • ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ ์ƒํƒœ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ์ตœ์ ํ™”(Optimization): useReducer๋Š” ์ด์ „ ์ƒํƒœ์— ์˜์กดํ•˜๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ƒํƒœ ์ „ํ™˜์ด ๊ฐ€์žฅ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์ž ์žฌ์  ๊ฒฝํ•ฉ ์ƒํƒœ๋ฅผ ๋ฐฉ์ง€ํ•˜๋„๋ก ํ•œ๋‹ค.

  4. ์ƒํƒœ ๋กœ์ง ๊ณต์œ (Sharing state logic): ๋ฆฌ๋“€์„œ ๊ธฐ๋Šฅ์€ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ์ค‘๋ณต์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

useReducer๋Š” useState์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์†”๋ฃจ์…˜์— ๋น„ํ•ด ์ถ”๊ฐ€์ ์ธ ๋ณต์žก์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํƒœ ๋กœ์ง์ด ๋” ๋ณต์žกํ•ด์ง€๊ณ  ์ƒํƒœ ์ „ํ™˜์— ๋Œ€ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์ œ์–ด๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ 'useReducer'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

useCallback

React์—์„œ useCallback ํ›„ํฌ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ƒ์„ฑ์„ ๋ฉ”๋ชจํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋ฐฉ์ง€์™€ ๊ฐ™์ด ์ฐธ์กฐ ๋™๋“ฑ์„ฑ์— ์˜์กดํ•˜๋Š” ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ฃผ๋กœ ์œ ์šฉํ•˜๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ ๋ Œ๋”๋ง์—์„œ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ํ•จ์ˆ˜ ๋กœ์ง์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋”๋ผ๋„ ์ด๋Ÿฌํ•œ ์ฝœ๋ฐฑ์— ์˜์กดํ•˜๋Š” ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค์‹œ ๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ๋‹ค. useCallback์€ ์ข…์† ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฉ”๋ชจํ™”๋œ ๋ฒ„์ „์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

useCallback ํ›„ํฌ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ์ข…์†์„ฑ ๋ฐฐ์—ด์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ข…์†์„ฑ์€ ๋ฉ”๋ชจํ™”๋œ ์ฝœ๋ฐฑ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

import React, { useState, useCallback } from 'react';

const ParentComponent = () => {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    setCount(count + 1);
  }, [count]);

  return (
    <div>
      <p>Count: {count}</p>
      <ChildComponent onClick={handleClick} />
    </div>
  );
};

const ChildComponent = ({ onClick }) => {
  // Child component logic using the onClick callback
  // ...
};

useCallback ์‚ฌ์šฉ ์‹œ ์ด์ 

  1. ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ(Optimized performance): useCallback์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจํ•˜์—ฌ ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์ฝœ๋ฐฑ์ด ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋„๋ก ํ•œ๋‹ค.

  2. ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์žฌ์ƒ์„ฑ ๋ฐฉ์ง€(Avoiding unnecessary function recreation): ์ฝœ๋ฐฑ์„ ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ์— ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌํ•  ๋•Œ useCallback์€ ๊ฐ ๋ Œ๋”๋ง์—์„œ ์ฝœ๋ฐฑ ์ธ์Šคํ„ด์Šค ์žฌ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

  3. ์•ˆ์ •๋œ ์ฐธ์กฐ(Stable references): useCallback์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ์ฐธ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Š” ์ปดํฌ๋„ŒํŠธ ๋ฉ”๋ชจ๋ฅผ ์œ„ํ•ด 'React.memo'๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated