본문 바로가기
Front-end

[Vue.js] v-model 없이도 양방향처럼? 단방향(v-bind)과 양방향(v-model) 바인딩 개념, 체크박스 예시

by yseee 2025. 4. 13.

공부하면서 헷갈렸던 개념 중 하나가 단방향 바인딩과 양방향 바인딩이었습니다.
처음에는 데이터를 주고받는 구조면 다 양방향 바인딩(v-model)인 줄 알았는데,
단방향(v-bind)에 이벤트를 추가해서 양방향처럼 보이게 만들 수도 있다는 걸 알게 되었습니다.

 

이 글에서는 Vue에서의 v-bind와 v-model의 차이를

체크박스 예제를 통해 간단히 정리해 보았습니다.


1. 단방향 바인딩이란? (v-bind)

단방향 바인딩은 데이터가 한 방향(부모->자식)으로만 흐르는 구조입니다.
Vue에서는 v-bind나 :를 사용하여 속성에 데이터를 전달합니다.

<img :src="imageUrl" />

 

imageUrl 값이 바뀌면 이미지가 바뀌지만,

사용자가 이미지를 클릭하거나 수정해도 imageUrl은 자동으로 바뀌지 않습니다.

 

2. 양방향 바인딩이란? (v-model)

양방향 바인딩은 데이터가 양쪽으로 오고 가는 구조입니다.
즉, 상태가 바뀌면 화면이 바뀌고, 화면에서 입력하면 다시 상태가 바뀝니다.

Vue에서는 v-model 디렉티브가 대표적인 양방향 바인딩입니다.

<input v-model="userInput" />

 

사용자가 값을 바꾸면 데이터가 같이 바뀌기 때문에

주로 input, checkbox, select 같은 폼 요소에서 많이 쓰입니다.

 

3. 언제 어떤 걸 써야 할까?

  • 단순한 값 전달이라면? v-bind
  • 사용자 입력이 필요하다면? v-model

 

4. 체크박스 예시로 이해하는 바인딩 방식

저는 체크박스 예제를 보다가 개념이 헷갈리기 시작했습니다.

체크박스는 양방향이니까 무조건 v-model을 써야 한다고 생각했는데,

단방향 바인딩에 이벤트 처리를 조합해서 구현하는 방식도 있다는 걸 알게 됐습니다.

 

1) v-model 사용 (양방향 바인딩)

<input type="checkbox" v-model="isChecked" />
  • isChecked 값이 true/false로 자동으로 연결
  • 체크하거나 해제하면 값이 자동으로 바뀜
  • 반대로 isChecked 값을 바꾸면 체크 상태도 반영됨

 

2) :checked + @change 사용 (단방향 + 수동 이벤트 처리)

<input type="checkbox" :checked="isChecked" @change="isChecked = $event.target.checked" />
  • 체크박스 상태는 isChecked를 읽기만 함
  • 체크해도 isChecked는 자동으로 안 바뀜
  • 그래서 @change 이벤트로 직접 갱신해야 함

 

- 비교 요약표

항목 v-model :checked + @change
바인딩 방향 양방향 단방향
값 자동 변경 O X
코드 간결성 간결함 직접 처리 필요
사용 예 대부분의 경우 커스터마이징 필요 시
vue 내부 처리 자동 수동

 

3) 겉보기엔 똑같지만, 내부 동작은 다르다

결과는 같지만, Vue 내부에서는 완전히 다른 방식으로 적용됩니다.

  • v-model → Vue가 :checked와 @change 처리를 자동으로 해줌
  • :checked + @change → 우리가 직접 값 변경 코드를 작성해야 함
 

4) 실무에서는?

단방향 바인딩 + 이벤트 처리는 특별한 경우(복잡한 커스터마이징 등)를 제외하면 잘 사용되지 않는 것 같습니다.

대부분의 경우, 간단하고 직관적인 v-model을 사용하는 것이 좋다고 합니다!