CHAPTER 15. Router
Intro
์ด ์ฅ์์๋ ๋ง์ง๋ง ๋ผ์ฐํฐ API (v3)๋ฅผ ์ฌ์ฉํ๋ค. ์ฆ, ๋ผ์ฐํฐ ํจํค์ง์ ๋ฒ์ ๋ฒํธ๊ฐ 3.0.0์ด๊ณ ๋ค๋ฅธ ํจํค์ง์ ๋ฒ์ ๋ฒํธ๊ฐ 2.0.0 ์ธ ๊ฒฝ์ฐ์ด๋ค.
URL์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํ๋ก ๋งคํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ๋ถ๋งํฌ์ ์ถ๊ฐํ๊ณ ๋์์ฌ ์ ์๊ธฐ๋ฅผ ์ํ๋ฉด ์ ์ฒด์ ์ผ๋ก ๋ ๋์ ํ๊ฒฝ์ ์ ๊ณต ํ ์ ์๋ค. ์ด ์์ ์ ๋ด๋นํ๋ ๋ถ๋ถ์ ๋ผ์ฐํฐ๋ผ๊ณ ํ๋ฉฐ, ๋ชจ๋ ํ๋ ์ ์ํฌ์๋ ๊ณ ์ ํ (๋๋ ๋ช ๊ฐ์ง) ํ๋ ์ ์ํฌ๊ฐ ์๋ค.
Angular 2์ ๋ผ์ฐํฐ๋ ์ฑ์ ์ํ๋ฅผ ๋ฐ์ํ๋ ์๋ฏธ์๋ URL์ ํ์ฉํ๊ณ ๊ฐ URL์ ๋ํด ํ์ด์ง์์ ์ด๋ค ๊ตฌ์ฑ ์์๋ฅผ ์ด๊ธฐํํ๊ณ ์ฝ์ ํด์ผ ํ๋์ง๋ฅผ ๊ฐ๋จํ ์ ์ ์๋ค. ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์น์ง ์๊ณ ๋ฐฑ์๋ ์๋ฒ์ ๋ํ ์๋ก์ด ์์ฒญ์ ํธ๋ฆฌ๊ฑฐํ์ง ์๊ณ ์ด ๋ชจ๋ ๊ฒ์ ์คํํ ์ ์๋ค.
์ฝ์ด ํ์์ ngRoute๋ผ๋ ๋ชจ๋๋ก ๊ด๋ฆฌํ๋ AngularJS 1.x์ ์ด๋ฏธ ๋ผ์ฐํฐ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ ๊ฒ์ด๋ค. ๋ํ ๋งค์ฐ ๋จ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๊ฐ๋จํ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ OK์ด์ง๋ง URL ๋น ๋จ์ผ๋ณด๊ธฐ ๋ง ํ์ฉํ๊ณ ์ค์ฒฉ์ด ๋ถ๊ฐ๋ฅ ํ๋ค. ์กฐํ์๊ฐ ๋ง์ ๋ํ ์ฑ์์ ์์ ํ๋ ๋ฐ ์ฝ๊ฐ์ ์ ํ์ด ์์๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ ๋ง ํ๋ฅญํ ์ผ์ ํ๊ณ ์๋ ui-router๋ผ๊ณ ํ๋ ๋งค์ฐ ์ธ๊ธฐ์๋ ์ปค๋ฎค๋ํฐ ๋ชจ๋์ด ์์๋ค.
Angular 2์ ํ์ ๊ฒฉ์ฐจ๋ฅผ ์ค์ด๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ RouterModule์ด๋ผ๋ ์๋ก์ด ๋ชจ๋์ ์์ฑํ๋ค. ์ด ๋ชจ๋์ ์ฐ๋ฆฌ์ ๋ชจ๋ ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํฌ ๊ฒ์ด๋ค! ์๋ก์ด ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ ์ ๋ง ํฅ๋ฏธ๋ก์ธ ๊ฒ์ด๋ค.
En route
๋ผ์ฐํฐ ์ฌ์ฉ์ ์์ํด๋ณด์. ์ด ๋ชจ๋์ ์ฝ์ด ํ๋ ์ ์ํฌ์ ํฌํจ๋์ง ์๋ ์ ํ์ ๋ชจ๋์ด๋ค.
๋ค๋ฅธ ๋ชจ๋์์ ๋ณด์ ๋ฏ์ด ๋ชจ๋์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฃจํธ ๋ชจ๋์ ๋ชจ๋์ ํฌํจํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ ์ํด์๋ URL๊ณผ ๊ตฌ์ฑ ์์ ๊ฐ์ ๋งคํ์ ์ ์ํ๋ ๊ตฌ์ฑ์ด ํ์ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก app.routes.ts์ ๊ฐ์ ์ด๋ฆ์ ์ ์ฉ ํ์ผ๋ก ๊ตฌ์ฑ ํ ์ ์์ผ๋ฉฐ ๊ตฌ์ฑ์ ๋ํ๋ด๋ ๋ฐฐ์ด์ ํฌํจํ๋ค.
๊ทธ๋ฐ ๋ค์ ๋ฃจํธ ๋ชจ๋์์ ๋ผ์ฐํฐ ๋ชจ๋์ ๊ฐ์ ธ ์์ ์ ์ ํ ๊ตฌ์ฑ์ผ๋ก ์ด๊ธฐํ ํด์ผํ๋ค.
๋ํ ๋ฃจํธ ๋ชจ๋์ ์ ์ธ ์์ฑ์์ ๋ผ์ฐํฐ ๋ชจ๋์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ์ธํด์ผ ํ๋ค. ๋ณด์๋ค์ํผ Routes๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ด๋ฉฐ ๊ฐ ๊ฐ์ฒด๋ ๊ฒฝ๋ก์ด๋ค. ๋ผ์ฐํธ ๊ตฌ์ฑ์ ๋ณดํต ํ ์์ ๋ฑ๋ก ์ ๋ณด์ด๋ค.
โข path : ํ์์ ํธ๋ฆฌ๊ฑฐ ํ URL โข component : ์ด๊ธฐํ๋๊ณ ์ฝ์ ๋ ์ปดํฌ๋ํธ
๊ตฌ์ฑ ์์๊ฐ ํ์ด์ง์ ์ฝ์ ๋ ์์น ๋น์ ์ ๊ถ๊ธ ํ ๊ฒ์ด๋ค, ๊ทธ๊ฒ์ ์ข์ ์ง๋ฌธ์ด๋ค. ์์ ์์์ RacesComponent์ ๊ฐ์ด ์ฑ์ ํฌํจ๋ ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ ์ฃผ ๊ตฌ์ฑ ์์์ ํ ํ๋ฆฟ์ ํน์ ํ๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ด๊ฒ์ ๋ฌผ๋ก Angular ์ง์๋ฌธ์ด๋ค. ์ด ์ง์๋ฌธ์ ํ์ฌ ๊ฒฝ๋ก์ ๊ตฌ์ฑ ์์ ํ ํ๋ฆฟ์ ๋ํ ์๋ฆฌ ํ์์ ์ญํ ์ ์ํํ๋ค. ์ฐ๋ฆฌ์ ์ฑ ํ ํ๋ฆฟ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ ํ ๋ ๋ชจ๋ ํญ๋ชฉ (๋จธ๋ฆฌ๊ธ, ๊ธฐ๋ณธ ๋ฐ ๋ฐ๋ฅ ๊ธ)์ด ์ ์ง๋๋ฉฐ ํ์ฌ ๊ฒฝ๋ก์ ์ผ์นํ๋ ๊ตฌ์ฑ ์์๊ฐ RouterOutlet ์ง์๋ฌธ ๋ฐ๋ก ๋ค์ ์ฝ์ ๋๋ค.
Transforming data
Observable ๊ฐ์ฒด๋ฅผ ์๋ต์ผ๋ก ๋ฐ๊ณ ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ณํ ํ ์ ์๋ค๋ ์ฌ์ค์ ์์ง ๋ง์์ค. ๊ฒฝ์ฃผ ์ด๋ฆ์ ๋ชฉ๋ก์ ์ํ๋๊ฐ? ์ธ์ข ์ ์์ฒญํ๊ณ ์ด๋ฆ์ ๋งคํํ๋ฉด ๋๋ค! ์ด๋ ๊ฒ ํ๋ ค๋ฉด RxJS์ ๋ํ mapoperator๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค. Angular ํ์ ์ฑ์ ์ ์ฒด RxJS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๊ธฐ๋ฅผ ์ํ์ง ์์ผ๋ฏ๋ก ๋ช ์ ์ ์ผ๋ก ํ์ํ ์ฐ์ฐ์๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
์ด์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ฌํ ์ข ๋ฅ์ ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ ์๋น์ค๋ก ์ํ๋๋ค. RaceService์ ๊ฐ์ ์๋น์ค๋ฅผ ๋ง๋๋ ๊ฒฝํฅ์ด ์๋ค. RaceService๋ ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๊ณณ์ด๋ค. ๊ทธ๋ฐ ๋ค์ ๋ด ๊ตฌ์ฑ ์์๋ ์๋น์ค ๋ฐฉ๋ฒ์ ๊ตฌ๋ ํด์ผํ๋ฉฐ ํ๋ ๋ด๋ถ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์ง ๋ชปํ๋ค.
๋ํ RxJS๋ฅผ ์ฌ์ฉํ์ฌ ์คํจํ ์์ฒญ์ ๋ช ๋ฒ ๋ค์ ์๋ ํ ์ ์๋ค.
Navigation
๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ฅผ ์ด๋ป๊ฒ ํ์ ํ ์ ์์๊น? ๊ธ์, ์๋์ผ๋ก URL์ ์ ๋ ฅํ๊ณ ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์นจ ํ ์๋ ์์ง๋ง ๊ทธ๋ค์ง ํธ๋ฆฌํ์ง๋ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ "๋ก"๊ณ ์ ์ ์ธ "๋งํฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค. ์ค์ ๋ก ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น URL์์ ํ์ด์ง๋ฅผ ๋ก๋ํ๊ณ ์ ์ฒด Angular ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ํ๋ค. ๊ทธ๋ฌ๋ Angular์ ๋ชฉํ๋ ์ด๋ฌํ ํ์ด์ง ๋ค์ ๋ก๋๋ฅผ ํผํ๋ ๊ฒ์ด๋ค. ๋จ์ผ ํ์ด์ง ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์ถ๋ค. ๋ฌผ๋ก ๋ด์ฅ๋ ์๋ฃจ์ ์ด ์๋ค.
ํ ํ๋ฆฟ์์ ์ด๋ํ๋ ค๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ฆฌํค๋ ์ง์๋ฌธ RouterLink๊ฐ ํฌํจ ๋ ๋งํฌ๋ฅผ ์ฝ์ ํ ์ ์๋ค. ๋ฃจํธ ๋ชจ๋์ด RouterModule์ ๊ฐ์ ธ์ RouterModule์ ๋ด ๋ณด๋ธ ๋ชจ๋ ์ง์๋ฌธ์ ๋ฃจํธ ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ด ์ง์๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. outerLink ์ง์๋ฌธ์ ์ด๋ํ๋ ค๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋ ์์ ๋๋ ๊ฒฝ๋ก ๋ฐ ํด๋น ๋งค๊ฐ ๋ณ์๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด์ ๋ฐ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด RacesComponent ํ ํ๋ฆฟ์์ HomeComponent๋ก ์ด๋ํ๋ ค๋ฉด ์์ํด ๋ณด๋ผ.
๋ฐํ์์ ๋งํฌ href๋ ๋ผ์ฐํฐ์ ์ํด ๊ณ์ฐ๋๊ณ /๋ฅผ ๊ฐ๋ฆฌ ํต๋๋ค.
๊ฒฝ๋ก์ ์ ํ ์ฌ๋์๊ฐ ํ์ํ๋ค. ํฌํจ๋์ด ์์ง ์๋ค๋ฉด, RouterLink๋ URL์ ํ์ฌ ๊ฒฝ๋ก์ ์๋์ ์ผ๋ก ์์ฑํ๋ค (๋์ค์ ๋ณด๊ฒ ๋ ๊ฒ์ฒ๋ผ ์ค์ฒฉ ๋ ๊ตฌ์ฑ ์์์ ์ ์ฉ ํ ์ ์๋ค). ์ฌ๋์๋ฅผ ์ถ๊ฐํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ ๊ธฐ๋ณธ URL์์ URL์ ๊ณ์ฐํด์ผ ํจ์ ๋ํ๋ธ๋ค.
RouterLink ์ง์๋ฌธ์ RouterLinkActive ์ง์๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. ์ง์๋ฌธ์ ๋งํฌ๊ฐ ํ์ฌ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ CSS ํด๋์ค๋ฅผ ์๋์ผ๋ก ์ค์ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํ์ฌ ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํฌ ๋ ์ ํ๋ ๋ฉ๋ด ํญ๋ชฉ์ ์คํ์ผ์ ์ง์ ํ ์ ์๋ค.
๋ผ์ฐํฐ ์๋น์ค์ ํด๋น ๋ฉ์๋ navigate ()๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์์ ํ์ ํ ์๋ ์๋ค. ์์ ํ ์ฌ์ฉ์๋ฅผ ๋ฆฌ๋๋ ์ ํ๋ ค๋ ๊ฒฝ์ฐ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ๋๋ค.
์ด ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์์๋ก ํ์ ํ ๊ฒฝ๋ก๊ฐ์๋ ๋งค๊ฐ ๋ณ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค. URL์ ๋งค๊ฐ ๋ณ์๋ฅผ ํฌํจํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ ๋์ URL์ ์ ์ํ๋ ๊ฒ์ด ์ข๋ค. ์๋ฅผ ๋ค์ด ponyies / the-pony- / the-pony-name-the-pony ๊ฐ์ ์ด ํ์ด์ง์ ์๋ฏธ์๋ URL์ด ์๋ ์กฐ๋๋ง์ ๋ํ ์ธ๋ถ ์ ๋ณด ํ์ด์ง๋ฅผ ํ์ํ๋ ค๊ณ ํ๋ค.
๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด ํ๋ ๋๋ ์ฌ๋ฌ ๊ฐ์ ๋์ ๋งค๊ฐ ๋ณ์๋ก ๊ตฌ์ฑ์์ ๊ฒฝ๋ก๋ฅผ ์ ์ํ์
๊ทธ๋ฐ ๋ค์ routerLink๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๋งํฌ๋ฅผ ์ ์ ํ ์ ์๋ค.
๋ฌผ๋ก ๋์ ๊ตฌ์ฑ ์์๋ ์ฃผ์ด์ง ์๋ณ์๋ก ํฌ๋๋ฅผ ๋ก๋ํ๊ณ ํ์ ํ ์ ์๋๋ก ์ด๋ฌํ ๋งค๊ฐ ๋ณ์์ ์ก์ธ์ค ํด์ผ ํ๋ค. ๋งค๊ฐ ๋ณ์ ๊ฐ์ ์ป๊ธฐ ์ํด ๋ผ์ฐํฐ๋ ActivatedRoute๋ผ๋ ๊ตฌ์ฑ ์์์ ๋ฌผ๋ก ์ฝ์ ํ ์์๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. ์ด ๊ฐ์ฒด๋ ngOnInit ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋งค์ฐ ์ ์ฉํ ํ๋ ์ธ ์ค๋ ์ท์ด ์๋ค. ์ด ํ๋์๋ params์์๋ URL์ ๋ชจ๋ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ค!
์ด ๊ณ ๋ฆฌ๋ ๋ณผ ์์๋ ๊ฒ ์ฒ๋ผ ๊ตฌ์ฑ ์์์ ์ด๊ธฐํ ์์ ์ ์ํํ๊ธฐ์๋ ์ข๋ค. ๋น์ ์ด ๋ฐ๊ฒฌํ์์ง๋ ๋ชจ๋ฅด๋ ๊ฒ์ ๋ฐ๋ผ, ์ฐ๋ฆฌ๋ ์ค๋ ์ฌ์ง์ ์ฌ์ฉํ๊ณ ์๋ค. ์ค๋ ์ท์ด ์๋ ๋ฒ์ ์ด ์๋๊ฐ? ๊ทธ๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋งค๊ฐ ๋ณ์ ๋ณ๊ฒฝ์ ๊ตฌ๋ ํ ์์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ด ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ์ params๋ผ๊ณ ํ๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค : ๋ผ์ฐํฐ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฌ์ฉ ํ๋ค! ์ฐ๋ฆฌ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ ์กฐ๋๋ง์ ๋ณผ ์์๋ "๋ค์"๋ฒํผ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ์ฌ์ฉ์๊ฐ ํด๋ฆญ ํ ๋ URL์ / ponies / 1์์ / ponies / 2๋ก ๋ณ๊ฒฝ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ผ์ฐํฐ๊ฐ ๊ตฌ์ฑ ์์ ์ธ์คํด์ค๋ฅผ ๋ค์ ์ฌ์ฉํ๋ค. ์ฆ, ngOnInit์ด ๋ค์ ํธ์ถ๋์ง ์๋๋ค! ์ด๋ฌํ ์ข ๋ฅ์ ํ์์ ์ํด ๊ตฌ์ฑ ์์๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๋ฉด params observable์ ์ฌ์ฉํ๋ ๊ฒ ์ธ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ค!
์ฌ๊ธฐ์๋ ActivatedRoute์์ ์ ๊ณตํ๋ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ๊ตฌ๋ ํ๊ณ ํ๋์ ๊ตฌ๋ ์ ์ ์ฅํ๋ฏ๋ก ๋์ค์ ngOnDestroy์์ ๊ตฌ๋ ์ ์ทจ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํผํ ์ ์๋ค. ์ด์ URL์ด '/ ponies / 1'์์ '/ ponies / 2'๋ก ๋ฐ๋ ๋๋ง๋ค ๊ด์ฐฐ ํ ์์๋ ๋งค๊ฐ ๋ณ์๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ณ ํ๋ฉด์ ํ์ ํ ์ฌ๋ฐ๋ฅธ ์กฐ๋๋ง์ ๊ฐ์ ธ์จ๋ค. params ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌ๋ ํ ๋ด๋ถ์ PonyService ๊ฒฐ๊ณผ์ ๊ฐ์ ํ๋ ๋์ ์ข๋ ์ฐ์ํ switchMap ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Reference URL
Last updated