κ΄λ ¨ ν€μλ
μ±λ₯ μ΅μ ν
리λ λλ§ κ΄λ ¨ λ°©μ§ λ¬Έμ
리μ‘νΈμμ mapμ μ¬μ©ν λ κ° νλͺ©μ κ³ μ ν ν€(key)λ₯Ό μ 곡ν΄μΌ νλ μ΄μ λ μ±λ₯ μ΅μ νμ 리λ λλ§ κ΄λ ¨ λ¬Έμ λ₯Ό λ°©μ§νκΈ° μν¨μ
λλ€.
κ³ μ ν ν€λ₯Ό μ 곡νλ©΄ 리μ‘νΈκ° κ°μ DOM(Virtual DOM)μμ κ° νλͺ©μ μ νν μλ³ν μ μμ΄, λ°μ΄ν°μ λ³κ²½ μ¬νμ ν¨μ¨μ μΌλ‘ λΉκ΅νκ³ μ λ°μ΄νΈν μ μμ΅λλ€. μ¦, λ³κ²½λ μμλ§ λ€μ λ λλ§νκ³ λλ¨Έμ§ μμλ κ·Έλλ‘ μ μ§νμ¬ λΆνμν 리λ λλ§μ μ€μ λλ€.
λ°λ©΄, ν€λ₯Ό μ 곡νμ§ μμΌλ©΄ 리μ‘νΈλ κΈ°λ³Έμ μΌλ‘ λ°°μ΄μ μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©ν©λλ€. νμ§λ§ μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ κ²μ 리μ€νΈμ μμκ° λ³κ²½λκ±°λ νλͺ©μ΄ μΆκ°/μμ λ λ λ¬Έμ κ° λ°μν μ μλλ° μλ₯Ό λ€μ΄, νλͺ©μ μμκ° λ°λλ©΄ μΈλ±μ€κ° ν΄λΉ νλͺ©μ κ³ μ μ±μ 보μ₯νμ§ λͺ»ν΄ 리μ‘νΈκ° μλͺ»λ μμλ₯Ό μ λ°μ΄νΈνκ±°λ μ 체 λͺ©λ‘μ λ€μ λ λλ§νκ² λ κ°λ₯μ±μ΄ λμμ§λλ€.
κ³ μ ν ν€λ₯Ό μ 곡νλ©΄ 리μ‘νΈκ° κ°μ DOM(Virtual DOM)μμ κ° νλͺ©μ μ νν μλ³ν μ μμ΄, λ°μ΄ν°μ λ³κ²½ μ¬νμ ν¨μ¨μ μΌλ‘ λΉκ΅νκ³ μ λ°μ΄νΈν μ μμ΅λλ€. μ¦, λ³κ²½λ μμλ§ λ€μ λ λλ§νκ³ λλ¨Έμ§ μμλ κ·Έλλ‘ μ μ§νμ¬ λΆνμν 리λ λλ§μ μ€μ λλ€.
λ°λ©΄, ν€λ₯Ό μ 곡νμ§ μμΌλ©΄ 리μ‘νΈλ κΈ°λ³Έμ μΌλ‘ λ°°μ΄μ μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©ν©λλ€. νμ§λ§ μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ κ²μ 리μ€νΈμ μμκ° λ³κ²½λκ±°λ νλͺ©μ΄ μΆκ°/μμ λ λ λ¬Έμ κ° λ°μν μ μλλ° μλ₯Ό λ€μ΄, νλͺ©μ μμκ° λ°λλ©΄ μΈλ±μ€κ° ν΄λΉ νλͺ©μ κ³ μ μ±μ 보μ₯νμ§ λͺ»ν΄ 리μ‘νΈκ° μλͺ»λ μμλ₯Ό μ λ°μ΄νΈνκ±°λ μ 체 λͺ©λ‘μ λ€μ λ λλ§νκ² λ κ°λ₯μ±μ΄ λμμ§λλ€.
μ΄λ μ±λ₯ μ νλΏλ§ μλλΌ UIμ μΌκ΄μ±μ ν΄μΉ μ μλ λ²κ·Έλ₯Ό μ λ°ν μ μμ΅λλ€.
λ°λΌμ ν€(Key)λ‘λ 리μ€νΈ λ΄μμ κ³ μ νκ³ μμ μ μΈ κ°(μ: λ°μ΄ν°λ² μ΄μ€μ IDλ UUID)μ μ¬μ©νλ κ²μ΄ κΆμ₯λ©λλ€. μμλ‘ μμ±λ κ°μ΄λ λ³λμ±μ΄ λμ κ°μ νΌν΄μΌ νλ©°, ν€κ° κ³ μ νμ§ μμΌλ©΄ 리μ‘νΈκ° κ²½κ³ λ₯Ό μΆλ ₯ν μλ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ 리μ‘νΈμ μ¬μ‘°μ (reconciliation) κ³Όμ μ΄ μ΅μ νλκ³ , μ¬μ©μ κ²½νκ³Ό μ ν리μΌμ΄μ
μ±λ₯μ΄ ν₯μλ©λλ€.
μ μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ©΄ λ¬Έμ κ° μκΈ°λκ°?
Reactμμ mapμΌλ‘ 리μ€νΈλ₯Ό λ λλ§ν λ κ° νλͺ©μ ν€λ₯Ό μ 곡νμ§ μμΌλ©΄, Reactλ κΈ°λ³Έμ μΌλ‘ λ°°μ΄μ μΈλ±μ€(0, 1, 2, ...)λ₯Ό ν€λ‘ μ¬μ©ν©λλ€. μ΄ μΈλ±μ€λ 리μ€νΈμ μμΉλ₯Ό λνλ΄λ―λ‘, 리μ€νΈμ νλͺ©μ΄ κ³ μ λμ΄ μκ³ μμκ° μ λ λ³νμ§ μλλ€λ©΄ λ¬Έμ κ° μμ μ μμ΅λλ€. νμ§λ§ 리μ€νΈμ νλͺ©μ΄ μΆκ°λκ±°λ μμ λκ±°λ μμκ° λ³κ²½λ λ, μΈλ±μ€λ λ μ΄μ ν΄λΉ νλͺ©μ κ³ μ μ±μ 보μ₯νμ§ λͺ»νκ² λ©λλ€. μ΄λ Reactμ μ¬μ‘°μ (reconciliation) κ³Όμ μμ νΌλμ μΌμΌν΅λλ€.
μλ₯Ό λ€μ΄, [A, B, C]λΌλ 리μ€νΈκ° μλ€κ³ κ°μ νκ³ , κ° νλͺ©μ ν€κ° μΈλ±μ€μΈ κ²½μ°: A(key=0), B(key=1), C(key=2). μ¬κΈ°μ Bκ° μμ λλ©΄ 리μ€νΈλ [A, C]κ° λκ³ , ν€λ A(key=0), C(key=1)λ‘ λ°λλλ€. μλ Cμ ν€λ 2μλλ°, μ΄μ 1λ‘ λ°λμμ΅λλ€. Reactλ ν€λ₯Ό κΈ°μ€μΌλ‘ νλͺ©μ μλ³νλ―λ‘, Cκ° μλ‘μ΄ νλͺ©μΈμ§, κΈ°μ‘΄ νλͺ©μΈμ§ νΌλμ€λ¬μν μ μμ΅λλ€. μ΄λ‘ μΈν΄ λΆνμν 리λ λλ§μ΄ λ°μνκ±°λ μν(state)κ° μλ±ν νλͺ©μ μ°κ²°λ μ μμ΅λλ€.
κ°μ 리μ€νΈ [A, B, C]μμ μμκ° [B, A, C]λ‘ λ°λμλ€κ³ ν΄λ΄ μλ€.
μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ©΄: μλλ A(key=0), B(key=1), C(key=2)μμ§λ§, μ΄μ B(key=0), A(key=1), C(key=2)κ° λ©λλ€.
React μ μ₯μμλ ν€ 0μ΄ Aμμ Bλ‘, ν€ 1μ΄ Bμμ Aλ‘ λ°λ κ²μΌλ‘ 보μ λλ€. μ΄λ νλͺ© μμ²΄κ° λ°λμ§ μμμμλ λΆκ΅¬νκ³ Reactκ° μ΄λ₯Ό μλ‘μ΄ νλͺ©μΌλ‘ μ€ν΄νκ² λ§λ€μ΄, DOMμ λΆνμνκ² μ λ°μ΄νΈνκ±°λ μ»΄ν¬λνΈμ μν(μ: μ λ ₯ νλ κ°)λ₯Ό μλͺ»λ νλͺ©μ μ°κ²°ν μ μμ΅λλ€.
리μ€νΈ νλͺ©μ΄ μν(μ: 체ν¬λ°μ€ μ ν μ¬λΆ)λ₯Ό κ°μ§κ³ μλ€λ©΄, μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ©΄ νλͺ©μ μμΉκ° λ°λ λ μνκ° μλ±ν νλͺ©μ λΆμ μ μμ΅λλ€. μλ₯Ό λ€μ΄, Aμ 체ν¬κ° λμ΄ μμλλ° μμκ° λ°λλ©΄ 체ν¬κ° Bλ‘ μ΄λν΄λ²λ¦¬λ λ¬Έμ κ° μκΈΈ μ μμ΅λλ€.
μλ₯Ό λ€μ΄, [A, B, C]λΌλ 리μ€νΈκ° μλ€κ³ κ°μ νκ³ , κ° νλͺ©μ ν€κ° μΈλ±μ€μΈ κ²½μ°: A(key=0), B(key=1), C(key=2). μ¬κΈ°μ Bκ° μμ λλ©΄ 리μ€νΈλ [A, C]κ° λκ³ , ν€λ A(key=0), C(key=1)λ‘ λ°λλλ€. μλ Cμ ν€λ 2μλλ°, μ΄μ 1λ‘ λ°λμμ΅λλ€. Reactλ ν€λ₯Ό κΈ°μ€μΌλ‘ νλͺ©μ μλ³νλ―λ‘, Cκ° μλ‘μ΄ νλͺ©μΈμ§, κΈ°μ‘΄ νλͺ©μΈμ§ νΌλμ€λ¬μν μ μμ΅λλ€. μ΄λ‘ μΈν΄ λΆνμν 리λ λλ§μ΄ λ°μνκ±°λ μν(state)κ° μλ±ν νλͺ©μ μ°κ²°λ μ μμ΅λλ€.
κ°μ 리μ€νΈ [A, B, C]μμ μμκ° [B, A, C]λ‘ λ°λμλ€κ³ ν΄λ΄ μλ€.
μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ©΄: μλλ A(key=0), B(key=1), C(key=2)μμ§λ§, μ΄μ B(key=0), A(key=1), C(key=2)κ° λ©λλ€.
React μ μ₯μμλ ν€ 0μ΄ Aμμ Bλ‘, ν€ 1μ΄ Bμμ Aλ‘ λ°λ κ²μΌλ‘ 보μ λλ€. μ΄λ νλͺ© μμ²΄κ° λ°λμ§ μμμμλ λΆκ΅¬νκ³ Reactκ° μ΄λ₯Ό μλ‘μ΄ νλͺ©μΌλ‘ μ€ν΄νκ² λ§λ€μ΄, DOMμ λΆνμνκ² μ λ°μ΄νΈνκ±°λ μ»΄ν¬λνΈμ μν(μ: μ λ ₯ νλ κ°)λ₯Ό μλͺ»λ νλͺ©μ μ°κ²°ν μ μμ΅λλ€.
리μ€νΈ νλͺ©μ΄ μν(μ: 체ν¬λ°μ€ μ ν μ¬λΆ)λ₯Ό κ°μ§κ³ μλ€λ©΄, μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ©΄ νλͺ©μ μμΉκ° λ°λ λ μνκ° μλ±ν νλͺ©μ λΆμ μ μμ΅λλ€. μλ₯Ό λ€μ΄, Aμ 체ν¬κ° λμ΄ μμλλ° μμκ° λ°λλ©΄ 체ν¬κ° Bλ‘ μ΄λν΄λ²λ¦¬λ λ¬Έμ κ° μκΈΈ μ μμ΅λλ€.
μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ©΄ 리μ€νΈμ νλͺ©μ΄ μΆκ°λκ±°λ μμ λ λ ν€ κ°μ΄ λ€μ λ³κ²½λκΈ° λλ¬Έμ λ¬Έμ κ° λ°μν©λλ€. μΈλ±μ€λ νλͺ©μ λ³Έμ§μ μΈ κ³ μ μ±μ λνλ΄λ κ²μ΄ μλλΌ λ¨μν 리μ€νΈ λ΄μμμ μμΉλ§μ λνλ΄κΈ° λλ¬Έμ λλ€. Reactλ ν€λ₯Ό ν΅ν΄ "μ΄ νλͺ©μ΄ μ΄μ κ³Ό λμΌν νλͺ©μΈκ°?"λ₯Ό νλ¨νλλ°, μΈλ±μ€λ κ·Έ κΈ°μ€μΌλ‘ λΆμ ν©ν©λλ€.
μ΄ λ¬Έμ λ₯Ό νΌνλ €λ©΄ 리μ€νΈ λ΄μμ κ³ μ νκ³ μμ μ μΈ κ°(μ: λ°μ΄ν°λ² μ΄μ€μ ID, UUID λ±)μ ν€λ‘ μ¬μ©ν΄μΌ ν©λλ€.
const items = [ { id: "a1", name: "A" }, { id: "b2", name: "B" }, { id: "c3", name: "C" } ]; return ( <ul> {items.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> );
μ΄λ κ² νλ©΄ μμκ° λ°λκ±°λ νλͺ©μ΄ μΆκ°/μμ λμ΄λ idλ λ³νμ§ μμΌλ―λ‘ Reactκ° κ° νλͺ©μ μ νν μΆμ ν μ μμ΅λλ€.