# [[Reactivity System (ref, reactive)]] ## πŸ“Œ Brief Summary Vue 3의 Composition APIμ—μ„œ μ œκ³΅ν•˜λŠ” **`ref`와 `reactive`λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ°˜μ‘ν˜• μƒνƒœ(Reactive State)λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 핡심 도ꡬ**이닀 [1]. `ref`λŠ” λ¬Έμžμ—΄, μˆ«μžμ™€ 같은 μ›μ‹œ κ°’λΆ€ν„° κ°μ²΄κΉŒμ§€ λ‹€μ–‘ν•œ 데이터 νƒ€μž…μ„ μ§€μ›ν•˜λ©°, `.value` 속성을 톡해 데이터에 μ ‘κ·Όν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•œλ‹€ [1]. `reactive`λŠ” 주둜 객체, λ°°μ—΄, μ»¬λ ‰μ…˜ ꡬ쑰λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 νŠΉν™”λ˜μ–΄ 있으며, `.value` ν”„λ‘œνΌν‹° 없이 속성에 직접 μ ‘κ·Όν•  수 μžˆλ‹€ [2]. 이 λ°˜μ‘μ„± μ‹œμŠ€ν…œμ€ 데이터 λ³€κ²½ μ‹œ UIλ₯Ό μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜μ—¬ λΉ λ₯΄κ³  λΆ€λ“œλŸ¬μš΄ μ‚¬μš©μž μΈν„°λž™μ…˜μ„ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€ [1]. ## πŸ“– Core Content * **λ°˜μ‘μ„±(Reactivity) 기초:** Vue 3λŠ” `ref()`와 `reactive()` ν•¨μˆ˜λ₯Ό 톡해 λ°˜μ‘ν˜• μƒνƒœλ₯Ό 직관적이고 효율적으둜 관리할 수 μžˆλ„λ‘ μ§€μ›ν•œλ‹€ [1]. κ³Όκ±° Options API의 `data()` μ˜΅μ…˜μ΄ λ°˜ν™˜ν•˜λŠ” 객체 μ—­μ‹œ λ‚΄λΆ€μ μœΌλ‘œλŠ” `reactive()` ν•¨μˆ˜λ₯Ό 톡해 λ°˜μ‘μ„±μ΄ λΆ€μ—¬λ˜μ—ˆλ‹€ [3]. * **`ref()`의 μœ μ—°μ„±:** `ref()`λŠ” λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έκ³Ό 같은 μ›μ‹œκ°’(Primitive values)뿐만 μ•„λ‹ˆλΌ 객체 λ“± 거의 λͺ¨λ“  데이터 νƒ€μž…μ— μ‚¬μš©ν•  수 μžˆλŠ” 맀우 λ‹€λͺ©μ μΈ μƒνƒœ 관리 방법이닀 [1, 4]. 이 ν•¨μˆ˜λŠ” `.value` 속성을 κ°€μ§„ 래퍼 객체λ₯Ό μƒμ„±ν•˜μ—¬ 데이터에 μ ‘κ·Όν•˜κ²Œ ν•˜μ§€λ§Œ, ν…œν”Œλ¦Ώ(Template) λ‚΄μ—μ„œλŠ” `.value`λ₯Ό λͺ…μ‹œν•  ν•„μš” 없이 μžλ™μœΌλ‘œ μ–Έλž˜ν•‘(Unwrapping)λœλ‹€(단, μ€‘μ²©λœ refλŠ” μ˜ˆμ™Έ) [1, 4]. * **`reactive()`의 ꡬ쑰화:** `reactive()`λŠ” 주둜 객체, λ°°μ—΄, Map, Setκ³Ό 같은 μ»¬λ ‰μ…˜μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ„€κ³„λ˜μ—ˆλ‹€ [2, 4]. `.value`λ₯Ό μ‚¬μš©ν•  ν•„μš” 없이 λ‚΄λΆ€ ν”„λ‘œνΌν‹°μ— 직접 μ ‘κ·Όν•  수 μžˆμ–΄, λ³΅μž‘ν•œ 데이터 ꡬ쑰λ₯Ό λ‹€λ£° λ•Œ ꡬ쑰적으둜 더 직관적인 관리가 κ°€λŠ₯ν•˜λ‹€ [2]. * **κΈ€λ‘œλ²Œ μƒνƒœ κ΄€λ¦¬λ‘œμ˜ ν™•μž₯:** μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅μœ ν•΄μ•Ό ν•˜λŠ” μƒνƒœκ°€ μžˆλ‹€λ©΄, `reactive()`λ‚˜ `ref()`둜 μƒμ„±ν•œ λ°˜μ‘ν˜• μƒνƒœλ₯Ό μ™ΈλΆ€ 파일둜 μΆ”μΆœν•˜μ—¬ ν•„μš”ν•œ κ³³μ—μ„œ μž„ν¬νŠΈν•΄ 단일 μ§„μ‹€ 곡급원(Single source of truth)으둜 ν™œμš©ν•  μˆ˜λ„ μžˆλ‹€ [3, 5]. * **Vue 3.5의 λ°˜μ‘μ„± μ‹œμŠ€ν…œ μ΅œμ ν™”:** μ΅œμ‹  Vue 3.5 λ²„μ „μ—μ„œλŠ” λ°˜μ‘μ„± μ‹œμŠ€ν…œ 엔진이 λŒ€λŒ€μ μœΌλ‘œ λ¦¬νŒ©ν† λ§λ˜μ—ˆλ‹€ [6-8]. κ·Έ κ²°κ³Ό, **λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ•½ 56% κ°μ†Œ**ν•˜μ˜€μœΌλ©°, 크고 κΉŠμ€ λ°˜μ‘ν˜• 배열에 λŒ€ν•œ μž‘μ—… 속도가 **μ΅œλŒ€ 10λ°°κΉŒμ§€ ν–₯상**λ˜μ–΄ λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œμ˜ 데이터 처리 효율이 κ·ΉλŒ€ν™”λ˜μ—ˆλ‹€ [7, 8]. ## βš–οΈ Trade-offs & Caveats * **`ref`와 `reactive`의 선택 μ œμ•½:** `reactive`의 κ³ μœ ν•œ ν•œκ³„λ“€λ‘œ 인해, κ³΅μ‹μ μœΌλ‘œλŠ” μƒνƒœλ₯Ό μ„ μ–Έν•  λ•Œ **`ref()`λ₯Ό μ£Όμš” API둜 μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯**λœλ‹€ [2]. * **μ›μ‹œκ°’μ— `reactive` μ‚¬μš© κΈˆμ§€:** `reactive`λ₯Ό λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ 같은 μ›μ‹œκ°’μ— μ‚¬μš©ν•  경우 ν”„λ ˆμž„μ›Œν¬μ˜ λ°˜μ‘μ„± 연결이 νŒŒκ΄΄λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€ [4]. * **ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή(Destructuring) μ‹œμ˜ λ°˜μ‘μ„± 상싀:** `reactive`둜 μƒμ„±λœ 객체의 속성을 직접 ꡬ쑰 λΆ„ν•΄ ν• λ‹Ήν•  경우 ν•΄λ‹Ή 속성과 원본 λ°˜μ‘ν˜• 객체 κ°„μ˜ λ°˜μ‘μ„± 연결이 λŠμ–΄μ§„λ‹€ [4]. 이λ₯Ό λ°©μ§€ν•˜λ €λ©΄ ν”„λ‘œνΌν‹°μ— 직접 μ ‘κ·Όν•˜μ—¬ μ‚¬μš©ν•˜κ±°λ‚˜, `toRefs()` μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜μ‘μ„±μ„ μœ μ§€ν•œ 채 ꡬ쑰 λΆ„ν•΄ 할당을 μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€ [4]. * **SSR(μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§) ν™˜κ²½μ—μ„œμ˜ μƒνƒœ λˆ„μˆ˜ μœ„ν—˜:** λ°˜μ‘μ„± API둜 λ§Œλ“  μƒνƒœλ₯Ό μ™ΈλΆ€ νŒŒμΌμ—μ„œ κΈ€λ‘œλ²Œ 싱글톀(Global singleton) λ°©μ‹μœΌλ‘œ λ‹¨μˆœ κ³΅μœ ν•  경우, SSR ν™˜κ²½μ—μ„œλŠ” μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ 간에 μƒνƒœκ°€ κ³΅μœ λ˜μ–΄ 데이터 λˆ„μˆ˜λ‚˜ ꡐ차 μ˜€μ—Ό λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€ [5, 9]. 이λ₯Ό λ°©μ§€ν•˜λ €λ©΄ μš”μ²­λ§ˆλ‹€ 독립적인 μŠ€ν† μ–΄ μΈμŠ€ν„΄μŠ€λ₯Ό 보μž₯ν•˜λŠ” **Pinia**와 같은 μƒνƒœ 관리 라이브러리의 λ„μž…μ΄ ν•„μš”ν•˜λ‹€ [9, 10]. ## πŸ”— Knowledge Connections ### Related Concepts #### [μ•„ν‚€ν…μ²˜/기반 기술] - [[Composition API]] - μ—°κ²° 이유: `ref`와 `reactive`λ₯Ό 기반으둜 λ‘œμ§μ„ κΈ°λŠ₯ λ‹¨μœ„λ‘œ κ·Έλ£Ήν™”ν•˜κ³  μ½”λ“œμ˜ ν™•μž₯성을 보μž₯ν•˜λŠ” Vue 3의 핡심 μ•„ν‚€ν…μ²˜ 철학이기 λ•Œλ¬Έμ΄λ‹€ [11, 12]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κΈ°μ‘΄ Options API의 ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κ³  논리적 관심사(Logical concerns)λ₯Ό λΆ„λ¦¬ν•˜λŠ” μ „λž΅μ μΈ 섀계 방식을 이해할 수 μžˆλ‹€ [11, 12]. #### [κ΅¬ν˜„/ν™œμš© 도ꡬ] - [[Composables]] - μ—°κ²° 이유: `ref` 및 `reactive`λ₯Ό ν™œμš©ν•œ μƒνƒœ 기반 λ‘œμ§μ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ…λ¦½λœ μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν•¨μˆ˜λ‘œ μΊ‘μŠν™”ν•˜λŠ” 핡심 νŒ¨ν„΄μ΄κΈ° λ•Œλ¬Έμ΄λ‹€ [13, 14]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ»΄ν¬λ„ŒνŠΈ κ°„ λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(예: 데이터 페칭, 폼 μœ νš¨μ„± 검사)을 μΆ”μΆœν•˜κ³  νƒ€μž… μ•ˆμ „μ„±μ„ μœ μ§€ν•˜λ©° κ³΅μœ ν•˜λŠ” μ‹€μ „ 방법둠을 νŒŒμ•…ν•  수 μžˆλ‹€ [13, 15]. - [[Pinia]] - μ—°κ²° 이유: κΈ°λ³Έ `ref`와 `reactive`λ§ŒμœΌλ‘œλŠ” μ²˜λ¦¬ν•˜κΈ° μ–΄λ €μš΄ νŒ€ ν˜‘μ—…μ˜ λ³΅μž‘μ„±, SSR 지원, DevTools 톡합 등을 ν•΄κ²°ν•΄ μ£ΌλŠ” Vue의 곡식 μ°¨μ„ΈλŒ€ μƒνƒœ 관리 라이브러리이기 λ•Œλ¬Έμ΄λ‹€ [9, 10, 16]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œ κΈ€λ‘œλ²Œ μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ 쀑앙 μ§‘μ€‘ν™”ν•˜κ³  SSR ν™˜κ²½μ—μ„œμ˜ μƒνƒœ μ˜€μ—Ό(State leakage) 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ—”ν„°ν”„λΌμ΄μ¦ˆκΈ‰ νŒ¨ν„΄μ„ 배울 수 μžˆλ‹€ [9, 10]. ### Deeper Research Questions - Vue 3.5μ—μ„œ λ¦¬νŒ©ν† λ§λœ λ°˜μ‘μ„± μ‹œμŠ€ν…œμ€ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ– ν•œ 데이터 ꡬ쑰와 λ©”μ»€λ‹ˆμ¦˜μ„ λ³€κ²½ν•˜μ—¬ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 56% 쀄이고 λ°°μ—΄ μ—°μ‚° 속도λ₯Ό 10λ°° ν–₯μƒμ‹œμΌ°λŠ”κ°€? [7, 8] - `reactive` 객체λ₯Ό ꡬ쑰 λΆ„ν•΄ ν• λ‹Ήν•  λ•Œ λ°˜μ‘μ„±μ΄ λŠμ–΄μ§€λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 레벨의 기술적 원인은 무엇이며, `toRefs()`λŠ” λ‚΄λΆ€μ μœΌλ‘œ 이λ₯Ό μ–΄λ–»κ²Œ ν”„λ‘μ‹œ(Proxy) μ²˜λ¦¬ν•˜μ—¬ λ°˜μ‘μ„±μ„ λ³΅μ›ν•˜λŠ”κ°€? [4] - λŒ€κ·œλͺ¨ μ—”ν„°ν”„λΌμ΄μ¦ˆ ν™˜κ²½μ—μ„œ 단일 μ§„μ‹€ 곡급원(Single source of truth)을 ꡬ좕할 λ•Œ `ref`/`reactive`둜 λ§Œλ“  μ™ΈλΆ€ μŠ€ν† μ–΄λ₯Ό 직접 μ‚¬μš©ν•˜λŠ” 것과 Piniaλ₯Ό λ„μž…ν•˜λŠ” κ²ƒμ˜ μ•„ν‚€ν…μ²˜μ  νŠΈλ ˆμ΄λ“œμ˜€ν”„λŠ” 무엇인가? [5, 9, 10, 16] - SSR(μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§) ν™˜κ²½μ—μ„œ `reactive()` 기반의 κΈ€λ‘œλ²Œ 싱글톀 객체λ₯Ό μ‚¬μš©ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” 데이터 격리 μ‹€νŒ¨(Data Bleeding) μ‹œλ‚˜λ¦¬μ˜€λŠ” ꡬ체적으둜 μ–΄λ– ν•œ ν˜•νƒœλ₯Ό λ λŠ”κ°€? [5, 9] - μ›μ‹œκ°’μ—λŠ” 무쑰건 `ref`λ₯Ό, λ³΅μž‘ν•œ κ°μ²΄μ—λŠ” `reactive`λ₯Ό μ‚¬μš©ν•˜λŠ” 기쑴의 관행을 λ„˜μ–΄μ„œ, κ°œλ°œνŒ€μ˜ μ»¨λ²€μ…˜μœΌλ‘œ 였직 `ref()`λ§Œμ„ μ‚¬μš©ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μž₯점과 μ†μ‹€λ˜λŠ” νŽΈμ˜μ„±μ€ 무엇인가? [2, 4] ### Practical Application Contexts - **Implementation:** 폼 μž…λ ₯의 λ‹¨μˆœ ν…μŠ€νŠΈ μƒνƒœ, UI ν† κΈ€ λ²„νŠΌμ˜ λΆˆλ¦¬μ–Έ μƒνƒœ λ“± μ»΄ν¬λ„ŒνŠΈμ˜ λ‹¨μˆœ μ§€μ—­ μƒνƒœλŠ” `ref`둜 μ„ μ–Έν•˜κ³ , μ„œλ²„μ—μ„œ λ°›μ•„μ˜€λŠ” λ³΅μž‘ν•œ 객체 폼 λͺ¨λΈμ€ `reactive`λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€. ν…œν”Œλ¦Ώμ—μ„œλŠ” 두 경우 λͺ¨λ‘ μ§κ΄€μ μœΌλ‘œ λ°”μΈλ”©ν•˜κ³  슀크립트 λ‚΄λΆ€μ—μ„œλ§Œ `.value`의 λͺ…μ‹œ μ—¬λΆ€λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ½”λ”©ν•œλ‹€. - **System Design:** Composition APIλ₯Ό μ μš©ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ Composable ν•¨μˆ˜ λ‹¨μœ„λ‘œ 뢄리할 λ•Œ, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μƒμ„±ν•œ `ref`와 `reactive` λ³€μˆ˜λ“€μ„ λ°˜ν™˜ν•¨μœΌλ‘œμ¨ λ‹€μ–‘ν•œ μ»΄ν¬λ„ŒνŠΈ λ·°μ—μ„œ ν•΄λ‹Ή μƒνƒœμ™€ λ‘œμ§μ„ 자유둭게 레고 λΈ”λ‘μ²˜λŸΌ μ‘°ν•©ν•˜μ—¬ μž¬μ‚¬μš©ν•˜κ²Œ μ„€κ³„ν•œλ‹€. - **Operation / Maintenance:** λ ˆκ±°μ‹œ Options API μ½”λ“œ 베이슀λ₯Ό Vue 3의 Composition API둜 μ „ν™˜ν•˜κ±°λ‚˜ Vue 3.5둜 ν”„λ ˆμž„μ›Œν¬ 버전을 올릴 경우, 크기가 λ°©λŒ€ν•œ λ°°μ—΄ μ—°μ‚°μ΄λ‚˜ λ³΅μž‘ν•œ μƒνƒœ 객체λ₯Ό λ‹€λ£¨λŠ” κ΄€λ¦¬μž λŒ€μ‹œλ³΄λ“œ λ“±μ˜ λ©”λͺ¨λ¦¬ λΆ€ν•˜μ™€ λ Œλ”λ§ μ„±λŠ₯ 지연을 λ³„λ„μ˜ μ½”λ“œ μˆ˜μ • 없이 μ¦‰κ°μ μœΌλ‘œ κ°œμ„ ν•  수 μžˆλ‹€. - **Learning Path:** Options API의 `data()` μ˜΅μ…˜μ΄ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ `reactive`와 λ§€ν•‘λ˜λŠ”μ§€ μ΄ν•΄ν•œ ν›„, `ref` 및 `reactive`λ₯Ό μ‹œμž‘μœΌλ‘œ `computed`와 `watch`둜 μ΄μ–΄μ§€λŠ” λ°˜μ‘μ„± 기초λ₯Ό μŠ΅λ“ν•œλ‹€. κ·Έ ν›„, 이λ₯Ό Composable νŒ¨ν„΄μœΌλ‘œ ν™•μž₯ν•˜κ³  μ΅œμ’…μ μœΌλ‘œ Piniaλ₯Ό ν†΅ν•œ μ „μ—­ μƒνƒœ κ΄€λ¦¬λ‘œ λ°œμ „ν•΄λ‚˜κ°„λ‹€. - **My Project Relevance:** ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œμ νŠΈ μ•„ν‚€ν…μ²˜ 수립 μ‹œ, μƒνƒœ κ΄€λ¦¬μ˜ κΈ°λ³Έ λ‹¨μœ„μΈ `ref`와 `reactive`의 ν˜Όμš©μ„ 막고, ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή λ“±μ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ•ˆν‹° νŒ¨ν„΄μ„ 사전에 μ°¨λ‹¨ν•˜κΈ° μœ„ν•œ νŒ€ μ½”λ”© μ»¨λ²€μ…˜ 및 린트(Lint) κ·œμΉ™μ„ μ„€μ •ν•˜λŠ” μ§€μΉ¨μœΌλ‘œ ν™œμš©ν•  수 μžˆλ‹€. ### Adjacent Topics - [[Computed Properties & Watchers]] - ν™•μž₯ λ°©ν–₯: λ°˜μ‘ν˜• μƒνƒœ(`ref`, `reactive`)의 λ³€ν™”λ₯Ό κ°μ§€ν•˜μ—¬ νŒŒμƒλœ μƒνƒœλ₯Ό μžλ™μœΌλ‘œ κ³„μ‚°ν•˜κ±°λ‚˜, μ™ΈλΆ€ 데이터 페칭 λ“± μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ(Side Effects)λ₯Ό μ‹€ν–‰ν•˜λŠ” νŒŒμƒν˜• λ°˜μ‘μ„± 관리 νŒ¨ν„΄μœΌλ‘œ ν•™μŠ΅μ„ ν™•μž₯ν•œλ‹€. - [[React Hooks (useState, useEffect)]] - ν™•μž₯ λ°©ν–₯: 타 ν”„λ ˆμž„μ›Œν¬μΈ React의 핡심 ν›…κ³Ό Vue의 λ°˜μ‘μ„± μ‹œμŠ€ν…œμ„ μ•„ν‚€ν…μ²˜ κ΄€μ μ—μ„œ λŒ€μ‘° λΆ„μ„ν•˜μ—¬, λΆˆλ³€μ„±(Immutability) 기반의 React μƒνƒœ 관리와 ν”„λ‘μ‹œ(Proxy) 기반의 Vue λ°˜μ‘μ„± 철학이 ν”„λ ˆμž„μ›Œν¬ νŒ¨ν„΄μ— λ―ΈμΉ˜λŠ” 영ν–₯을 비ꡐ μ—°κ΅¬ν•œλ‹€. --- *Last updated: 2026-05-03*