안녕하세요, 20년 넘게 Vue.js와 Angular 현장에서 개발해오고, ‘코딩하는곰’이라는 이름으로 블로그를 운영하고 있는 개발자입니다. 오늘은 프론트엔드 개발의 핵심 개념 중 하나인 양방향 바인딩(Two-way Data Binding) 을 Angular의 [(ngModel)]을 중심으로 깊이 있게 파헤쳐보려고 합니다. 특히 Angular에서 양방향 바인딩을 구현하기 위해 필수적인 FormsModule의 역할과 설정 방법에 대해 초보자부터 중급자까지 모두 이해할 수 있도록 상세히 설명드리겠습니다. Vue.js의 v-model과의 비교를 통해 두 프레임워크의 접근 방식을 함께 살펴보는 시간도 가질 예정이니, 끝까지 집중해 주세요!
프론트엔드 프레임워크를 사용하는 가장 큰 장점 중 하나는 뷰(View, UI) 와 모델(Model, 데이터) 을 자동으로 동기화시켜주는 데이터 바인딩 기능입니다. 이 중 양방향 바인딩은 사용자의 입력이 모델을 변경하고, 모델의 변경 사항이 다시 뷰에 즉시 반영되는 상호작용을 의미합니다.
{{ expression }}이나 [property]="expression"이 대표적입니다.[(ngModel)] 디렉티브를 통해 직관적으로 구현할 수 있습니다. 괄호와 대괄호가 결합된 [()] 문법은 ‘Banana in a Box’라고 불리며, 양방향의 흐름을 상징합니다.// 컴포넌트 클래스export class AppComponent {userName: string = '코딩하는곰'; // 모델 데이터}
<!-- 컴포넌트 템플릿 --><input type="text" [(ngModel)]="userName"><p>안녕하세요, {{ userName }}님!</p>
위 예제에서 input 필드에 값을 입력하면 바로 아래 p 태그의 {{ userName }} 값이 실시간으로 변경됩니다. 반대로, 컴포넌트 코드에서 this.userName = 'Vue 마스터'와 같이 값을 설정하면 input 필드와 p 태그의 내용이 동시에 업데이트됩니다.
📱 앱 개발에 도전하고 싶다면, HTML Form 전송이 안 될 때? 100% 해결하는 꿀팁 대공개!를 참고해보세요.
[(ngModel)]을 사용하려면 반드시 FormsModule을 모듈에 임포트해야 합니다. 이는 Angular의 모듈 시스템의 중요한 특징으로, 애플리케이션의 번들 크기를 최적화하고 필요한 기능만 포함시키기 위한 설계입니다. FormsModule은 템플릿 기반 폼을 작동시키는 데 필요한 모든 디렉티브(ngModel, NgForm 등)를 제공합니다.
설정 방법은 다음과 같습니다.
app.module.ts 파일을 엽니다. (Angular 버전에 따라 모듈 파일명이 다를 수 있음)@angular/forms 패키지에서 FormsModule을 임포트합니다.@NgModule의 imports 배열에 FormsModule을 추가합니다.// app.module.tsimport { NgModule } from '@angular/core';import { BrowserModule } from '@angular/platform-browser';import { FormsModule } from '@angular/forms'; // FormsModule 임포트import { AppComponent } from './app.component';@NgModule({declarations: [AppComponent],imports: [BrowserModule,FormsModule // imports 배열에 추가 -> 이제 앱 전체에서 ngModel 사용 가능!],providers: [],bootstrap: [AppComponent]})export class AppModule { }
FormsModule을 임포트하지 않으면 어떻게 될까요? Angular는 [(ngModel)]을 인식하지 못하고 템플릿 파싱 오류를 발생시킵니다. 콘솔에는 대략 Can't bind to 'ngModel' since it isn't a known property of 'input'
