안녕하세요, 코딩하는곰입니다! 😊
Vue.js를 사용하면서 한 번쯤은 꼭 마주치는 질문이 있습니다. “왜 data는 객체가 아닌 함수로 반환해야 할까?” 오늘은 이 질문에 대한 깊이 있는 답변과 함께, Vue 컴포넌트 설계의 핵심 원리를 파헤쳐보겠습니다. 20년 넘게 Vue.js와 Angular를 다루며 얻은 노하우를 여러분과 공유할게요!
Vue에서 data를 함수로 정의하는 것은 단순한 문법 규칙이 아닌 컴포넌트 재사용성의 핵심 메커니즘입니다. 객체 리터럴 대신 함수를 사용할 때 발생하는 마법을 코드로 비교해볼게요.
// ❌ 문제 발생 케이스 (객체 리터럴)data: {count: 0}// ✅ 올바른 사용법 (함수 반환)data() {return {count: 0}}
첫 번째 방식으로 여러 컴포넌트를 생성하면 모든 인스턴스가 동일한 count 객체를 공유하게 됩니다. 반면 함수 방식은 각 인스턴스마다 새로운 데이터 객체를 생성하므로, 한 컴포넌트의 상태 변경이 다른 컴포넌트에 영향을 주지 않습니다. 이는 Vue의 반응성 시스템이 작동하는 방식과 깊은 연관이 있습니다.
💡 개발 프로젝트 아이디어가 필요하다면, (자바 기초) this 키워드 완벽 가이드 - 현재 객체 참조의 모든 것를 참고해보세요.
// 공유 상태로 인한 버그 예시const SharedData = { value: 1 }Vue.component('problem-component', {data: () => SharedData,template: `<button @click="value++">{{ value }}</button>`})
이 경우 모든 problem-component는 동일한 value를 공유해 버튼을 클릭할 때 예상치 못한 동작이 발생합니다.
제품 포장이나 명함에 삽입할 QR 코드를 만들고 싶다면, 로고 삽입과 색상 설정이 가능한 QR 코드 생성기를 활용해보세요.
data() {return {complexObj: JSON.parse(JSON.stringify(기본_객체))}}
export default {data: (() => {const privateCounter = 0return {get count() { return privateCounter },increment() { privateCounter++ }}})()}
📅 다양한 문화행사를 한눈에 보고 싶다면, 아라뱃길 카약축제를 참고해보세요.
오늘 살펴본 내용이 Vue.js의 핵심 원리를 이해하는 데 도움이 되셨나요? 컴포넌트 기반 아키텍처에서 상태 격리는 시스템의 안정성을 보장하는 첫걸음입니다. 다음 포스팅에서는 이 개념을 확장해 Vue 3의 Composition API에서의 반응성 시스템을 깊이 있게 다룰 예정이에요!
궁금한 점이 있다면 댓글로 남겨주세요. 여러분의 Vue.js 여정을 응원합니다! 🐾
(코딩하는곰의 Vue.js 시리즈는 매주 금요일 업데이트됩니다. 다음 주제는 “Composition API vs Options API 실전 비교”입니다.)
매일 두뇌 훈련을 위한 스도쿠를 풀고 싶다면, 클래식과 스토리 모드를 모두 제공하는 스도쿠 저니를 다운로드하세요.
