CHAPTER 13. Forms
Forms, dear forms
ํผ์ ํญ์ Angular์์ ๋ ๊ฐ๊ณต ๋์ด์๋ค. ์ด๊ฒ์ 1.x์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ ๋ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ฉฐ ๊ฑฐ์ ๋ชจ๋ ์ฑ์ ํํ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ ๋ง์์ ์ฌ๋ก ์ก์๋ค.
ํผ์ ์ด๋ ค์ ๋ค : ์ฌ์ฉ์์ ์ ๋ ฅ์ ๊ฒ์ฆํ๊ณ , ์ค๋ฅ๋ฅผ ํ์ํ๊ณ , ํ๋๋ฅผ ํ์๋กํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ฑฐ๋, ๋ค๋ฅธ ํ๋์ ๋ฐ๋ผ ์ผ๋ถ ํ๋ ๋ณ๊ฒฝ ๋ฑ์ ๋์ํด์ผํ๋ค. ๋ํ ์ด๋ฌํ ์์์ ํ ์คํธ ํด์ผ ํ๋ค. AngularJS 1.x์ ๋จ์ ํ ์คํธ๋ก๋ ๋ถ๊ฐ๋ฅ ํ๋ค. ์๋ - ํฌ - ์๋ (end-to-end) ํ ์คํธ๋ง์ผ๋ก๋ ์คํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์๋ค.
Angular 2์์๋ ์์์ ๋์ผํ์ฃผ์๊ฐ ์ ์ฉ๋์์ผ๋ฉฐ ํ๋ ์ ์ํฌ๋ ์์์ ์์ฑํ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ฌ์ค ๊ทธ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
ํ ํ๋ฆฟ์ ์ง์๋ฌธ๋ง ์ฌ์ฉํ์ฌ ์์์ ์์ฑํ ์ ์๋ค. ์ด๋ "ํ ํ๋ฆฟ ์ค์ฌ" ๋ฐฉ์์ด๋ค. ์ฐ๋ฆฌ์ ๊ฒฝํ์ ๋น์ถ์ด ๋ณผ ๋, ๋น์ ์ด ๋จ์ํ ํผ์ ๊ฐ์ง๊ณ ์์ ๋, ๋ง์ ๊ฒ์ฆ์ด ์์ด ๋น๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑ ์์์ ํผ์ ๋ํ ์ค๋ช ์ ์์ฑํ ๋ค์ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ํผ์ ํ ํ๋ฆฟ์ inputs / textareas / choose์ ๋ฐ์ธ๋ํ๋ "์ฝ๋ ์ค์ฌ"๋ฐฉ์์ด๋ค. ์ข ๋ ์์ธํ ์ ๋ณด ๋ฟ ์๋๋ผ ํนํ ์ฌ์ฉ์ ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ ๋๋ ๋์ ์์ ์์ฑ์ ์ํ ๊ฒฝ์ฐ ๋์ฑ ๊ฐ๋ ฅํ๋ค.
๋์ผํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ ๋ฒ ๋ฐ๋ณตํ๊ณ ๊ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฐจ์ด์ ์ ์ดํด ๋ณด๋๋ก ํ์.
์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ๋ฉ์ง PonyRacer ์ฑ์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ๋ฑ๋ก ํ ์ ์๋๋ก ๊ฐ๋จํ ์์์ ์์ฑํ๋ ค๊ณ ํ๋ค. ๊ฐ ์ ์ค ์ผ์ด์ค๋ง๋ค ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๊ฐ ํ์ํ๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ํด ๋ณด์.
๋ฉ์ง ๊ฒ์ ์๋ค : ํผ์ ํฌํจํ๋ ๊ฐ๋จํ ํ ํ๋ฆฟ์ ๊ฐ์ง ์ปดํฌ๋ํธ๋ ๋ค์ ๋ช ๋ถ ์์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ํธ๋ฅผ ๋ฑ๋ก ํ ์์๋ ์์์ ์์ฑํ๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ Angular๋ ์์์ ํํ์ ๋ง๋ ๋ค.
"ํ ํ๋ฆฟ ์ค์ฌ" ๋ฐฉ์์์๋ ๊ฝค ์๋์ ์ด๋ค. ํ ํ๋ฆฟ์ ์ ์ ํ ์ง์๋ฌธ์ ์ถ๊ฐ ํ๊ธฐ๋ง ํ๋ฉด ํ๋ ์ ์ํฌ๊ฐ ์์ ํํ ์์ฑ์ ๋ด๋นํ๋ค. "์ฝ๋ ์ค์ฌ" ๋ฐฉ์์์๋ ์ด ํผ ํํ์ ์๋์ผ๋ก ์์ฑํ ๋ค์ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ ํํ์ ์ ๋ ฅ์ ๋ฐ์ธ๋ ํ๋ค.
ํผ ๋ค์์ ์ ๋ ฅ ํ๋ ๋ ์ ํ ํ๋์ ๊ฐ์ ํผ ํ๋๋ FormControlin Angular 2๋ก ํํ๋๋ค. ์ด๊ฒ์ ํผ์ ๊ฐ์ฅ ์์ ๋ถ๋ถ์ด๋ฉฐ ํ๋์ ์ํ์ ๊ทธ ๊ฐ์ ์บก์ํ ํ๋ค.
FormControl์๋, ๋ค์์ ๋ช๊ฐ์ ์์ฑ์ด ์๋ค.
โข valid : ํด๋น ํ๋๊ฐ ์ ํจํ๊ณ ํด๋น ํ๋์ ์ ์ฉ๋๋ ์๊ตฌ ์ฌํญ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ. โข errors : ํ๋ ์ค๋ฅ๊ฐ์๋ ๊ฐ์ฒด. โข dirty : ์ฌ์ฉ์๊ฐ ๊ฐ์ ์์ ํ ๋๊น์ง false. โข pristine : ์์ ํ๊ธฐ ์ด์ . โข touched : ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ํ ๋๊น์ง false. โข untouched : ์ ๋ ฅํ๊ธฐ ์ ๊น์ง ์ํ. โข value : ํ๋์ ๊ฐ. โข valueChanges : ํ๋์ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ๊ด์ฐฐ ๋๋ ๊ด์ฐฐ ๊ฐ๋ฅ ํจ์
๋ํ ์ปจํธ๋กค์ ํน์ ์ค๋ฅ๊ฐ ์๋์ง ํ์ธํ๋ hasError()์ ๊ฐ์ ๋ช ๊ฐ์ง ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
์์ฑ์์ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์์ผ๋ฉฐ ์ด ์ธ์๋ ๊ฐ์ด ๋๋ค.
์ด๋ฌํ ์ปจํธ๋กค์ FormGroup์ ๊ทธ๋ฃนํํ์ฌ ์์์ ์ผ๋ถ๋ฅผ ๋ํ๋ด๊ณ ์ ์ฉ ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ ๊ฐ์ง ์ ์๋ค. ์์ ์์ฒด๊ฐ ๊ทธ๋ฃน์ด๋ค.
FormGroup์ FormControl๊ณผ ๋์ผํ ์์ฑ์ ๊ฐ์ง๋ง ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์๋ค.
โข valid : ๋ชจ๋ ํ๋๊ฐ ์ ํจํ๋ฉด ๊ทธ๋ฃน์ ์ ํจ์ฑ. โข errors : ๊ทธ๋ฃน ์ค๋ฅ๊ฐ์๋ ๊ฐ์ฒด์ด๊ฑฐ๋ ๊ทธ๋ฃน์ด ์ ํจํ ๊ฒฝ์ฐ null์ด๋ค. ๊ฐ ์ค๋ฅ๋ ํค์ด๊ณ , value๋ ์ด ์ค๋ฅ์ ์ํฅ์ ๋ฐ๋ ๋ชจ๋ ์ปจํธ๋กค์ด ๋ค์ด์๋ ๋ฐฐ์ด์ด๋ค. โข dirty : ์ปจํธ๋กค ์ค ํ๋๊ฐ ๋๋ฌ์ ์ง ๋๊น์ง false. โข pristine : dirty์ ๋ฐ๋. โข touched : ์ปจํธ๋กค ์ค ํ๋๊ฐ ํฐ์น ๋ ๋๊น์ง false. โข untouched : touched์ ๋ฐ๋. โข value : ๊ทธ๋ฃน์ ๊ฐ. ๋ ์ ํํ๊ฒ ๋งํ์๋ฉด, ํค / ๊ฐ์ด ์ปจํธ๋กค๊ณผ ๊ทธ ๊ฐ. โข valueChanges : ๊ทธ๋ฃน์ ๋ณํ๊ฐ์์ ๋๋ง๋ค ๊ด์ฐฐ๋๋ ๊ด์ฐฐ ๊ฐ๋ฅ
hasError()์ ๊ฐ์ FormControl๊ณผ ๋์ผํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ๋ํ get() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃน์์ ์ปจํธ๋กค์ ๊ฒ์ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ์ ์๋ค.
Template-driven
์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํผ ์์ ๋ง์ ์ง์๋ฌธ์ ์ฌ์ฉํ๊ณ ํ๋ ์ ์ํฌ์์ ํ์ํ FormControl ๋ฐ FormGroup ์ธ์คํด์ค๋ฅผ ๋ง๋ค๋๋ก ํ์. ์๋ฅผ ๋ค์ด, NgForm ์ง์๋ฌธ์ ์์ ์์๋ฅผ ๊ฐ๋ ฅํ Angular 2 ๋ฒ์ ์ผ๋ก ๋ณํํ๋ค. Bruce Wayne๊ณผ Batman์ ์ฐจ์ด์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
ํ์ํ ์ง์๋ฌธ์ ๋ชจ๋ FormsModule ๋ชจ๋์ ํฌํจ ๋์ด ์์ผ๋ฏ๋ก ๋ฃจํธ ๋ชจ๋์์ ๊ฐ์ ธ์์ผ ํ๋ค.
FormsModule์๋ "ํ ํ๋ฆฟ ์ค์ฌ"๋ฐฉ์์ ๋ํ ์ง์๋ฌธ์ด ํฌํจ๋์ด ์๋ค. ์ฐ๋ฆฌ๋ ๋์ค์ "์ฝ๋ ์ค์ฌ"๋ฐฉ์์ ํ์ํ ๋์ผํ ๋ชจ๋ @ Angular / Forms์ ReactiveFormsModule์ด๋ผ๋ ๋ ๋ค๋ฅธ ๋ชจ๋์ด ์์์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
๋จ์ถ๋ฅผ ์ถ๊ฐํ๊ณ ์์ ํ๊ทธ์ ngSubmit์ ๋ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ ํ์๋ค. ngSubmit ์ด๋ฒคํธ๋ ์ ์ถ์ด ํธ๋ฆฌ๊ฑฐ ๋ ๋ NgForm ์ง์๋ฌธ์ ์ํด ์์ฑ๋๋ค. ๋์ค์ ๊ตฌํ ๋ ์ปจํธ๋กค๋ฌ์ register () ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ๋ง์ง๋ง์ผ๋ก ํ ํ๋ฆฟ์ด ๋น ๋ฅด๊ฒ ์ปค์ง ์ ์์ผ๋ฏ๋ก templateUrl์ ์ฌ์ฉํ์ฌ ์ ์ฉ ํ์ผ์ ํ ํ๋ฆฟ์ ์ถ์ถํด ๋ณด๋๋ก ํ์.
"ํ ํ๋ฆฟ ์ค์ฌ"๋ฐฉ์์์๋ AngularJS 1.x์ ๋งค์ฐ ํก์ฌํ๋ค. ํ ํ๋ฆฟ์ ๋ง์ ์์๊ฐ ์๊ณ ๊ตฌ์ฑ ์์์๋ ๋ง์ง ์๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ํ์์์๋ ngModel ์ง์ ๋ฌธ์ ์์ ํ ํ๋ฆฌํธ์ ์ถ๊ฐํ๋ฉด ๋๋ค. NgModel ์ง์๋ฌธ์ ์ฌ์ฉ์๋ฅผ ์ํด FormControl์ ๋ง๋ค๊ณ ์์์ ์๋์ผ๋ก FormGroup์ ๋ง๋ ๋ค. ์ ๋ ฅ์ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ค. ์ด ์ด๋ฆ์ ํ๋ ์ ์ํฌ์์ FormGroup์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์ ์ถ์ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ณ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ํธ๋ฅผ ์์์ผ ํ๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ก์ปฌ ๋ณ์๋ฅผ ์ ์ํ๊ณ ์ด ๋ณ์์ ์ํด ์์ฑ ๋ NgForm ๊ฐ์ฒด๋ฅผ ํ ๋น ํ ์ ์๋ค. ํ ํ๋ฆฟ ์ฅ์์ ์ด๋ค์ ๊ธฐ์ตํ๋๊ฐ? ์ฌ๊ธฐ์๋ ํผ์ ์ฐธ์กฐํ๋ ๋ณ์ userForm์ ์ ์ ํ ๊ฒ์ด๋ค. form ๋๋ ํฐ๋ธ๋ FormGroup ํด๋์ค์ ๋์ผํ ๋ฉ์๋๊ฐ ์๋ NgForm ์ง์๋ฌธ ์ธ์คํด์ค๋ฅผ ๋ด๋ณด๋ด๋ฏ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์๋ค. ๊ณ ๊ธ ์ง์๋ฌธ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฐ๊ตฌ ํ ๋ ๋ด๋ณด๋ด๊ธฐ ๋ถ๋ถ์ด ๋ ์์ธํ ํ์๋๋ค.
์ฐ๋ฆฌ์ register ๋ฉ์๋๋ ์ด์ Form ๊ฐ์ ์ธ์๋ก ์ฌ์ฉํ์ฌ ํธ์ถํ๋ค.
์ด๊ฒ์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ผ๋ฟ ์ด๋ค. ํ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด ๋ชจ๋ธ์ด ์ ๋ฐ์ดํธ ๋์ง๋ง ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํด๋ ํ๋ ๊ฐ์ ์ ๋ฐ์ดํธ๋์ง ์๋๋ค. ํ์ง๋ง ngModel์ ์๊ฐ๋ณด๋ค ๊ฐ๋ ฅํ๋ค.
Two-way data-binding
AngularJS 1.x๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ธฐ์ฌ์ ๋ํ ๊ธฐ์ฌ๋ฅผ ์ฝ์๋ค๋ฉด ์ ๋ ฅ ๊ฐ์ ํ์ํ๋ ์ ๋ช ํ ์์ ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ ์์ ํ ๋๋ง๋ค ์ ๋ฐ์ดํธ๋๋ ํํ์ ๋ฐ ํ๋๋ฅผ ์๋์ผ๋ก ํ์ํด์ผ ํ๋ค. ๋ชจ๋ธ์ด ๋ณ๊ฒฝ๋๋ฉด ์ ๋ฐ์ดํธ ๋๋ค.
Angular 2์ ๋น์ทํ ์์ ์ ํ ์ ์์ต๋๋ค. ์์์์ ์ฑ์ธ ๋ด์ฉ์ ๋ชจ๋ธ์ ์ ์ํ์ฌ ์์ํ๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ Userclass์์ ์ ์ํ ๊ฒ์ด๋ค.
RegisterFormComponent์๋ User ์ ํ์ ํ๋ ์ฌ์ฉ์๊ฐ ์์ด์ผ ํ๋ค.
์์ ์์ ๋ณผ ์ ์๋ฏ์ด register () ๋ฉ์๋๋ ์ด์ ์ฌ์ฉ์ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ก๊น ํ๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์์ ์ ๋ ฅ์ ์ถ๊ฐ ํ ์ค๋น๊ฐ ๋์๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅ ํ ๋ชจ๋ธ์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ๋ชจ๋ธ์ ์ฐ๊ฒฐ ํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ngModel ์ง์๋ฌธ์ ์ฌ์ฉํ๋ค.
NgModel ์ง์๋ฌธ์ ์ ๋ ฅ์ด ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ๊ด๋ จ ๋ชจ๋ธ user.username์ ์ ๋ฐ์ดํธํ๋ฏ๋ก [ngModel] = "user.username" ๋ถ๋ถ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ngModel์ด๋ผ๋ ์ถ๋ ฅ์์ ์ด๋ฒคํธ๋ฅผ ๋ด ๋ณด๋ด๊ณ ๋ชจ๋ธ์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค ๋ณ๊ฒฝ ๋๋ค.
๊ธด ํ์์ ์์ฑํ๋ ๋์ ์ ๊ตฌ๋ฌธ [()]์ ์ฌ์ฉํ ์ ์๋ค. ๋์ฒ๋ผ, ๊ทธ๊ฒ์ด [()]์ธ์ง ์๋๋ฉด []์ธ์ง ๊ธฐ์ตํ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ฉด ๊ฐ๋จํ ํ์ด ์๋ค. ๊ทธ๊ฒ์ ๋ฐ๋๋ ์์์ด๋ค! : [] , ๋ด๋ถ์๋ ์๋ก ๋ง์ฃผํ๋ ๋ ๊ฐ์ ๋ฐ๋๋๊ฐ ์๋ค ().
์ด์ ๋ ์ ๋ ฅ ํ ๋๋ง๋ค ๋ชจ๋ธ์ด ์ ๋ฐ์ดํธ ๋ ๊ฒ์ด๋ค. ๋ชจ๋ธ์์ ๋ชจ๋ธ์ด ์ ๋ฐ์ดํธ ๋๋ฉด ํ๋์์ ์๋์ผ๋ก ์ฌ๋ฐ๋ฅธ ๊ฐ์ ํ์ ๋๋ค.
์์ ์๋ฅผ ์๋ํ๋ฉด ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ํ์๋ ๋ง์ฐฌ๊ฐ์ง ์ด๋ค : ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ ์ถํ ์ ์๊ณ , ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ก ํ ๊ฒ์ด๋ค!
Fake dependencies
ํ ์คํธ ๋ชจ๋์ ๋ํ ์ข ์์ฑ์ ์ ์ธ ํ ์์๋ ๋ค๋ฅธ ์ฉ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ค์ ์๋น์ค ๋์ ๊ฐ์ง ์๋น์ค๋ฅผ ์ข ์ ์๋น์ค๋ก ์ ์ธํ๋ ๊ฒ์ ๋๋ฌด ๋ง์ ์๊ณ ๋ฅผ ๋ค์ด์ง ์๊ณ ๋ ํ ์ ์๋ค. ์ด ์์์๋ ๋ด RaceService๊ฐ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ด์ค๋ฅผ ์ ์ฅํ๊ณ ํค 'race'๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ์. ๋น์ ์ ๋๋ฃ๋ ์ฐ๋ฆฌ์ RaceService๊ฐ ์ฌ์ฉํ๋ JSON ์ง๋ ฌํ ๋ฑ์ ์ทจ๊ธ LocalStorageService๋ผ๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ์๋ค. list ()ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด์ ์ฐ๋ฆฌ๋ LocalStorageService ์๋น์ค๋ฅผ ํ ์คํธํ๊ณ ์ถ์ง ์๋๋ค. RaceService๋ฅผ ํ ์คํธํ๊ณ ์ถ๋ค. ์์กด์ฑ ์ฃผ์ ์์คํ ์ ํ์ฉํ์ฌ ์์กฐ ๋ LocalStorageService๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ฝ๊ฒ ์ํ ํ ์ ์๋ค.
provide๋ฅผ ์ฌ์ฉํ์ฌ RaceService๋ฅผ ํ ์คํธ๋ก ํ ์ ์๋ค.
ํ์ง๋ง ์ด ํ ์คํธ์ ์์ ํ ๋ง์กฑํ์ง๋ ์๋๋ค. ๊ฐ์ง ์๋น์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ์ง๋ฃจํ๊ณ ์ฌ์ค๋ฏผ์ ์๋น์ค๋ฅผ ๊ฐ์งํ๊ณ ๊ตฌํ์ ๊ฐ์ง๋ก ๋์ฒดํ๋ ๊ฒ์ ๋์ธ ์ ์์ต๋๋ค. ๋ํ get () ๋ฉ์๋๊ฐ ์ฌ๋ฐ๋ฅธ ํค์ธ 'race'์ ํจ๊ป ํธ์ถ๋์๋์ง ํ์ธํ ์ ์๋ค.
Code-driven
AngularJS 1.x์์๋ ์ฃผ๋ก ํ ํ๋ฆฟ์ ์์์ ์์ฑํด์ผ ํ๋ค. Angular 2๋ ๋ช ๋ นํ์ด ์๋๋ผ ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ง ์๊ณ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์์์ ์์ฑํ ์ ์๊ฒ ํ๋ค. ์ด์ ์ฝ๋์์ ์ง์ ์์์ ์ฒ๋ฆฌ ํ ์ ์๋ค. ๋ ์ฅํฉํ์ง๋ง ๋ ๊ฐ๋ ฅํ๋ค. ๊ตฌ์ฑ ์์ ์ฝ๋์์ ์์์ ์์ฑํ๊ธฐ ์ํด FormControl ๋ฐ FormGroup์ ๋ํด ์ค๋ช ํ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ฌํ ๊ธฐ๋ณธ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์์ ์์์ ์์ฑํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์๋ก์ด FormControl() ๋๋ ์ FormGroup()์ ์์ฑํ๋ ๋์ ์ฐ๋ฆฌ๊ฐ ์ฝ์ ํ ์์๋ ๋์ฐ๋ฏธ ํด๋์ค ์ธ FormBuilder๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
FormBuilder๋ ํฌํผ ํด๋์ค์ด๋ฉฐ ์ปจํธ๋กค๊ณผ ๊ทธ๋ฃน์ ๋ง๋๋ ๋ช ๊ฐ์ง ๋ฉ์๋๊ฐ ์๋ค. ๊ฐ๋จํ ์์ํ๊ณ ๋ ๊ฐ์ ์ปจํธ๋กค, ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ํธ๋ก ์์ ํผ์ ๋ง๋ ๋ค.
์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ์ปจํธ๋กค์ด์๋ form์ ๋ง๋ค์๋ค. ๊ฐ ์ปจํธ๋กค์ ๊ฐ ''์ผ๋ก ์์ฑ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค. FormBuilder ํฌํผ ๋ฉ์๋ control()๋ฅผ ์ด ๋ฌธ์์ด์ ๋งค๊ฐ ๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค. ์ FormControl('') ์์ฑ์๋ฅผ ํธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ๋ฌธ์์ด์ ์์์ ํ์ ํ ์ด๊ธฐ ๊ฐ์ ๋ํ ๋ธ๋ค. ์ฌ๊ธฐ์๋ ๋น์ด์์ด ์ ๋ ฅ์ด ๋น์ด์๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฅผ ๋ค์ด ๊ธฐ์กด ์ํฐํฐ๋ฅผ ํธ์งํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์๋ ๊ฐ์น๋ฅผ ์ป์ ์ ์๋ค. ๋์ฐ๋ฏธ ๋ฉ์๋๋ ๋ค๋ฅธ ํน์ ํน์ฑ์ ๊ฐ์ง ์๋ ์๋ค.
์ฐ๋ฆฌ๋ register ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ์์ ๋ณด์ ๋ฏ์ด FormGroup ๊ฐ์ฒด์๋ value ์์ฑ์ด ์์ผ๋ฏ๋ก ๋จ์ํ
์ด์ ํ ํ๋ฆฟ์์ ์ผ๋ถ ์์ ์ ์ํํด์ผ ํ๋ค. ์ฐ๋ฆฌ๋ "ํ ํ๋ฆฟ ์ค์ฌ" ์์์์ ๋ณธ ์ง์๋ฌธ ์ด์ธ์ ์ง์์ด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ์ด๋ฌํ ์ง์๋ฌธ์ ์ฌ์ฉ์๊ฐ ๋ฃจํธ ๋ชจ๋์์ ๊ฐ์ ธ์์ผ ํ๋ ReactiveFormsModule์ ์๋ค. ๊ทธ๊ฒ๋ค์ ์ด๋ฆ์ "template-driven"ํผ์ ๊ฒฝ์ฐ์ฒ๋ผ form ๋์ ์์๋๋ค.
formGroup ์ง์๋ฌธ ๋๋ถ์ ์์์ userForm ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ํด์ผ ํ๋ค. ๊ฐ ์ ๋ ฅ ํ๋๋ formControlName ์ง์๋ฌธ ๋๋ถ์ ์ปจํธ๋กค์ ๋ฐ์ธ๋ฉ ๋๋ค.
์ฐ๋ฆฌ๋ ๊ตฌ์ฑ ์์์ ์์ฑ ์ธ userForm ๊ฐ์ฒด๋ฅผ formGroup์ ๋ฐ์ธ๋ฉ ํ๋ ค๊ณ ํ๋ฏ๋ก ๊ดํธ ํ๊ธฐ๋ฒ [formGroup] = "userForm"์ ์ฌ์ฉํ๋ค. ๊ฐ ์ ๋ ฅ์ ๋ฐ์ธ๋ฉ ๋ ์ปจํธ๋กค์ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ์ฌ formControlName ์ง์๋ฌธ์ ์์ ํ๋ค. ์กด์ฌํ์ง ์๋ ์ด๋ฆ์ ์ง์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ ํ๋ค. ๊ฐ์ ์ ๋ฌํ ๋ (๊ทธ๋ฆฌ๊ณ ํํ์์ด ์๋ ๊ฒฝ์ฐ) formControlName์ []๋ก ๋ฌถ์ง ์๋๋ค.
์ ์ถ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ ํํ ๋น๋ฐ๋ฒํธ๊ฐ ํฌํจ ๋ ๊ฐ์ฒด๊ฐ ๊ธฐ๋ก๋๋ค! ํ์ํ ๊ฒฝ์ฐ setValue()๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์์ FormControl์ ๊ฐ์ ์ ๋ฐ์ดํธ ํ ์ ์๋ค.
Adding some validation
์ผ๋ฐ์ ์ผ๋ก ์ ํจ์ฑ ๊ฒ์ฌ๋ ์์ ์์ฑ์ ํฐ ๋ถ๋ถ์ด๋ค. ์ผ๋ถ ํ๋๋ ํ์์ด๊ณ ์ผ๋ถ๋ ์๋ก ์์กดํ๊ณ ์ผ๋ถ๋ ํน์ ํ์์ด์ด์ผ ํ๋ฉฐ ์ผ๋ถ๋ X๋ณด๋ค ํฌ๊ฑฐ๋ ์์ ๊ฐ์ ๊ฐ์ ธ์๋ ์๋๋ค. ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ ์ถ๊ฐํ์ฌ ๋๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
In a code-friven form
๋ชจ๋ ํ๋๊ฐ ํ์์์ ์ง์ ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ Validator๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. validator๋ ์๋ฌ์ ๋งต์ ๋๋ ค ์ฃผ๋์ง, ์๋ฌ๋ฅผ ๊ฒ์ถํ์ง ์์๋ ๊ฒฝ์ฐ๋ null๋ฅผ ๋๋ ค์ค๋ค.
ํ๋ ์ ์ํฌ๋ ๋ช ๊ฐ์ง ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ ๊ณตํ๋ค.
โข Validators.required - ๊ฐ์ด ๋น์ด ์์ง ์์์ผ ํ๋ค. โข Validators.minLength (n) - ์ ๋ ฅ ํ ๊ฐ์ ๋ฌธ์ ์๊ฐ n ์ ์ดํ์ด์ด์ผ ํ๋ค. โข Validators.maxLength (n) - ์ ๋ ฅ ๋ ๊ฐ์ ๋ฌธ์ ์๋ ์ต๋ n ์ ์ด์์ด์ด์ผ ํ๋ค. โข Validators.pattern (p) : ๊ฐ์ด ์ ๊ท ํํ์ p์ ์ผ์นํด์ผ ํ๋ค.
์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ Validators.compose()๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ฉฐ FormControl ๋๋ FormGroup์ ์ ์ฉ ํ ์ ์๋ค. ์ฌ๊ธฐ์๋ ๋ชจ๋ ํ๋๋ฅผ ํ์๋ก ์ง์ ํ๊ธฐ ์ํด ๊ฐ ์ปจํธ๋กค์ ํ์ํ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ฌ์ฉ์ ์ด๋ฆ์ด ์ต์ 3 ์ ์ด์์ด์ด์ผ ํ๋ค.
In a template-driven form
ํ ํ๋ฆฟ ์ค์ฌ ์์์ ํ์ ์ ๋ ฅ๋์ ์ถ๊ฐํ๋ ๊ฒ๋ ๋งค์ฐ ๊ฐ๋จํ๋ค. ํ์ํ ์์ฑ์ ์ ๋ ฅ์ ์ถ๊ฐํ๊ธฐ ๋งํ๋ฉด ๋๋ค. required๋ ์ ๊ณต๋ ์ง์๋ฌธ์ด๋ฉฐ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ด ํ๋์ ์๋์ผ๋ก ์ถ๊ฐํ๋ค. minlength์ maxlength์ ๊ฐ์ ์๋ฏธ์ด๋ค.
Errors and submission
๋ฌผ๋ก ์ฌ์ฉ์๊ฐ ์ค๋ฅ๊ฐ ๋จ์์๋ ๋์ ์์์ ์ ์ถํ ์ ์์ด์ผํ๋ฉฐ ์ค๋ฅ๊ฐ ์๋ฒฝํ๊ฒ ํ์ ๋์ด์ผ ํ๋ค. ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ์์์ ์ ์ถํ ์ ์๋ค. ์๋ง๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ํด ๋ญ๊ฐ ํ ์ ์์๊น?
disabled ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ฒํผ์ ์ฝ๊ฒ ๋นํ์ฑํ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ํ์ฌ ์์์ ์ํ๋ฅผ ๋ฐ์ํ๋ ํํ์์ ์ ๊ณตํด์ผ ํ๋ค.
Errors and submission in a code-driven form
FormGroup ์ ํ์ userForm ํ๋๋ฅผ ์ฐ๋ฆฌ ๊ตฌ์ฑ ์์์ ์ถ๊ฐํ๋ค. ์ด ํ๋๋ ์์ ๋ฐ ํ๋ ์ํ ๋ฐ ์ค๋ฅ์ ๋ํ ์์ ํ ๋ทฐ๋ฅผ ์ ๊ณตํ๋ค. ์๋ฅผ ๋ค์ด ์์์ด ์ ํจํ์ง ์์ ๊ฒฝ์ฐ ์์ ์ ์ถ์ ์ฌ์ฉ ์ค์ง ํ ์ ์๋ค.
๋ง์ง๋ง ์ค์์ ๋ณผ ์ ์๋ฏ์ด disabled๋ฅผ userForm์ ์ ํจํ ์์ฑ์ ์ฐ๊ฒฐํ๊ธฐ ๋งํ๋ฉด ๋๋ค. ์ด์ ๋ชจ๋ ์ปจํธ๋กค์ด ์ ํจ ํ ๋๋ง ์ ์ถํ ์ ์๋ค. ์ฌ์ฉ์๊ฐ ์์์ ์ ์ถํ ์ ์๋ ์ด์ ๋ฅผ ์ดํดํ๋๋ก ๋๊ธฐ ์ํด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํด์ผ ํ๋ค.
ํ๋๊ฐ ๋น์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ํ์๋๊ณ ๊ฐ์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ ์์์ด ํ์๋๋ฉด ๋ฐ๋ก ํ์๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ๋๊น์ง ์จ๊ธธ ์ ์์๊น?
๊ทธ๋ฌ๋ ๊ตฌ์ฑ ์์์ ๊ฐ ์ปจํธ๋กค์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
Errors and submission in a template-driven form
ํ ํ๋ฆฟ ์ค์ฌ ์์์์๋ FormGroup์ ์ฐธ์กฐํ๋ ๊ตฌ์ฑ ์์์ ํ๋๊ฐ ์์ง๋ง ์์ ์ง์๋ฌธ์์ ๋ด ๋ณด๋ธ NgForm ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ฌ ํ ํ๋ฆฟ์ ๋ก์ปฌ ๋ณ์๋ฅผ ์ด๋ฏธ ์ ์ธ ํ์๋ค. ๋ค์ ํ๋ฒ,์ด ๋ณ์๋ ํผ์ ์ํ๋ฅผ ์ ์ ์๊ณ ์ปจํธ๋กค์ ์ก์ธ์ค ํ ์ ์๊ฒ ํ๋ค.
์ด์ ๊ฐ ํ๋์ ์ค๋ฅ๋ฅผ ํ์ํด์ผ ํ๋ค. form ์ง์๋ฌธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ์ปจํธ๋กค์ FormControl ๊ฐ์ฒด๋ฅผ ๋ด ๋ณด๋ธ๋ค. ๋ฐ๋ผ์ ์ค๋ฅ์ ์ก์ธ์คํ๋ ๋ก์ปฌ ๋ณ์๋ฅผ ๋ง๋ค ์ ์๋ค.
Add some style
์์์ ๋ง๋๋ ๋ฐฉ์์ ๊ด๊ณ์์ด Angular 2๋ ๋ ๋ค๋ฅธ ๋ฉ์ง ์์ ์ ์ํํ๋ค. ๊ฐ ํ๋ (๋ฐ ์์)์ CSS ํด๋์ค๋ฅผ ์๋์ผ๋ก ์ถ๊ฐ ๋ฐ ์ ๊ฑฐํ์ฌ ์๊ฐ์ ์คํ์ผ์ ์ถ๊ฐ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ํ๋๋ ๋ฐ๋ฆฌ ๋ฐ์ดํฐ ์ค ํ๋๊ฐ ์คํจํ๋ฉด ng-invalid ํด๋์ค๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ชจ๋ valid ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณตํ๋ฉด ng-valid ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๋ค. ์ฆ, ์ ํจ์ฑ ๊ฒ์ฌ์ ์คํจํ ํ๋ ์ฃผ์์ ๋ฉ์ง ๋นจ๊ฐ ํ ๋๋ฆฌ์ ๊ฐ์ ์คํ์ผ์ ์ฝ๊ฒ ์ถ๊ฐ ํ ์ ์๋ค.
๋ ๋ค๋ฅธ ์ ์ฉํ CSS ํด๋์ค๋ ng-dirty์ด๋ฉฐ ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณ๊ฒฝ ํ ๊ฒฝ์ฐ ํ์๋๋ค. ๊ทธ ๋ฐ๋๋ ng-pristine์ด๋ฉฐ, ์ฌ์ฉ์๊ฐ ๊ฒฐ์ฝ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ๋ํ๋๋ค. ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ๊ฐ์ ํ ๋ฒ ์ด์ ๋ณ๊ฒฝ ํ ๊ฒฝ์ฐ์๋ง ๋นจ๊ฐ์ ํ ๋๋ฆฌ๋ฅผ ํ์ํ๋ค.
๋ง์ง๋ง์ผ๋ก ๋ง์ง๋ง CSS ํด๋์ค ์ธ ng-touch๊ฐ ์๋ค. ์ฌ์ฉ์๊ฐ ํ๋์ ์ ์ด๋ ํ ๋ฒ ์ด์ ๋ค์ด๊ฐ๊ณ ๋๊ฐ๋ฉด (์ฌ์ง์ด ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์๋๋ผ๋) ๋ํ๋๋ค. ๊ทธ ๋ฐ๋๋ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์๋ค. ์์์ ์ฒ์์ผ๋ก ํ์ ํ ๋ ํ๋์๋ ๋๊ฐ CSS ํด๋์ค ng-pristine ng-untouched ng-invalid๊ฐ ์๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๊ณ ํ๋๋ฅผ ๋ ๋ ๋ ng-pristine ng-touched ng-invalid๋ก ์ ํ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ฌ์ ํ ์ ํจํ์ง ์์ ๊ฐ์ผ๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ng-dirty๊ฐ ng-invalid๋ก ์ค์ ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๊ฐ์ด ์ ํจํ ๊ฒฝ์ฐ๋ ng-dirty ng-touch ng-valid๋ก ๋ณํ ๋ ๊ฒ์ด๋ค.
Creating a custom validator
ํฌ๋ ๋ ์ด์ค๋ ์ค๋ ์ฑ ๊ฒ์์ด๋ฏ๋ก 18 ์ธ ์ด์์ธ ๊ฒฝ์ฐ์๋ง ๋ฑ๋ก ํ ์ ์๋ค. ์ฌ์ฉ์๊ฐ ์ค์๋ก ์ค์ํ์ง ์์์์ ํ์ธํ๊ธฐ ์ํด ๋น๋ฐ๋ฒํธ๋ฅผ ๋ ๋ฒ ์ ๋ ฅํด์ผ ํ๋ค. ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ์ฐ๋ฆฌ๋ ์ฌ์ฉ์ ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ๋ง๋ ๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด FormControl์ ์ฌ์ฉํ๊ณ ๊ฐ์ ํ ์คํธํ๊ณ ์ค๋ฅ๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฑฐ๋ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ํต๊ณผ๋๋ฉด null์ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๊ฒ์ฆ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์ฝ๋ค. ์ฐ๋ฆฌ๋ ์ปจํธ๋กค์ ๊ฐ์น๋ฅผ ์ทจํ๊ณ , ๋ ์ง๋ฅผ ๋ง๋ค๊ณ , 18 ๋ฒ์งธ ์์ผ์ด ์ ์ ์๋์ง ํ์ธํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 'tooYoung'ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐํ ํ๋ค. ์ด์ ์ด ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ํฌํจํด์ผ ํ๋ค.
Using a validator in a code-driven form
FormBuilder๋ฅผ ์ฌ์ฉํ์ฌ์ด ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ ์ ์ปจํธ๋กค์ ์ถ๊ฐํด์ผ ํ๋ค.
๋ณด์๋ค์ํผ, ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ ์ด ์๋ ์์ผ์ ์ถ๊ฐํ์๋ค. ์ฒซ ๋ฒ์งธ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๊ฐ ํ์ํ๋ฉฐ ๋ค๋ฅธ ํด๋์ค๋ isOldEnough ํด๋์ค์ ์ ์ ๋ฉ์๋ ์ด๋ค. ๋ฌผ๋ก ์ด ๋ฉ์๋๋ ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ํด๋์ค์ ์์ ์ ์๋ค. (์ : ์ ์ ๋ฉ์๋)
ํ๋๋ฅผ ์ถ๊ฐํ๊ณ ์์์ ์ค๋ฅ๋ฅผ ํ์ํ๋ ๊ฒ์ ์์ง ๋ง ๊ฒ!!!
Using a validator in a template-driven form
ํ ํ๋ฆฟ ๊ธฐ๋ฐ ํผ์ ์ฌ์ฉ์ ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ... ํ ํ๋ฆฟ์ ์ถ๊ฐํด์ผ ํ๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ ๋ ฅ์ ์ ์ฉ ํ ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ ์์ฑํด์ผ ํ์ง๋ง ์ ์งํ๊ฒ๋ "์ฝ๋ ๊ธฐ๋ฐ" ์์์ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๋ค. ๋๋ ๋ ์ธ๊ณ์ ์ฅ์ ์ ๊ฒฐํฉ ํ ์ ์๋ค.
Combining template-based and code-based approaches for validation
์ฌ์ฉ์ ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ ์ธํ๊ณ "ํ ํ๋ฆฟ ๊ธฐ๋ฐ"์ผ๋ก ๋ชจ๋ ์์ ์ ์ํ ํ ์ ์์ต๋๋ค! ์ฐ๋ฆฌ๋ ๋ณด๊ธฐ์ ์ด๋ฐ ์์ผ๋ก ๋๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ ์ ๋ง ์ข์ ์ ์ถฉ์ ์ด๋ค.
โข ๋ชจ๋ ์์์ ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค ํ์๋ ์๋ค. โข ํ์ ๋ฐ usernameAllowed ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ง์ ๊ตฌ์ฑ ํ ํ์๊ฐ ์์ต๋๋ค. Angular๊ฐ ์ฌ์ฉ์๋ฅผ ๋์ ํ๋ค. โข ์์ํ ์ฝ๋ ์ค์ฌ ์ ๊ทผ ๋ฐฉ์์ด ์๋ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ด ์ฌ์ ํ ์๋ค.
์ด๋ ๊ฐ๋จํ ์ฌ์๊ณผ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ์ํ ํ ํ๋ฆฟ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ง์ถค ๊ฒ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ ์ฝ๋ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๊ฒฐํฉํ๋ ๊ฒ์ด๋ค.
Grouping fields
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ํ๋์ ๊ทธ๋ฃน, ์ฆ ์๋ฒฝํ ํํ๋ฅผ ๊ฐ์ก๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฃน ๋ด์์ ๊ทธ๋ฃน์ ์ ์ธ ํ ์ ์๋ค. ์ด๋ ์ฃผ์์ ๊ฐ์ ํ๋ ๊ทธ๋ฃน์ ๊ฒ์ฆํ๊ฑฐ๋ ์์ ์์ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ํธ ๋ฐ ํ์ธ์ด ์ผ์นํ๋์ง ํ์ธํ๋ ค๋ ๊ฒฝ์ฐ ๋งค์ฐ ์ ์ฉํ๋ค. ํด๊ฒฐ์ฑ ์ ์ฝ๋ ์ฃผ๋ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค (์์์ ๋ณด์ ๋ฏ์ด ์ํ ๊ฒฝ์ฐ ํ ํ๋ฆฟ ๊ธฐ๋ฐ ์์๊ณผ ๊ฒฐํฉ ํ ์ ์๋ค). ๋จผ์ ์๋ก์ด ํ๋ ์ธ passwordForm์ ๋ง๋ค๊ณ ๋ ํ๋๋ฅผ userForm ๊ทธ๋ฃน์ ์ถ๊ฐ ํ๋ค.
๋ณด์๋ค์ํผ, ํ๋ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ํธ์ถ๋๋ validModifier ๊ทธ๋ฃน์ passwordMatch๋ฅผ ์ถ๊ฐํ๋ค. formGroupName ์ง์์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ์์์ ๋ฐ์ํ๋๋ก ํ ํ๋ฆฟ์ ์ ๋ฐ์ดํธ ํ์.
Reacting on changes
์ฝ๋ ์ค์ฌ ์์์ ์ฌ์ฉํ ๋ ๋ง์ง๋ง์ผ๋ก ์ ์ฉํ ๊ธฐ๋ฅ : ๊ด์ฐฐ ๊ฐ๋ฅํ valueChanges๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ณ๊ฒฝ์ ์ฝ๊ฒ ๋์ํ ์ ์๋ค. ๋ฆฌ ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ FTW! ์๋ฅผ ๋ค์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ ํ์๊ธฐ๋ฅผ ํ์ํ๋ค. ์ฐ๋ฆฌ๋ ์ํธ ๊ฐ์ด ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๋ ค๊ณ ํ๋ค.
์ด์ ๊ตฌ์ฑ ์์ ์ธ์คํด์ค์ passwordStrength ํ๋๊ฐ์์ด์ ์ฌ์ฉ์์๊ฒ ํ์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ RxJS ์ด์์๋ฅผ ํ์ฉํ์ฌ ๋ช ๊ฐ์ง ์ ์ฉํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
โข distinctTime (400)ํจ์๋ ์ฌ์ฉ์๊ฐ 400ms ๋์ ํ์ดํ์ ๋ฉ ์ถ๋ฉด ๊ฐ์ ๋ฐฉ์ถ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ํ ๋ชจ๋ ๊ฐ์ ๋ํด ์ํธ ๊ธธ์ด๋ฅผ ๊ณ์ฐํ์ง ์์๋ ๋๋ค. ์ปดํจํ ์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฑฐ๋ HTTP ์์ฒญ์ด ์์๋๋ฉด ์ ๋ง ํฅ๋ฏธ๋ก์ด ์ผ์ด๋ค.
โข distinctUntilChanged ()๋ ์ ๋ ฅ ๋ ์ ๊ฐ์ด ๋ง์ง๋ง ๊ฐ๊ณผ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ง ๊ฐ์ ๋ด๋ณด๋ธ๋ค. ์ฌ์ฉ์๊ฐ 'password'๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ดํ์ด ์ค์ง๋๋ค๊ณ ์์ํด ๋ณด์๋ผ. ์ฐ๋ฆฌ๋ ๊ธธ์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์๋ก์ด ๊ธ์๋ฅผ ์ ๋ ฅํ๊ณ ๋นจ๋ฆฌ ์ ๊ฑฐํ๋ค (400ms ์ ). distinctTimewill์ ๋ค์ ์ด๋ฒคํธ๋ ๋ค์ '์ํธ'์ ๋๋ค. ์ํธ ๊ธธ์ด๋ฅผ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค! ์ด ์ฐ์ฐ์๋ ๊ฐ์ ๋ฐฉ์ถํ์ง ์์ผ๋ฉฐ ์ฐ๋ฆฌ์๊ฒ ๋ค์ ๊ณ์ฐ์ ์ ์ฅํ๋ค.
RxJS๋ ๋น์ ์ ์ํด ์ ๋ง์ ์์ ์ ์ํ ํ ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ํ ๋ ์ค๋ก ์ฝ๋ฉ ํ ๊ฒ์ ์์ํด๋ณด์๋ผ. ๋ํ Http ์๋น์ค๋ ๊ด์ธก ๊ฐ๋ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ HTTP ์์ ๊ณผ ์ฝ๊ฒ ๊ฒฐํฉ ํ ์ ์๋ค.
Summary
Angular 2 ํผ์ ๋ง๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. :
โข ํ๋๋ ํ ํ๋ฆฟ์์ ๋ชจ๋ ์ค์ ์ ํ๋ค. ํ์ง๋ง ๋น์ ์ด ๋ณธ๋๋ก, ๊ทธ๊ฒ์ ๊ฒ์ฆ์ ์ํ ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ ํ์๋ก ํ๊ณ ํ ์คํธํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์ด๋ค. ์์์ ์๋ฅผ ๋ค์ด ํ๋ ๋๋ ์ฌ๋ฌ ํ๋๊ฐ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ ๊ณตํฉ๋๋ค.
โข ํ๋๋ ๊ตฌ์ฑ ์์์์ ๊ฑฐ์ ๋ชจ๋ ์ค์ ์ ํ๋ค. ์ด ๋ฐฉ๋ฒ์ ํ์์ ๋ฐ๋ผ ์ฌ๋ฌ ์์ค์ ๊ทธ๋ฃน์ ์ฌ์ฉํ์ฌ ๊ฒ์ฆ ๋ฐ ํ ์คํธ ์ค์ ์ ์ฝ๊ฒ ํ ์ ์๋ค. ๊ทธ๊ฒ์ ๋ณต์กํ ์์์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ ํ์ ๋ฌด๊ธฐ์ด๋ค. ๊ทธ๋ฃน์ด๋ ํ๋์ ๋ณ๊ฒฝ์๋ ๋ฐ์ ํ ์ ์๋ค.
โข "ํ ํ๋ฆฟ ๊ธฐ๋ฐ"์์์ ๊ฐ๊ฒฐํจ๊ณผ ํ๋น์ฑ์ ๊ฒ์ฆํ๊ธฐ์ํ ใ์ฝ๋ ์ค์ฌ 'ํผ์ ์ค๋ณต์ ์๋ฆฝ์ํค๊ธฐ
์ด๊ฒ์ ์๋ง๋ ๊ฐ์ฅ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค : ํ ํ๋ฆฟ ๊ธฐ๋ฐ๊ณผ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ๋ง์์ ๋ค๋ฉด ํผ ๊ทธ๋ฃน๊ณผ ํผ ์ปจํธ๋กค์ ๋ํ ์ก์ธ์ค๊ฐ ํ์ํ ๋ ์ฆ์ (์ฌ์ฉ์ ์ง์ ์ ํจ์ฑ ๊ฒ์ฌ์ ๋ฐ์์ ์ธ ๋์์ ์ถ๊ฐํ๋ ๋ฑ) ๊ตฌ์ฑ ์์ ๋ด๋ถ์ ํ์์ฑ์ ํ๋จํ๊ณ ์ ์ ํ ์ง์นจ์ ์ฌ์ฉํ์ฌ input๊ณผ div๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ค.
Reference URL
Last updated