안녕하세요, 코딩하는곰입니다! Vue.js를 사용하면서 가장 자주 마주치게 되는 v-model 디렉티브, 정말 강력하고 편리하지 않나요? 오늘은 이 v-model이 어떻게 양방향 바인딩을 구현하는지, input, checkbox, select 등 다양한 폼 요소에 어떻게 적용하는지 깊이 있게 파헤쳐보겠습니다. Vue 개발자라면 꼭 알아야 할 v-model의 모든 것을 이 글에서 확인해보세요.
Vue.js에서 v-model 디렉티브는 폼 입력 요소와 애플리케이션 데이터 사이의 양방향 바인딩을 구현하는 핵심 기능입니다. 단방향 데이터 흐름을 기본으로 하는 Vue에서 특별하게 양방향 바인딩을 제공하는 것이죠.
v-model은本质上 syntactic sugar입니다. 즉, 더 편리한 문법을 제공하는 것이죠. 다음 두 코드는 완전히 동일하게 동작합니다:
// v-model 사용<input v-model="message" placeholder="메시지를 입력하세요">// v-model을 수동으로 구현<input:value="message"@input="message = $event.target.value"placeholder="메시지를 입력하세요"
v-model은 내부적으로 value 속성을 바인딩하고 input 이벤트를 청취하는 방식으로 작동합니다. 사용자가 입력할 때마다 input 이벤트가 발생하고, 이벤트의 값으로 데이터가 업데이트되는 구조입니다.
가장 기본적인 사용법은 text input에서의 적용입니다:
<template><div><input v-model="username" type="text" placeholder="사용자 이름"><p>입력된 이름: {{ username }}</p></div></template><script>export default {data() {return {username: ''}}}</script>
이 예제에서 사용자가 input 필드에 텍스트를 입력할 때마다 username 데이터가 실시간으로 업데이트되고, 동시에 화면에 표시되는 내용도 변경됩니다.
📱 앱 개발에 도전하고 싶다면, (React) useState로 배열 삭제하기 - filter 함수 활용 가이드를 참고해보세요.
체크박스는 단일 값과 배열 값 모두에서 사용할 수 있어 상황에 맞게 적용해야 합니다.
<template><div><input type="checkbox" id="agree" v-model="isAgreed"><label for="agree">이용약관에 동의합니다</label><p>동의 상태: {{ isAgreed ? '동의함' : '동의하지 않음' }}</p></div></template><script>export default {data() {return {isAgreed: false}}}</script>
<template><div><h3>관심 기술 선택</h3><input type="checkbox" id="vue" value="Vue.js" v-model="selectedSkills"><label for="vue">Vue.js</label><input type="checkbox" id="react" value="React" v-model="selectedSkills"><label for="react">React</label><input type="checkbox" id="angular" value="Angular" v-model="selectedSkills"><label for="angular">Angular</label><p>선택된 기술: {{ selectedSkills }}</p></div></template><script>export default {data() {return {selectedSkills: []}}}</script>
셀렉트 박스는 단일 선택과 다중 선택 모두에서 v-model을 효과적으로 사용할 수 있습니다.
<template><div><select v-model="selectedCity"><option disabled value="">도시를 선택하세요</option><option>서울</option><option>부산</option><option>대구</option><option>인천</option></select><p>선택된 도시: {{ selectedCity }}</p></div></template><script>export default {data() {return {selectedCity: ''}}}</script>
<template><div><select v-model="selectedHobbies" multiple><option>독서</option><option>운동</option><option>음악</option><option>여행</option><option>요리</option></select><p>선택된 취미: {{ selectedHobbies }}</p></div></template><script>export default {data() {return {selectedHobbies: []}}}</script>
<template><div><select v-model="selectedUser"><option v-for="user in users" :key="user.id" :value="user">{{ user.name }} ({{ user.email }})</option></select><div v-if="selectedUser"><p>선택된 사용자: {{ selectedUser.name }}</p><p>이메일: {{ selectedUser.email }}</p></div></div></template><script>export default {data() {return {selectedUser: null,users: [{ id: 1, name: '김철수', email: 'cheolsu@example.com' },{ id: 2, name: '이영희', email: 'younghi@example.com' },{ id: 3, name: '박민수', email: 'minsu@example.com' }]}}}</script>
두뇌 건강을 위한 재미있는 퍼즐 게임이 필요하다면, 크립토 할아버지의 지혜가 담긴 스도쿠 저니를 설치해보세요.
Vue.js는 v-model에 사용할 수 있는 유용한 수식어들을 제공합니다.
기본적으로 v-model은 input 이벤트에 반응하지만, .lazy 수식어를 사용하면 change 이벤트에 반응하도록 변경할 수 있습니다.
<template><div><!-- 입력할 때마다 즉시 반응 --><input v-model="instantValue" placeholder="즉시 반응"><p>즉시 값: {{ instantValue }}</p><!-- 포커스를 잃을 때 반응 --><input v-model.lazy="lazyValue" placeholder="늦은 반응"><p>늦은 값: {{ lazyValue }}</p></div></template>
사용자 입력을 자동으로 숫자로 변환해줍니다.
<template><div><input v-model.number="age" type="number" placeholder="나이를 입력하세요"><p>입력된 나이 타입: {{ typeof age }}</p><p>입력된 나이: {{ age }}</p></div></template><script>export default {data() {return {age: null}}}</script>
입력값의 앞뒤 공백을 자동으로 제거합니다.
<template><div><input v-model.trim="trimmedValue" placeholder="공백 제거 테스트"><p>원 본 값: "{{ trimmedValue }}"</p><p>길이: {{ trimmedValue.length }}</p></div></template>
Vue 2.x와 Vue 3에서 커스텀 컴포넌트에 v-model을 구현하는 방법이 다릅니다.
// CustomInput.vue<template><input:value="value"@input="$emit('input', $event.target.value)"v-bind="$attrs"></template><script>export default {name: 'CustomInput',props: ['value']}</script>// 사용하는 부모 컴포넌트<template><div><CustomInput v-model="customValue" /><p>커스텀 입력값: {{ customValue }}</p></div></template>
// CustomInput.vue<template><input:value="modelValue"@input="$emit('update:modelValue', $event.target.value)"v-bind="$attrs"></template><script>export default {name: 'CustomInput',props: ['modelValue'],emits: ['update:modelValue']}</script>// 사용하는 부모 컴포넌트<template><div><CustomInput v-model="customValue" /><p>커스텀 입력값: {{ customValue }}</p></div></template>
다양한 v-model 활용법을 종합한 실전 예제를 살펴보겠습니다.
<template><div class="signup-form"><h2>회원가입</h2><!-- 기본 입력 필드 --><div class="form-group"><label>이름:</label><input v-model.trim="form.name" type="text" placeholder="이름을 입력하세요"></div><!-- 이메일 with .lazy --><div class="form-group"><label>이메일:</label><input v-model.lazy="form.email" type="email" placeholder="이메일을 입력하세요"></div><!-- 나이 with .number --><div class="form-group"><label>나이:</label><input v-model.number="form.age" type="number" min="0" placeholder="나이를 입력하세요"></div><!-- 체크박스 그룹 --><div class="form-group"><label>관심사:</label><div><input type="checkbox" id="coding" value="코딩" v-model="form.interests"><label for="coding">코딩</label><input type="checkbox" id="design" value="디자인" v-model="form.interests"><label for="design">디자인</label><input type="checkbox" id="music" value="음악" v-model="form.interests"><label for="music">음악</label></div></div><!-- 셀렉트 --><div class="form-group"><label>직업:</label><select v-model="form.job"><option disabled value="">직업을 선택하세요</option><option>개발자</option><option>디자이너</option><option>기획자</option><option>기타</option></select></div><!-- 약관 동의 --><div class="form-group"><input type="checkbox" id="agree" v-model="form.agreed"><label for="agree">이용약관에 동의합니다</label></div><!-- 폼 데이터 표시 --><div class="form-data"><h3>입력된 데이터:</h3><pre>{{ JSON.stringify(form, null, 2) }}</pre></div></div></template><script>export default {data() {return {form: {name: '',email: '',age: null,interests: [],job: '',agreed: false}}}}</script><style scoped>.form-group {margin-bottom: 1rem;}label {display: block;margin-bottom: 0.5rem;font-weight: bold;}input[type="text"],input[type="email"],input[type="number"],select {width: 100%;padding: 0.5rem;border: 1px solid #ccc;border-radius: 4px;}.form-data {margin-top: 2rem;padding: 1rem;background-color: #f5f5f5;border-radius: 4px;}</style>
기억력과 집중력을 향상시키고 싶다면, 다양한 모드로 구성된 스도쿠 저니를 활용해보세요.
Vue.js의 v-model은 정말 강력하면서도 직관적인 기능이죠. 오늘我们一起 input, checkbox, select 등 다양한 요소에서 v-model을 어떻게 활용하는지, 그리고 고급 기법들과 모범 사례들을 자세히 알아보았습니다. v-model을 효과적으로 사용하면 더 깔끔하고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 여러분도 오늘 배운 내용을 프로젝트에 바로 적용해보세요! 궁금한 점이 있으면 언제든지 댓글로 질문해주시면 답변드리겠습니다. 다음 시간에는 Vue의 또 다른 강력한 기능을 가지고 찾아오겠습니다. 코딩하는곰이었습니다. 감사합니다!
🍵 면역력과 활력을 챙기고 싶다면 한 번쯤 확인해볼, MK-7 비타민K2&비타민D3를 참고해보세요.
