# [[Options API]] ## ๐Ÿ“Œ Brief Summary Options API๋Š” Vue.js์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ์™€ ๋กœ์ง์„ `data()`, `methods`, `computed`์™€ ๊ฐ™์€ ์ •ํ•ด์ง„ ์˜ต์…˜(options) ๋ธ”๋ก ๊ธฐ๋ฐ˜์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ์กฐ์งํ™”ํ•˜๋Š” ์ „ํ†ต์ ์ธ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ๋ฐฉ์‹์ด๋‹ค [1-3]. ์ด ๋ฐฉ์‹์€ ์–•์€ ํ•™์Šต ๊ณก์„ ๊ณผ ๋ช…ํ™•ํ•˜๊ณ  ์„ ์–ธ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋•๋Š”๋‹ค [1, 4]. ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณด๋‹ค๋Š” ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘์ด๋‚˜ ์ž‘๊ณ  ๋‹จ์ˆœํ•œ ๋‹จ์ผ ๊ธฐ๋Šฅ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ด์ƒ์ ์ด๊ณ  ์ ‘๊ทผํ•˜๊ธฐ ์‰ฌ์šด ํŒจํ„ด์œผ๋กœ ํ‰๊ฐ€๋ฐ›๋Š”๋‹ค [1, 4]. ## ๐Ÿ“– Core Content * **์˜ต์…˜ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์กฐ์งํ™”**: Options API๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๊ธฐ๋Šฅ(feature) ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ์—ญํ• ๊ณผ ์˜ต์…˜(`data`, `methods` ๋“ฑ)์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค [1, 3]. ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ๋ฐ˜์‘ํ˜• ๋ฐ์ดํ„ฐ๋Š” `data()` ์˜ต์…˜์„ ํ†ตํ•ด ์„ ์–ธ๋˜๋ฉฐ, Vue ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” `reactive()` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค [2]. * **์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ๋ฐ ์ดˆ๊ธฐ ํ•™์Šต์— ์ตœ์ ํ™”**: ์–•์€ ํ•™์Šต ๊ณก์„ (Shallow learning curve)์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด Vue.js ์ž…๋ฌธ์ž์—๊ฒŒ ํ›Œ๋ฅญํ•œ ์ง„์ž…์ (entry point) ์—ญํ• ์„ ํ•œ๋‹ค [1, 4]. ๋˜ํ•œ, ๊ตฌ์กฐ๊ฐ€ ์„ ์–ธ์ ์ด๊ณ  ๋ช…ํ™•ํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ์‹ ์†ํ•œ ํ”„๋กœํ† ํƒ€์ดํ•‘์„ ์ง„ํ–‰ํ•  ๋•Œ ์ง๊ด€์ ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค [4]. * **๋กœ์ง ์žฌ์‚ฌ์šฉ ๋ฐฉ์‹**: Options API ํ™˜๊ฒฝ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ƒํƒœ ๊ธฐ๋ฐ˜ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ฃผ๋กœ ๋ฏน์Šค์ธ(Mixins)์„ ํ™œ์šฉํ•œ๋‹ค [1]. ์ด๋Š” Composition API๊ฐ€ ์ปดํฌ์ €๋ธ”(Composables)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋Œ€์กฐ๋œ๋‹ค [1]. * **๋‹จ์ผ ๊ธฐ๋Šฅ ์ปดํฌ๋„ŒํŠธ์— ์ ํ•ฉ**: ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋‚ฎ๊ณ  ์ž‘๊ณ  ๋‹จ์ˆœํ•˜๋ฉฐ ๋‹จ์ผ ๊ธฐ๋Šฅ(single-feature)์— ์ง‘์ค‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ตœ์ ์˜ ์„ ํƒ์ด ๋œ๋‹ค [1]. ## โš–๏ธ Trade-offs & Caveats * **๋ณต์žก์„ฑ ์ฆ๊ฐ€ ์‹œ ์œ ์ง€๋ณด์ˆ˜ ํ•œ๊ณ„**: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋ฉด, ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ๋…ผ๋ฆฌ๊ฐ€ `data`, `methods`, `computed` ๋“ฑ ์—ฌ๋Ÿฌ ์˜ต์…˜์— ์‚ฐ๋ฐœ์ ์œผ๋กœ ํฉ์–ด์ง€๊ฒŒ ๋˜์–ด ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์›Œ์ง„๋‹ค [1, 3, 5]. * **๋ฏน์Šค์ธ(Mixins) ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ**: ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๋ฏน์Šค์ธ์„ ์ ์šฉํ•  ๊ฒฝ์šฐ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฏน์Šค์ธ ๊ฐ„์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถฉ๋Œ(naming collision)์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ถœ์ฒ˜๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•ด์ง€๋Š” ์ˆจ๊ฒจ์ง„ ๋ฐ์ดํ„ฐ(hidden data) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [1, 6]. * **๋ฒˆ๋“ค ํฌ๊ธฐ ๋ฐ ์œ ์—ฐ์„ฑ ์ œ์•ฝ**: Composition API์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌด๊ฑฐ์šด ๋ฒˆ๋“ค ํฌ๊ธฐ(Bigger bundle size)๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ์— ์žˆ์–ด์„œ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง€๋Š”(Less flexible) ๋‹จ์ ์ด ์žˆ๋‹ค [1]. * **TypeScript ์ง€์›์˜ ์•„์‰ฌ์›€**: Options API ํ™˜๊ฒฝ์—์„œ๋„ TypeScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, Composition API๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋›ฐ์–ด๋‚œ ํƒ€์ž… ์ถ”๋ก (Type inference)๊ณผ ์™„๋ฒฝํ•œ ํ˜ธํ™˜์„ฑ์— ๋น„ํ•˜๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ง€์›์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋ถ€์กฑํ•˜๋‹ค [1, 4]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋Œ€์•ˆ ๊ธฐ์ˆ ] - [[Composition API]] - ์—ฐ๊ฒฐ ์ด์œ : Options API์˜ ํ•œ๊ณ„(์ฝ”๋“œ ๋ถ„์ ˆ, ๋ฏน์Šค์ธ ๋ฌธ์ œ ๋“ฑ)๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ Vue 3์˜ ํ•ต์‹ฌ API๋กœ, ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋Œ€์กฐ์ ์ธ ํŒจํ„ด์ด๋‹ค [1, 3]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Options API๊ฐ€ ์™œ ์†Œ๊ทœ๋ชจ์— ์ ํ•ฉํ•˜๊ณ , ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์–ด๋–ค ์ด์œ ๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์ด ํ•„์š”ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์ง„ํ™” ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1, 3]. - [[Reactivity API]] - ์—ฐ๊ฒฐ ์ด์œ : Options API์˜ `data()`๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ˜• ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜(`reactive()`, `ref()`)์ด๋‹ค [2]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vue์˜ ๋ฐ˜์‘์„ฑ ์‹œ์Šคํ…œ์ด ์ปดํฌ๋„ŒํŠธ ๋ชจ๋ธ๊ณผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [2]. #### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„ ์š”์†Œ ๋ฐ ํŒจํ„ด] - [[Mixins]] - ์—ฐ๊ฒฐ ์ด์œ : Options API์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ „ํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด ์˜จ ํ•ต์‹ฌ ๊ตฌํ˜„ ๋ฐฉ์‹์ด๋‹ค [1]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ์ฒด ๋ณ‘ํ•ฉ์„ ํ†ตํ•œ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์˜ ํ•œ๊ณ„์™€ ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถฉ๋Œ ๋ฌธ์ œ์˜ ์›์ธ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1, 6]. ### Deeper Research Questions - Options API์™€ Composition API๋กœ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ๋‚ด๋ถ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ ๋ฐ ๋ฒˆ๋“ค ํฌ๊ธฐ์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? - ๋Œ€๊ทœ๋ชจ Vue ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ์กด Options API ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋ฅผ Composition API๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธํ™˜์„ฑ ์ด์Šˆ๋Š” ๋ฌด์—‡์ธ๊ฐ€? - Options API์—์„œ Mixins๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” '์ด๋ฆ„ ์ถฉ๋Œ(naming collision)'๊ณผ '์ˆจ๊ฒจ์ง„ ๋ฐ์ดํ„ฐ(hidden data)' ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜์  ์šฐํšŒ ๋ฐฉ๋ฒ•์€ ์žˆ๋Š”๊ฐ€? - Options API๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์„ ์–ธ์  ๊ตฌ์กฐ(Declarative structure)๊ฐ€ ์ดˆ๋ณด์ž์˜ ํ•™์Šต ๊ณก์„ ์„ ๋‚ฎ์ถ”๋Š” ์ธ์ง€์ , ์‹ฌ๋ฆฌ์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? - TypeScript๋ฅผ ๋„์ž…ํ•œ ํ™˜๊ฒฝ์—์„œ Options API๊ฐ€ ๊ฐ€์ง€๋Š” ํƒ€์ž… ์ถ”๋ก ์˜ ํ•œ๊ณ„์ ์€ ๋‚ด๋ถ€ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ธฐ์ธํ•˜๋Š”๊ฐ€? ### Practical Application Contexts - **Implementation:** ์ž‘๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋‚ฎ์œผ๋ฉฐ UI ํ‘œํ˜„์—๋งŒ ์ง‘์ค‘ํ•˜๋Š” ๋‹จ์ผ ๊ธฐ๋Šฅ ์ปดํฌ๋„ŒํŠธ(Single-feature component)๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ๋•Œ ์ง๊ด€์ ์ธ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. - **System Design:** ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ž‘๊ณ , ์ฐธ์—ฌํ•˜๋Š” ํŒ€์›๋“ค์ด Vue ์ƒํƒœ๊ณ„์— ์ฒ˜์Œ ์ž…๋ฌธํ•˜์—ฌ ํ•™์Šต ๊ณก์„ ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์˜ ์ดˆ๊ธฐ ๊ธฐ์ค€์œผ๋กœ ์ฑ„ํƒ๋  ์ˆ˜ ์žˆ๋‹ค. - **Operation / Maintenance:** ๊ธฐ์กด Vue 2 ๋˜๋Š” ์ดˆ์ฐฝ๊ธฐ Vue 3๋กœ ์ž‘์„ฑ๋œ ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์„ ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋งˆ์ฃผํ•˜๋Š” ํ•ต์‹ฌ ํŒจํ„ด์ด๋‹ค. - **Learning Path:** Vue.js์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…, ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•, `computed`, `watch` ๋“ฑ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์„ ์ฒ˜์Œ ํ•™์Šตํ•˜๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฐ€์žฅ ํ›Œ๋ฅญํ•œ ์ž…๋ฌธ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค. - **My Project Relevance:** ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†๋Š” ์ •์  ํŽ˜์ด์ง€ ์œ„์ฃผ์˜ ์›น์ด๋‚˜, ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋Š” ์Šคํƒ€ํŠธ์—…์˜ MVP(์ตœ์†Œ ๊ธฐ๋Šฅ ์ œํ’ˆ) ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ ์‹œ ์œ ์šฉํ•œ ์„ ํƒ์ง€๊ฐ€ ๋œ๋‹ค. ### Adjacent Topics - [[State Management (Pinia/Vuex)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: Options API ๊ธฐ๋ฐ˜์˜ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ์ „์—ญ ์ƒํƒœ(Global State)๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ์ฃผ์ž…ํ•˜๊ณ  ๋ณ€์ด(Mutate)์‹œํ‚ฌ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. - [[Vue Single-File Components (SFC)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ•˜๋‚˜์˜ ํŒŒ์ผ(.vue) ์•ˆ์— HTML, CSS, JavaScript(Options API)๊ฐ€ ์‘์ง‘๋˜์–ด ๊ด€๋ฆฌ๋˜๋Š” ๋ทฐ๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ Œ๋”๋ง ๋ฐ ํŒŒ์ผ ๊ตฌ์กฐ ์›๋ฆฌ๋กœ ํ™•์žฅ๋œ๋‹ค. --- *Last updated: 2026-05-03*