티스토리 뷰
머릿말
Angular의 Form은 두 가지 종류가 있다. 한가지는 Template-driven 방식, 다른 한가지는 Reactive 방식이다. 이번 글에서는 Template-driven 방식과 Reactive 방식의 특징과 차이점을 살펴보고, Template-driven 방식 보다 Reactive 방식이 왜 더 좋은지 살펴볼 것이다.
Template-driven 방식의 공식 문서는 Template-driven Forms에서 확인 할 수 있고, Reactive 방식에 대한 공식 문서는 Reactive Forms에서 확인 할 수 있다. 해당 글에서는 각각의 코드 사용법은 거의 언급하지 않을 것이므로, Angular Form에 대한 사용법을 알기 위해 이 글을 찾아 왔다면, 공식 문서로 찾아갈 것을 권장한다. Angular의 공식문서는 번역이 안되있어서 그렇지 아주 잘 되어 있다.
해당 글에서 언급하는 단어 중 템플릿은 *.html 파일이고 컴포넌트 클래스는 *.ts 파일이다.
Template-driven 방식
Template-driven 방식은 입력 폼에 ngModel을 이용해 템플릿에서 폼 관리를 하는 방식이다.
Template-driven 방식은 컴포넌트 클래스에 적은 코드를 쓰고도 사용 할 수 있다는 것이 장점이다. 또한 양방향 데이터 바인딩은 angular의 공식 튜토리얼인 Tour of Heroes에서도 사용하고, 여러 공식 예제에서도 심심치 않게 볼 수 있기 때문에 처음 angular를 접하는 사람들은 양방향 데이터 바인딩이 only way 혹은 best way라고 생각한다. ( 필자도 처음 angular를 시작했을 때는 베타 버전이었고 참고 할 만한 레퍼런스나, 예제가 공식 문서 밖에 없었기 때문에 당연히 양방향 데이터 바인딩이 쉽고 쓰기 좋았고, 폼을 구성하는 유일한 방법인 줄 알았다. )
지금은 공식문서에 그런 언급이 사라졌지만, 예전 공식문서에는 양방향 데이터 바인딩은 성능 이슈에 문제가 될 수 있으니 정말 필요한 곳에만 사용하라고 언급을 했다. (글을 쓰기 위해 CHANGELOG.md를 살펴봤지만 별다른 업데이트 내역은 찾아볼 수 없었다.)
성능 문제가 아니더라도 angular는 템플릿과 컴포넌트 클래스의 역할 분리를 권장한다. 간단한 대입문도 왠만하면 컴포넌트 클래스에서 함수를 만들어서 할 수 있도록 하는 걸 보면 역할 분리를 엄격하게 했으면 하는 철학을 가진 것 같다. 하지만 Template-driven 방식은 이름에서도 알 수 있듯 템플릿에서 Form에 대한 기능을 주도하고 있다. 이렇게 되면, 컴포넌트 클래스는 폼에 대한 권한이 템플릿에 있으므로 사용자의 입력을 비동기적으로 처리 하게 되고, 개발자는 컴포넌트 클래스에서 변수를 사용함에 있어 초기화 문제가 발생하여, 하지 않아도 되는 예외 처리를 해야 할 수도 있다.
이러한 문제점들을 Reactive 방식에서는 대부분 해결 할 수 있다.
Reactive 방식
Reactive 방식은 ReactiveForm에 속하는 FormBuilder, FormControl, FormGroup, FormArray를 이용하여, 컴포넌트 클래스에서 주도적으로 폼에 대한 구조를 명세하고, 폼에 속하는 변수와 그에 대한 초기화를 담당하므로서 앞서 Template-driven 방식에서 있었던 문제들을 대부분 해결 할 수 있다.
공식 문서에서 Reactive 방식에 대한 코드를 봤다면 알겠지만, 컴포넌트 클래스에서 FormBuilder를 이용하여 FormGroup과 FormControl, FormArray로 폼에 대한 구조화를 미리 명세해 놓고, 템플릿에서 입력 폼을 만들고 FormBuilder에 등록된 FormGroup과 FormControl을 차례대로 놓아주면 FormBuilder를 통해 Validation, Status 체크를 컴포넌트 클래스 내에서 동기적으로 수행할 수 있게 된다. 이 뜻은, 앞서 말했듯 컴포넌트 클래스에서 폼에 대한 주도권을 가지고 있는 것이고, 이에 따라, 컴포넌트 클래스에서 폼에 따른 알고리즘을 개발자의 입맛에 맞게 설정 할 수 있다는 것이다.
또한, Reactive 방식을 사용하게 되면 Validation을 컴포넌트 클래스에서 정해 줄 수있어, 폼에 대한 기능을 모두 한 곳에서 관리 할 수 있게 된다. 이는 향후 유지보수에서도 상당한 도움이 된다.
하지만, Template-driven 방식에 비해 신경을 써야할 부분이 두군데가 되기 때문에 스트레스가 있을 수도 있다. 그럼에도 앞서 Template-driven 방식에서의 단점이 그 스트레스보다 크기 때문에 Reactive 방식을 채용하는 것이 프로젝트를 장기적으로 봤을 때 더 효율성이 높다고 볼 수 있다.
맺음말
'Tutorial > Angular' 카테고리의 다른 글
당신이 사용하는 Angular에는 상태관리 라이브러리가 필요 없을지 모릅니다. (2) | 2018.02.15 |
---|---|
Angular CLI 사용법 (0) | 2018.01.08 |
개인적인 Angular 프로젝트 폴더링 (0) | 2017.12.21 |
- Total
- Today
- Yesterday