2.React State

React stateλž€?

Reactμ—μ„œ state(μƒνƒœ)λŠ” components(ꡬ성 μš”μ†Œ) λ‚΄μ—μ„œ 데이터λ₯Ό κ΄€λ¦¬ν•˜λŠ” 방법이닀. ꡬ성 μš”μ†Œμ˜ λ‚΄λΆ€ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λ©° ꡬ성 μš”μ†Œ μžμ²΄μ—μ„œ μˆ˜μ •ν•  수 μžˆλ‹€. ꡬ성 μš”μ†Œμ˜ μƒνƒœκ°€ λ³€κ²½λ˜λ©΄ ReactλŠ” μžλ™μœΌλ‘œ ꡬ성 μš”μ†Œμ™€ ν•΄λ‹Ή ν•˜μœ„ ꡬ성 μš”μ†Œλ₯Ό λ‹€μ‹œ λ Œλ”λ§ν•˜μ—¬ μ—…λ°μ΄νŠΈλœ μƒνƒœλ₯Ό λ°˜μ˜ν•œλ‹€.

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(prev => prev + 1)}>Increment</button>
    </div>
  );
}

이 μ˜ˆμ—μ„œ Counter κ΅¬μ„±μš”μ†ŒλŠ” useStateλ₯Ό μ‚¬μš©ν•˜μ—¬ 0으둜 μ΄ˆκΈ°ν™”λœ countλΌλŠ” μƒνƒœ λ³€μˆ˜λ₯Ό μ •μ˜ν•œλ‹€. λ˜ν•œ μƒνƒœ 값을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ setCount ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 읡λͺ… ν•¨μˆ˜κ°€ 호좜되며 setCount ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ count μƒνƒœ 값을 μ—…λ°μ΄νŠΈν•œλ‹€. 그런 λ‹€μŒ ReactλŠ” μ—…λ°μ΄νŠΈλœ μƒνƒœ κ°’μœΌλ‘œ ꡬ성 μš”μ†Œλ₯Ό λ‹€μ‹œ λ Œλ”λ§ν•˜μ—¬ μƒˆ count 값이 ν‘œμ‹œλ˜λ„λ‘ ν•œλ‹€.

'useState'λ₯Ό μ‚¬μš©ν•˜λ©΄ 클래슀 ꡬ성 μš”μ†Œλ‚˜ ꡬ성 μš”μ†Œμ˜ 'props'λ₯Ό μˆ˜λ™μœΌλ‘œ μ‘°μž‘ν•  ν•„μš” 없이 κΈ°λŠ₯적 ꡬ성 μš”μ†Œμ—μ„œ μƒνƒœ 값을 μ •μ˜ν•˜κ³  μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€.

DRY 원칙

"Don't Repeat Yourself"(DRY)λŠ” μ½”λ“œ λ°˜λ³΅μ„ 쀄이고 κΈ°μ‘΄ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„ μ΅œλŒ€ν™”ν•˜λŠ” 것을 μ˜Ήν˜Έν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 원칙이닀. 이 원칙은 μ§€μ‹μ΄λ‚˜ λ…Όλ¦¬μ˜ λͺ¨λ“  뢀뢄이 μ‹œμŠ€ν…œ λ‚΄μ—μ„œ λ‹¨μΌν•˜κ³  λͺ¨ν˜Έν•˜μ§€ μ•Šμ€ ν‘œν˜„μ„ κ°€μ Έμ•Ό ν•œλ‹€κ³  λͺ…μ‹œν•œλ‹€.

μ‹€μ œλ‘œ 이것은 μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ κ°œλ°œμžκ°€ λ™μΌν•œ κΈ°λŠ₯μ΄λ‚˜ 논리λ₯Ό μ—¬λŸ¬ μœ„μΉ˜μ— λ³΅μ œν•˜μ§€ μ•Šμ•„μ•Ό 함을 μ˜λ―Έν•œλ‹€. μ΄λŠ” μ½”λ“œ λΆ€ν’€λ¦Ό, λ³΅μž‘μ„± 증가 및 잠재적인 λ²„κ·Έλ‘œ μ΄μ–΄μ§ˆ 수 있기 λ•Œλ¬Έμ΄λ‹€. λŒ€μ‹  곡톡 κΈ°λŠ₯은 ν•„μš”μ— 따라 μ½”λ“œλ² μ΄μŠ€ μ „μ²΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“ˆ, ν•¨μˆ˜ λ˜λŠ” 클래슀둜 μΆ”μƒν™”λ˜μ–΄μ•Ό ν•œλ‹€.

DRY 원칙을 λ”°λ₯΄λ©΄ 더 κΉ¨λ—ν•˜κ³  μœ μ§€ κ΄€λ¦¬ν•˜κΈ° μ‰¬μš΄ μ½”λ“œλ₯Ό λ§Œλ“€ 수 있으며 버그가 적고 변경이 더 쉽닀. λ˜ν•œ 논리가 쀑앙 μ§‘μ€‘ν™”λ˜κ³  μ½”λ“œλ² μ΄μŠ€ 전체에 λΆ„μ‚°λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ½”λ“œλ₯Ό 더 μ‰½κ²Œ ν…ŒμŠ€νŠΈν•˜κ³  λ¦¬νŒ©ν„°λ§ν•  수 μžˆλ‹€.

λ¦¬μ•‘νŠΈμ—μ„œ μž‘μ—…ν•˜λ‹€λ³΄λ©΄ μžμ—°μŠ€λŸ½κ²Œ 이 원칙을 μ§€ν‚€κ²Œ λ˜λŠ” 것 κ°™λ‹€. UIμž‘μ—…μ„ ν•˜λ‹€λ³΄λ©΄ 동일 ν˜•νƒœμ˜ UIλ₯Ό μ—¬λŸ¬ ν™”λ©΄μ—μ„œ λ³΄μ—¬μ€˜μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žμ€λ° μ΄λŸ΄κ²½μš°μ— ν™”λ©΄λ§ˆλ‹€ μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•˜κ²Œ λœλ‹€λ©΄ κ΄€λ¦¬ν•΄μ•Όν•˜λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ μžμ—°μŠ€λŸ½κ²Œ λŠ˜μ–΄λ‚˜λŠ”κ±°κ³  κ·ΈλŸ¬λ‹€λ³΄λ©΄ 같은 μˆ˜μ •μ„ ν•˜λ”λΌλ„ μˆ˜μ • μž‘μ—…μ„ ν•˜λ˜ 쀑에 같은 ν˜•νƒœμ΄μ§€λ§Œ λ‹€λ₯Έ 버그가 λ°œμƒν•  수 λ„μžˆλ‹€.

κ·Έλž˜μ„œ μž‘μ—…μ„ ν•˜λ©΄μ„œ λΉ„μŠ·ν•œ 폼을 κ°€μ§€λŠ” UIλ˜λŠ” λ™μΌν•œ κΈ°λŠ₯을 κ°€μ§€λŠ” ν•¨μˆ˜λ“€μ„ 곡용으둜 λ”°λ‘œ μž‘μ—…μ„ ν•΄μ„œ ν•œ κ³³μ—μ„œ μœ μ§€ 보수 ν•  수 μžˆλ„λ‘ μž‘μ—…ν•˜λŠ”κ²Œ μ€‘μš”ν•˜λ‹€κ³  μƒκ°λœλ‹€.

SSOT(Single Source of Truth)

SSOT(Single Source of Truth)λŠ” μ‹œμŠ€ν…œμ˜ λͺ¨λ“  데이터 쑰각이 μ‹œμŠ€ν…œ λ‚΄μ—μ„œ λͺ¨ν˜Έν•˜μ§€ μ•Šμ€ 단일 ν‘œν˜„μ„ κ°€μ Έμ•Ό ν•œλ‹€κ³  λͺ…μ‹œν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 원칙이닀. 즉, λ°μ΄ν„°λŠ” ν•„μš”ν•œ λͺ¨λ“  ꡬ성 μš”μ†Œμ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” 쀑앙 μœ„μΉ˜μ— μ €μž₯λ˜μ–΄μ•Ό ν•˜λ©° 이 λ°μ΄ν„°λŠ” ν•΄λ‹Ή νŠΉμ • 정보에 λŒ€ν•œ μœ μΌν•œ 정보 μ†ŒμŠ€μ—¬μ•Ό ν•œλ‹€.

μ‹€μ œλ‘œ 이것은 μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•  λ•Œ κ°œλ°œμžκ°€ μ‹œμŠ€ν…œμ˜ λ‹€λ₯Έ 뢀뢄에 λ™μΌν•œ λ°μ΄ν„°μ˜ μ—¬λŸ¬ 볡사본을 두지 μ•Šλ„λ‘ λ…Έλ ₯ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. μ΄λŠ” 뢈일치, 였λ₯˜ 및 λ¦¬μ†ŒμŠ€ λ‚­λΉ„λ‘œ μ΄μ–΄μ§ˆ 수 있기 λ•Œλ¬Έμ΄λ‹€. λŒ€μ‹  λ°μ΄ν„°λŠ” ν•΄λ‹Ή λ°μ΄ν„°μ˜ μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€ 역할을 ν•˜λŠ” 단일 μœ„μΉ˜μ— μ €μž₯ν•΄μ•Ό ν•œλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ • μš”κ΅¬ 사항에 따라 λ°μ΄ν„°λ² μ΄μŠ€, API λ˜λŠ” 파일 μ‹œμŠ€ν…œμ΄ 될 수 μžˆλ‹€.

κ°œλ°œμžλŠ” SSOT 원칙에 따라 전체 μ‹œμŠ€ν…œμ—μ„œ 데이터가 μΌκ΄€λ˜κ³  μ΅œμ‹  μƒνƒœμΈμ§€ ν™•μΈν•˜μ—¬ 버그와 였λ₯˜λ₯Ό 방지할 수 μžˆλ‹€. λ˜ν•œ λ³€κ²½ 사항을 μ‹œμŠ€ν…œ 전체에 λ³΅μ œν•˜λŠ” λŒ€μ‹  ν•œ κ³³μ—μ„œλ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ 데이터λ₯Ό 보닀 μ‰½κ²Œ β€‹β€‹κ΄€λ¦¬ν•˜κ³  μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄ 고객 정보λ₯Ό ν‘œμ‹œν•˜λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ SSOT 원칙은 λͺ¨λ“  고객 데이터가 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 걸쳐 μ—¬λŸ¬ μœ„μΉ˜μ— λ³΅μ œλ˜κΈ°λ³΄λ‹€λŠ” 단일 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯λ˜μ–΄μ•Ό ν•œλ‹€κ³  μ œμ•ˆν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“  뢀뢄이 λ™μΌν•œ μ΅œμ‹  μ •λ³΄λ‘œ μž‘λ™ν•˜κ³  였λ₯˜λ‚˜ 뢈일치의 μœ„ν—˜μ΄ 쀄어든닀.

useState

Reactμ—μ„œ useStateλŠ” κΈ°λŠ₯ ꡬ성 μš”μ†Œκ°€ μƒνƒœλ₯Ό κ°€μ§ˆ 수 μžˆλ„λ‘ ν•˜λŠ” hook이닀. μ΄μ „μ—λŠ” setStateλ₯Ό μ‚¬μš©ν•˜λŠ” 클래슀 ꡬ성 μš”μ†Œμ—μ„œλ§Œ κ°€λŠ₯ν–ˆμ—ˆλŠ”λ° μš”μ¦˜μ€ κΈ°λŠ₯적 ꡬ성 μš”μ†Œ(Functional components)μ—μ„œ μƒνƒœλ₯Ό μ •μ˜ν•˜κ³  μ—…λ°μ΄νŠΈν•˜λŠ” 방법을 μ œκ³΅ν•œλ‹€.

useState hook은 초기 μƒνƒœ 값을 λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•˜κ³  ν˜„μž¬ μƒνƒœ κ°’κ³Ό ν•΄λ‹Ή μƒνƒœ 값을 μ—…λ°μ΄νŠΈν•˜λŠ” ν•¨μˆ˜μ˜ 두 가지 값이 ν¬ν•¨λœ 배열을 λ°˜ν™˜ν•œλ‹€.

const [temporary, setTemporary] = useState();

λ°°μ—΄μ˜ 첫 번째 값은 ν˜„μž¬ μƒνƒœ κ°’μœΌλ‘œ ꡬ성 μš”μ†Œμ˜ λ Œλ”λ§ λ©”μ„œλ“œμ—μ„œ μ•‘μ„ΈμŠ€ν•˜κ³  ν‘œμ‹œν•  수 μžˆλ‹€. 두 번째 값은 μƒνƒœ 값을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜λ‘œ, ꡬ성 μš”μ†Œκ°€ λ‹€μ‹œ λ Œλ”λ§λ˜λ„λ‘ ν•œλ‹€.

1κΈ‰ 객체(first-class object)λž€?

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ μ„€κ³„μ—μ„œ 일급 객체(λ˜λŠ” 일급 μ‹œλ―Ό)λŠ” κ°’ λ˜λŠ” 객체둜 μ·¨κΈ‰λ˜μ–΄ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜κ±°λ‚˜ ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λ˜κ±°λ‚˜ λ³€μˆ˜μ— 할당될 수 μžˆλŠ” μ—”ν‹°ν‹°λ₯Ό μ„€λͺ…ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μš©μ–΄λ‹€.

κ°„λ‹¨νžˆ λ§ν•΄μ„œ 일급 κ°μ²΄λŠ” μ–Έμ–΄μ˜ λ‹€λ₯Έ κ°’μ΄λ‚˜ 객체처럼 μ‘°μž‘ν•  수 μžˆλŠ” μ—”ν‹°ν‹°λ‹€.

JavaScript 및 Pythonκ³Ό 같은 일뢀 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” ν•¨μˆ˜λ₯Ό 일급 객체둜 μ·¨κΈ‰ν•˜λ―€λ‘œ λ³€μˆ˜μ— ν• λ‹Ήν•˜κ±°λ‚˜ λ‹€λ₯Έ ν•¨μˆ˜μ— 인수둜 μ „λ‹¬ν•˜κ±°λ‚˜ ν•¨μˆ˜μ—μ„œ κ°’μœΌλ‘œ λ°˜ν™˜ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 ν”„λ‘œκ·Έλž˜λ°μ˜ μœ μ—°μ„±κ³Ό ν‘œν˜„λ ₯을 높일 수 μžˆλ‹€.

JavaScriptμ—μ„œ ν•¨μˆ˜λŠ” 일급 객체둜 κ°„μ£Όλ˜λŠ”λ° 즉, μ–Έμ–΄μ˜ λ‹€λ₯Έ κ°’μ΄λ‚˜ 객체처럼 취급될 수 μžˆλ‹€. 이것은 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 더 큰 μœ μ—°μ„±κ³Ό ν‘œν˜„λ ₯을 ν—ˆμš©ν•œλ‹€.

λ‹€μŒμ€ JavaScriptμ—μ„œ ν•¨μˆ˜κ°€ μ–΄λ–»κ²Œ 일급 객체인지에 λŒ€ν•œ λͺ‡ 가지 예

  1. λ³€μˆ˜μ— κΈ°λŠ₯을 ν• λ‹Ήν•  수 μžˆλ‹€.

const myFunc = function() {
  console.log("Hello world!");
};
  1. ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ— λŒ€ν•œ 인수둜 전달될 수 μžˆλ‹€.

function greet(name, greetingFunc) {
  console.log(greetingFunc(name));
}

function sayHello(name) {
  return "Hello " + name + "!";
}

greet("Alice", sayHello); // outputs "Hello Alice!"
  1. ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ κ°’μœΌλ‘œ λ°˜ν™˜λ  수 μžˆλ‹€.

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
console.log(add5(3)); // outputs 8

μœ„ μ˜ˆμ œμ—μ„œ ν•¨μˆ˜λŠ” μ–Έμ–΄μ˜ λ‹€λ₯Έ κ°’μ΄λ‚˜ 객체처럼 μ·¨κΈ‰λ˜λ©° λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ μ‘°μž‘λ  수 μžˆλ‹€.

Lifting State Up

μƒνƒœ 올리기(Lifting State Up)λŠ” ν•˜μœ„ ꡬ성 μš”μ†Œμ˜ μƒνƒœλ₯Ό μƒμœ„ ꡬ성 μš”μ†Œλ‘œ μ΄λ™ν•˜λŠ” React의 κΈ°μˆ μ΄λ‹€. 이λ₯Ό 톡해 μ—¬λŸ¬ ν•˜μœ„ ꡬ성 μš”μ†Œκ°€ λ™μΌν•œ μƒνƒœλ₯Ό κ³΅μœ ν•˜κ³  쀑앙 μœ„μΉ˜μ—μ„œ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€.

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

  function incrementCount() {
    setCount(count + 1);
  }

  return (
    <div>
      <ChildComponent count={count} incrementCount={incrementCount} />
      <AnotherChildComponent count={count} />
    </div>
  );
}

function ChildComponent(props) {
  return (
    <div>
      <p>Count: {props.count}</p>
      <button onClick={props.incrementCount}>Increment</button>
    </div>
  );
}

function AnotherChildComponent(props) {
  return <p>Count: {props.count}</p>;
}

μœ„ μ˜ˆμ œμ—μ„œ count μƒνƒœλŠ” ParentComponent에 μ €μž₯되고 ChildComponent 및 AnotherChildComponent에 μ†Œν’ˆ(props)으둜 μ „λ‹¬λœλ‹€. incrementCount ν•¨μˆ˜λ„ ChildComponent에 μ†Œν’ˆ(props)으둜 μ „λ‹¬λ˜μ–΄ μƒμœ„ ꡬ성 μš”μ†Œμ˜ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€.

μƒμœ„ ꡬ성 μš”μ†ŒκΉŒμ§€ μƒνƒœλ₯Ό λ“€μ–΄ 올리면 μ—¬λŸ¬ ν•˜μœ„ ꡬ성 μš”μ†Œκ°€ λ™μΌν•œ μƒνƒœλ₯Ό κ³΅μœ ν•  수 있으며 쀑앙 μœ„μΉ˜μ—μ„œ μƒνƒœ μ—…λ°μ΄νŠΈλ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œλ₯Ό 보닀 μ²΄κ³„ν™”ν•˜κ³  μœ μ§€ κ΄€λ¦¬ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€ 수 있으며 일관성 μ—†λŠ” μƒνƒœλ‘œ 인해 λ°œμƒν•˜λŠ” λ²„κ·Έμ˜ μœ„ν—˜μ„ 쀄일 수 μžˆλ‹€.

Last updated