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