์ถ์ฒ: https://kr.vuejs.org/v2/guide/comparison.html
Vue.js์ ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ์ ๋น๊ต์ ๋ํ ์ ๋ณด๋ฅผ ์คํฌ๋ฉ ํด๋ก๋๋ค.
์์ธํ ๋ด์ฉ์ vue.js ํํ์ด์ง์์ ๋ ํ์ธํด๋ณผ์ ์์ต๋๋ค.
์ด ์น์ ์ ์์ฑํ๊ธฐ ๊ฐ์ฅ ๊น๋ค๋ก์ด ํ์ด์ง์ด์ง๋ง, ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น์ ์ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ๊ฐ ์์์ ๊ฒ์ด๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ Vue๊ฐ ํน์ ๋ฌธ์ ๋ฅผ ๋ ์ ํด๊ฒฐํ ์ ์๋์ง ์๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ์ด ๊ฒ์ ๋ณด๊ณ ์์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋น์ ์ ์ํด ๋งํ๊ณ ์ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ํธ๊ฒฌ์ ํผํ๋ ค๊ณ ์์ฃผ ์ด์ฌํ ํ๊ณ ์์ต๋๋ค. ์ฝ์ด ํ์ผ๋ก์ ์ฐ๋ฆฌ๋ Vue๋ฅผ ์ข์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ๋ ์ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ๋ฏฟ์ง ์๋๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ ์ด์ ์ฐ๊ตฌํ์ง ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ณต์ ํ๊ณ ์ ํํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. React์ ๋์ฒด ๋ ๋๋ฌ์ ๋ํ React์ ๊ด๋ฒ์ํ ์ํ๊ณ ๋๋ Knockout์ IE6์ ๋ํ ๋ธ๋ผ์ฐ์ ์ง์๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์ํ ์ด์ ์ ์ ๊ณตํ๋ ๋ฑ์ด ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๋ ค๋ ๊ฒ ์ ๋๋ค.
์๋ฐ ์คํฌ๋ฆฝํธ ์ธ๊ณ๊ฐ ๋น ๋ฅด๊ฒ ์์ง์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๋ ๋น์ ์ ๋์์ ๋ฐ๊ธธ ๋ฐ๋๋๋ค. ์ ํํ์ง ์๋ค๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ด๋ ์๋ชป๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ๋ฌธ์ ์ ๊ธฐ๋ก ์๋ ค์ฃผ์ญ์์ค.).
React์ Vue๋ ๋ง์ ๊ณตํต์ ์ ๊ณต์ ํฉ๋๋ค.
๊ฐ์ DOM์ ํ์ฉํฉ๋๋ค.
๋ฐ์์ ์ด๊ณ ์กฐํฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฝ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ง ์ง์คํ๊ณ ์๊ณ ๋ผ์ฐํ
๋ฐ ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ปดํจ๋์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
๋ฒ์๊ฐ ๋๋ฌด ๋น์ทํ๊ธฐ ๋๋ฌธ์ ์ด ๋น๊ต๋ฅผ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ณด๋ค ์์ธํ๊ฒ ๋ณด๋๋ฐ ๋ ๋ง์ ์๊ฐ์ ํฌ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ์ ์ ์ ํ์ฑ๋ฟ๋ง ์๋๋ผ ๊ท ํ์ ์ ์งํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. React๊ฐ Vue๋ณด๋ค ๋ ๋น๋๋ ๊ณณ, ์๋ฅผ ๋ค์ด ์ํ๊ณ๊ฐ ํ๋ถํ๊ณ ์ปค์คํ
๋ ๋๋ฌ๊ฐ ํ๋ถํ๋ค๋ ์ ์ ์ง์ ํฉ๋๋ค.
๊ทธ๋ ๋ค๊ณ ํด์ ๋น๊ต ๋์์ด ์ผ๋ถ React ์ฌ์ฉ์์๊ฒ Vue์ ํธํฅ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ํผํ ์ ์๋ ์ฌ์ค์ ๋๋ค. ๋ง์ ์ฃผ์ ๊ฐ ํ๊ตฌ๋๋ ๊ฒ์ ์ด๋ ์ ๋ ์ฃผ๊ด์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์ํ ๊ธฐ์ ์ ์ทจํฅ์ ์กด์ฌ๋ฅผ ์ธ์ ํฉ๋๋ค. ์ด ๋น๊ต๋ Vue๊ฐ ์ฐ๋ฆฌ์ ํ๊ฒฝ ์ค์ ๊ณผ ์ผ์น ํ ๊ฐ๋ฅ์ฑ์ด์์ ๋ Vue๊ฐ ์ ์ฌ์ ์ผ๋ก ๋ ์ ํฉํ ์์๋ ์ด์ ๋ฅผ ๋๋ต์ ์ผ๋ก ์ค๋ช ํ๊ธฐ์ํ ๊ฒ์ ๋๋ค.
React ํ์ Dan Abramov ๋๋ถ์ React ์ปค๋ฎค๋ํฐ๋ ์ด๋ฌํ ๊ท ํ์ ์ด๋ฃจ๋๋ฐ ๋์์ด ๋์์ต๋๋ค. ๊ทธ๋ ์ฐ๋ฆฌ๊ฐ ์ต์ข ๊ฒฐ๊ณผ์ ๋ํด ๋ชจ๋ ๋ง์กฑํ ๋๊น์ง์ด ๋ฌธ์๋ฅผ ์์ ํ๋ ๋ฐ ๋์์ด๋๋ ์๊ฐ๊ณผ ์๋นํ ์ ๋ฌธ์ฑ์ ์ง๊ทนํ ๊ด๋ํ์ต๋๋ค.
์ง๊ธ๊น์ง ํ ์คํธ ํ ๋ชจ๋ ์ค์ ์๋๋ฆฌ์ค์์ Vue๋ React๋ณด๋ค ์๋ฑํ ์ฐ์ํฉ๋๋ค. ๋๋ผ์ จ๋ค๋ฉด, ๋ ์ฝ์ด๋ณด์ญ์์ค. ์ฐ๋ฆฌ๋ ์ ๊ทธ๋ฐ์ง(๊ทธ๋ฆฌ๊ณ ์ฌ์ง์ด๋ React ํ๊ณผ ํ๋ ฅํ์ฌ ๊ฐ๋ฐ ๋ ๋ฒค์น ๋งํฌ๋ฅผ ํฌํจ์์ผฐ์ต๋๋ค.)๋ฅผ ๋ถ์ ํ ๊ฒ์ ๋๋ค.
๋ ๋๋ง ์ฑ๋ฅ
UI๋ฅผ ๋ ๋๋ง ํ ๋ ์ผ๋ฐ์ ์ผ๋ก DOM์ ์กฐ์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ด๋ฉฐ ์ ๊ฐ์ค๋ฝ๊ฒ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฌํ ์์ ์์
์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ํ DOM ์กฐ์ ์๋ฅผ ์ต์ํํฉ๋๋ค. React์ Vue๋ ๋ชจ๋ ๊ฐ์์ DOM ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ์ํํ๋ฉฐ ๋๊ฐ์ง ๊ตฌํ ๋ชจ๋ ๊ฑฐ์ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค.
DOM ์กฐ์์ ๊ฐ๋ฅํ ์ ์ ์ค๋ฒํค๋(์์ JavaScript ๊ณ์ฐ)๋ง ๊ฐํฉ๋๋ค. ์ด ๊ฒ์ Vue์ React์ ์ฐจ์ด์ ๋๋ค.
JavaScript์ ์ค๋ฒํค๋๋ ํ์ํ DOM ์์ ์ ๊ณ์ฐํ๋ ๋ฉ์ปค๋์ฆ๊ณผ ์ง์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์ต๋๋ค. Vue์ React ๋ชจ๋ ๊ฐ์ DOM์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๊ตฌํํ์ง๋ง Vue์ ๊ฐ์ DOM ๊ตฌํ(snabbdom์ ํฌํฌ)์ ํจ์ฌ ๊ฐ๋ฒผ์ฐ๋ฏ๋ก React๋ณด๋ค ๋ ์ ์ ์ค๋ฒ ํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
Vue์ React ๋ชจ๋ ์ํ๊ฐ ์๊ณ ๋ฐ ์ธ์คํด์ค๊ฐ ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ค๋ฒ ํค๋๊ฐ ์ ์ต๋๋ค. ์ด๋ฌํ ์ฑ๋ฅ์ด ์ค์ํ ์ํฉ์์ ์ฌ์ฉ๋๋ฉด Vue๊ฐ ๋ค์ ํ ๋ฒ ๋ ๋น ๋ฆ ๋๋ค. ์ด๋ฅผ ์ ์ฆํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ 10,000 ๊ฐ์ ๋ชฉ๋ก ํญ๋ชฉ์ 100 ๋ฒ ๋ ๋๋งํ๋ ๊ฐ๋จํ ๋ฒค์น ๋งํฌ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ํ๋์จ์ด์ ์ฌ์ฉ๋๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฏ๋ก ์ค์ ๋ก ์๋ํด ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ค์ ๋ก๋ JavaScript ์์ง์ ํน์ฑ์ผ๋ก ์ธํด ์คํ๊ฐ์ ์ฐจ์ด๋ ์์ต๋๋ค.
์ฝ๊ฐ ๊ท์ฐฎ๋๋ผ๋, ์๋๋ 2014 ๋ MacBook Air์ Chrome 52์์ ์คํ ๋ ์ซ์์ ๋๋ค. ์ฒด๋ฆฌ ํผํน์ ํผํ๊ธฐ ์ํด ๋ ๋ฒค์น ๋งํฌ๋ ์ค์ ๋ก 20๋ฒ์ ๋ณ๋ ์๊ฐ์ ์คํ๋์์ผ๋ฉฐ ์๋์ ํฌํจ ๋ ์ต์์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค.
| - | Vue | React |
|---|---|---|
| Fastest | 23ms | 63ms |
| Median | 42ms | 81ms |
| Average | 51ms | 94ms |
| 95th Perc. | 73ms | 164ms |
| Slowest | 343ms | 453ms |
๊ฐฑ์ ์ฑ๋ฅ
React์์๋ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ์์ ๋ฃจํธ๋ก ์์ํ์ฌ ์ ์ฒด ์ปดํฌ๋ํธ ํ์ ํธ๋ฆฌ๋ฅผ ๋ค์ ๋ ๋๋งํฉ๋๋ค. ๋ถํ์ํ ์์ ์ปดํฌ๋ํธ์ ์ฌ ๋ ๋๋ง์ ํผํ๋ ค๋ฉด ์ด๋์์๋ shouldComponentUpdate๋ฅผ ๊ตฌํํ๊ณ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Vue์์ ์ปดํฌ๋ํธ์ ์ข
์์ฑ์ ๋ ๋๋ง ์ค ์๋์ผ๋ก ์ถ์ ๋๋ฏ๋ก ์์คํ
์ ์ค์ ๋ก ๋ค์ ๋ ๋๋งํด์ผํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ํํ ์๊ณ ์์ต๋๋ค.
์ฆ ์ต์ ํ๋์ง ์์ Vue์ ์ ๋ฐ์ดํธ๋ ์ต์ ํ๋์ง ์์ React๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ฉฐ ์ค์ ๋ก Vue์ ๋ ๋๋ง ์ฑ๋ฅ์ด ํฅ์๋๋ฏ๋ก ์์ ํ ์ต์ ํ ๋ React๋ ๋ณดํต Vue๊ฐ ๊ธฐ๋ณธ ์ ๊ณต๋๋ ๊ฒ๋ณด๋ค ๋๋ฆฝ๋๋ค.
๊ฐ๋ฐ์ ์์ด์
ํ๋ก๋์
ํ๊ฒฝ์์์ ์ฑ๋ฅ์ ์ต์ข
์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ง์ ๊ด๋ จ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ ์ค์ํ ๋ถ๋ถ์ด์ง๋ง ๊ฐ๋ฐ ๊ฒฝํ์ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ๊ด๋ จ๋์ด ์์ผ๋ฏ๋ก ์ฌ์ ํ ์ค์ํฉ๋๋ค.
Vue์ React ๋ชจ๋ ๊ฑฐ์ ๋๋ถ๋ถ์ ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋๊ฐ ๋น ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ๋์ ํ๋ ์ ์๋์ ๋ฐ์ดํฐ ์๊ฐํ ๋๋ ์ ๋๋ฉ์ด์ ์ ํ๋กํ ํ์ดํ ํ ๋ Vue๋ ๊ฐ๋ฐ์ ์ด๋น 10 ํ๋ ์์ ์ฒ๋ฆฌํ๋ ๋ฐ๋ฉด React๋ ์ด๋น ์ฝ 1 ํ๋ ์์ผ๋ก ๋จ์ด์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์์ต๋๋ค.
์ด๊ฒ์ ๋ง์ ์ฐ์ํ ๊ฒฝ๊ณ ์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๋ ๋ฐ ๋์์ด๋๋ ๊ฐ๋ฐ ๋ชจ๋์์์ React์ ๋ง์ ๋ฌด์ง์ํ ๊ฒ์ฌ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๊ฒ๋ค์ด Vue์์๋ ์ค์ํ๋ค๋ ๊ฒ์ ๋์ํ์ง๋ง, ์ด๋ฅผ ์ดํํ๋ ๋์ ์ฑ๊ณผ๋ฅผ ๋ฉด๋ฐํ ๊ด์ฐฐํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
React์์๋ ๋ชจ๋ ๊ฒ์ด JavaScript๋ง์ผ๋ก ๋งค์ฐ ์ฌํํ๊ณ ์ฐ์ํ ๋๋์ ์ค๋๋ค. ๋ถํํ ํ์ค์ JavaScript๋ด์์ HTML๊ณผ CSS๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ธฐ์กด ๋ชจ๋ธ์ ์ผ๋ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ๋ ์์ฒด์ ์ผ๋ก ๊ณ ํต์ ์ด๋ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. Vue์์ ๋์ ์ฐ๋ฆฌ๋ ์น ๊ธฐ์ ์ ์์ฉํ๊ณ ๊ทธ ์์ ๊ตฌ์ถํ์ต๋๋ค. ๊ทธ ์๋ฏธ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
Vue๋ ๊ณ ์ ์ ์น ๊ธฐ์ ์ ๋ฐ์๋ค์ด๊ณ ๊ทธ ์์์ ๋ง๋ญ๋๋ค. ์ด ์๋ฏธ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ๋ช๊ฐ์ง ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
React์์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ JavaScript ๋ด์์ ์๋ํ๋ ์ ์ธ์ XML ์ ์ฌ ๊ตฌ๋ฌธ ์ธ JSX๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง ํจ์ ๋ด์์ UI๋ฅผ ํํํฉ๋๋ค. ๋ค์์ React ์ปค๋ฎค๋ํฐ์ ์ํด ์ฌ์ฌ๋ฐ์ ์ ์ ๋๋ค.
render () {
let { items } = this.props
let children
if (items.length > 0) {
children = (
No items found.
JSX๋ก ๋ ๋ํ๋ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค.
์ ์ฒด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด (JavaScript)์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํ๋ฉด๋ฅผ ๋น๋ ํ ์ ์์ต๋๋ค.
JSX์ ํด๋ง ์ง์ (์: linting, ํ ๊ฒ์ฌ, ์๋ํฐ ์๋์์ฑ)์ ํ์ฌ Vue ํ
ํ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ์ง๋ณด ๋ ๊ธฐ๋ฅ์
๋๋ค.
Vue์์ ์ฐ๋ฆฌ๋ ๋ํ ๋ ๋๋ง ํจ์์ ์ฌ์ง์ด JSX ์ง์์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋๋ก๋ ๊ทธ ๊ฐ๋ ฅํจ์ด ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๋ ๊ฐ๋จํ ๋์์ผ๋ก ํ
ํ๋ฆฟ์ ์ ๊ณตํฉ๋๋ค.
HTML๋ก ์์
ํด์จ ๋ง์ ๊ฐ๋ฐ์์๊ฒ ํ
ํ๋ฆฟ์ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค. ๊ธฐ๋ณธ ์ค์ ์์ฒด๋ ๋ค์ ์ฃผ๊ด์ ์ผ ์ ์์ผ๋ ๊ฐ๋ฐ์๊ฐ ์์ฐ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ
ํ๋ฆฟ์ ์์ฑํ๋ ๋์ ๊ตฌํ ๋ฐ ๋ฌธ๋ฒ ๊ฒฐ์ ์ ์ค์
๋๋ค.
ํ
ํ๋ฆฟ์ ํญ์ ์ ์ธ์ ์
๋๋ค.
๋ชจ๋ ์ ํจํ HTML์ด ํ
ํ๋ฆฟ์์ ์ ํจํฉ๋๋ค.
์์ด์ ๋น์ทํฉ๋๋ค (์: ํญ๋ชฉ๋ค ์ค ๊ฐ ํญ๋ชฉ).
์๋ฐ ์คํฌ๋ฆฝํธ์ ๊ณ ๊ธ ๋ฒ์ ์ ๊ฐ๋
์ฑ์ ๋์ด๊ธฐ ์ํด ์๊ตฌ๋์ง ์์ต๋๋ค.
์ด๋ ๊ฐ๋ฐ์๊ฐ ์์ฑํ๋ ๊ฒ์ด ํจ์ฌ ์ฌ์ธ๋ฟ๋ง ์๋๋ผ ์ค๊ณ์์ ๊ฒฝํ์ด ๋ถ์กฑํ ๊ฐ๋ฐ์๋ ํ์ฑ ๋ฐ ์ฝ๋ ์์ฑ์ ํจ์ฌ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
ํ ํ๋ฆฟ์ ์์ฑํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ DSL(Domain-Specific Language)๋ฅผ ๋ฐฐ์์ผํ๋ค๊ณ ๋งํ๋ ์ฌ๋๋ค๋ ์์ต๋๋ค. ์ด ์ฐจ์ด๋ ํ๋ฉด์ ์ ๋๋ค. ์ฒซ์งธ๋ก JSX๋ ์ฌ์ฉ์๊ฐ ์๋ฌด๊ฒ๋ ๋ฐฐ์ธ ๊ฒ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์ฆ, ์ผ๋ฐ JavaScript ์์ ์ถ๊ฐ ๊ตฌ๋ฌธ์ด ์์ผ๋ฏ๋ก JavaScript์ ์ต์ํ ์ฌ๋์ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์์ง๋ง ๋ณธ์ง์ ์ผ๋ก ๋ฐ๋ก ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ชป๋ ๊ฒ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ํ ํ๋ฆฟ์ ์ผ๋ฐ์ ์ธ HTML์์ ์ถ๊ฐ ๊ตฌ๋ฌธ์ผ ๋ฟ์ด๋ฏ๋ก ์ด๋ฏธ HTML์ ์ต์ํ ์ฌ์ฉ์๋ค์๊ฒ๋ ํ์ต ๋น์ฉ์ด ๋งค์ฐ ์ ์ต๋๋ค. DSL์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ์ ์ ์ฝ๋ (์ v-on)์ผ๋ก ๋ ๋ง์ ๊ฒ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋์ผํ ์์ ์๋ ์ผ๋ฐ์ ์ธ JSX ๋๋ ๋ ๋๋ง ํจ์๋ฅผ ์ฌ์ฉํ ๋ ๋ ๋ง์ ์ฝ๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
์์ ๋ ๋ฒจ์์, ์ฐ๋ฆฌ๋ ์ปดํฌ๋ํธ๋ฅผ ๋๊ฐ์ ์นดํ ๊ณ ๋ฆฌ, ์ฆ ํ๋ ์ ํ ์ด์ ๊ณผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค. ํ๋ ์ ํ ์ด์ ์ปดํฌ๋ํธ ์ฉ ํ ํ๋ฆฟ์ ์ฌ์ฉํ๊ณ ๋ ผ๋ฆฌ์ ์ปดํฌ๋ํธ / JSX๋ฅผ ๋ ๋๋ง ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฌํ ์ปดํฌ๋ํธ์ ๋น์จ์ ๊ตฌ์ถ์ค์ธ ์ฑ์ ํํ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์ ํ ์ด์ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
์ปดํฌ๋ํธ ๋ฒ์์ CSS
์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ํ์ผ (์: CSS ๋ชจ๋)์ ํตํด ๋ฐฐํฌํ์ง ์๋ ํ React์ CSS ๋ฒ์ ์ง์ ์ CSS-in-JS ๋ฐฉ์์ผ๋ก ํด๊ฒฐํฉ๋๋ค. (e.g. styled-components, glamorous, ๊ทธ๋ฆฌ๊ณ emotion) ์ด๋ ์ผ๋ฐ์ ์ธ CSS ์์ฑ ํ๋ก์ธ์ค์๋ ๋ค๋ฅธ ์๋ก์ด ์ปดํฌ๋ํธ ์งํฅ ์คํ์ผ๋ง ํจ๋ฌ๋ค์์ ๋์
ํฉ๋๋ค. ๋ํ ๋น๋ํ์์ ๋จ์ผ ์คํ์ผ์ํธ์ CSS๋ฅผ ์ถ์ถํ ์ ์๋ ์ง์์ด ์์ง๋ง ์คํ์ผ์ด ์ ๋๋ก ์๋ํ๋ ค๋ฉด ๋ฐํ์์ด ๋ฒ๋ค์ ํฌํจ๋์ด์ผํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค. ์คํ์ผ์ ์์ฑํ๋ ๋์ JavaScript์ ์ญ๋์ ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ง๋ง ๋ฒ๋ค ํฌ๊ธฐ ๋ฐ ๋ฐํ์ ๋น์ฉ์ ์ข
์ข
๋์์ง๋๋ค.
CSS-in-JS์ ํฌ์ด๋ผ๋ฉด Vue๋ฅผ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์ styled-components-vue์ vue-emotion). React์ Vue์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ Vue์ ๊ธฐ๋ณธ ์คํ์ผ ์ง์ ๋ฐฉ๋ฒ์ ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ์์ ๋ณด๋ค ์ต์ํ style ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ ์ ๋๋ค.
๋ฐ๋ฉด์ Vue๋ ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ ๋ด์์ CSS์ ๋ํ ๋ชจ๋ ์ก์ธ์ค ๊ถํ์ ์ ๊ณตํฉ๋๋ค.
์ต์ ์ธ scoped ์์ฑ์ ์๋ฆฌ๋จผํธ์ ์ ์ผํ ์์ฑ(์ : data-v-21e5b78)์ ์ถ๊ฐํ๊ณ .list-container:hover๋ฅผ .list-container[data-v-21e5b78]:hover๋ก ์ปดํ์ผ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก Vue์ ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋งค์ฐ ์ ์ฐํฉ๋๋ค. vue-loader๋ฅผ ํตํด ์ ์ฒ๋ฆฌ๊ธฐ, ํฌ์คํธ ํ๋ก์ธ์ ๋ฐ CSS Modules์์ ๊ธด๋ฐํ ํตํฉ์ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์คํ์ผ์ style ์๋ฆฌ๋จผํธ ์์ ์์ต๋๋ค.
๊ท๋ชจ ํ์ฅ
๋ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ Vue์ React๋ ๊ฐ๋ ฅํ ๋ผ์ฐํ
์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. React ์ปค๋ฎค๋ํฐ๋ ๋ํ ์ํ ๊ด๋ฆฌ ์๋ฃจ์
(Flux/Redux ๋ฑ) ์ธก๋ฉด์์ ๋งค์ฐ ํ์ ์ ์
๋๋ค. ์ด๋ฌํ ์ํ ๊ด๋ฆฌ ํจํด๊ณผ ์ฌ์ง์ด Redux ์์ฒด๋ Vue ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค. ์ค์ ๋ก, Vue๋ ์ฐ์ํ ๋ชจ๋ธ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ๋ Vue์ ๊น์ด ํตํฉ๋์ด์๋ Elm์ ์๊ฐ์๋ฐ์ ์ํ ๊ด๋ฆฌ ์๋ฃจ์
์ธ Vuex๋ฅผ ํตํด ์ด ๋ชจ๋ธ์ ๋์ฑ ๋ฐ์ ์์ผฐ์ต๋๋ค.
๋ ๋ค๋ฅธ ์ค์ํ ์ฐจ์ด์ ์ ์ํ ๊ด๋ฆฌ ๋ฐ ๋ผ์ฐํ ์ ์ํ Vue์ ๊ธฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (๊ธฐํ ๊ด์ฌ์ฌ ์ค)๋ ๋ชจ๋ ๊ณต์์ ์ผ๋ก ์ง์๋๋ฉฐ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ต์ ์ํ๋ก ์ ์ง๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋๋ก React๋ ์ปค๋ฎค๋ํฐ์ ์ด๋ฌํ ๊ฒฐ์ ์ ๋งก๊ธฐ๊ณ ๋ ๋ถ์ด ๋ ์ํ๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ ํํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ React์ ์ํ๊ณ๋ Vue๋ณด๋ค ํจ์ฌ ํ๋ถํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก Vue๋ Webpack, Browserify๋๋ ๋น๋ ์์คํ ์ฌ์ฉ์ํจ์ ํฌํจํ์ฌ ์ํ๋ ๋น๋ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ์์ํ ์์๊ฒ ํด์ฃผ๋ CLI ํ๋ก์ ํธ ์์ฑ๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ญ์ โcreate-react-appโ๋ก ์ค์ ํ์ง๋ง ํ์ฌ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ด ์์ต๋๋ค.
Vue์ ํ๋ก์ ํธ ํ
ํ๋ฆฟ์ Yeoman๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ์๋ฅผ ํ์ฉํ์ง๋ง ํ๋ก์ ํธ ์์ฑ ์ค์๋ ์ด๋ ํ ๊ตฌ์ฑ๋ ํ์ฉํ์ง ์์ต๋๋ค.
๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ๋ค๊ณ ๊ฐ์ ํ๋ ๋จ์ผ ํ
ํ๋ฆฟ๋ง ์ ๊ณตํ๋ฉฐ, Vue๋ ๋ค์ํ ๋ชฉ์ ์ ์ํด ๋ค์ํ ํ
ํ๋ฆฟ๋ฅผ ์ ๊ณตํ๊ณ ์์คํ
์ ๋น๋ํฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ํ
ํ๋ฆฟ์์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ ์ฌ์ ์ ์๋ ๊ท์น์ ์ฌ์ฉํ๋ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์ ํนํ ์ ์ฉ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ ํ ์ฌํญ ์ค ์๋น์๋ create-react-app ํ์ด ์๋์ ์ผ๋ก ์ค๊ณํ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ก์ ํธ์ ์๊ตฌ๊ฐ ๋งค์ฐ ๊ฐ๋จํ๊ณ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉ์ ์ ์ํ๊ธฐ ์ํด โ์ถ์ถโํ ํ์๊ฐ์๋ ํ, ์ด๋ฅผ ์ข
์์ผ๋ก ์
๋ฐ์ดํธ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ค๋ฅธ ์ฒ ํ์ ๋ํด ๋ ๋ง์ด ์ฝ์ ์ ์์ต๋๋ค.
๊ท๋ชจ ์ถ์
React๋ ๊ฐํ๋ฅธ ํ์ต ๊ณก์ ์ผ๋ก ์ ๋ช
ํฉ๋๋ค. ์ค์ ๋ก ์์ํ๊ธฐ ์ ์ JSX์ ์๋ง๋ ES2015+์ ๋ํด ์์์ผํฉ๋๋ค. ๋ง์ ์์ ๊ฐ React์ ํด๋์ค ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค. Babel Standalone์ ๊ธฐ์ ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๋ฅผ ๋ผ์ด๋ธ ์ปดํ์ผ ํ ์๋ ์์ง๋ง ์์ฑ์ ์ ํฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น๋ ์์คํ
์ ๋ํด์๋ ๋ฐฐ์์ผํฉ๋๋ค.
Vue๋ React๋งํผ ํ์ฅ์ฑ์ด ๋ฐ์ด๋์ง ์์ง๋ง, jQuery์ฒ๋ผ ๋ณต์กํ ์ค์ ์์ด ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ๋ถ์ด๋ ๊ฒ์ผ๋ก Vue๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
script src="https://cdn.jsdelivr.net/npm/vue" /script
Vue ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํด ๊ฑฑ์ ํ ํ์์์ด ๊ฑฑ์ ํ์ง ์๊ณ ์ต์ํ ๋ฒ์ ์ ๋ฐฐํฌ ๋ฒ์ ์ ์ ๊ณต ํ ์ ์์ต๋๋ค.
Vue๋ฅผ ์์ํ๊ธฐ ์ํด JSX, ES2015 ๋๋ ๋น๋ ์์คํ ์ ๋ํด ์ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์ผ์์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ฐ ํ์ํ ์ถฉ๋ถํ ์ง์์ ์ป๊ธฐ ์ํด ๊ฐ์ด๋๋ฅผ ์ฝ๋ ๋ฐ ํ๋ฃจ๊ฐ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
ReactNative๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ React ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ iOS ๋ฐ Android ์ฉ ๊ธฐ๋ณธ ๋ ๋๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฐ์๋ก์ ์ฌ๋ฌ ํ๋ซํผ์์ ์ ๋ํ ์ง์์ ์ ์ฉํ ์ ์๋ค๋ ์ ์์ ๋งค์ฐ ์ข์ต๋๋ค. Vue๋ Vue๋ฅผ JavaScript ๋ฐํ์์ผ๋ก ์ฌ์ฉํ๋ Alibaba Group์์ ๊ฐ๋ฐ ํ ํฌ๋ก์ค ํ๋ซํผ UI์ธ Weex์ ๊ณต์ ํ์ ์ ๋งบ๊ณ ์์ต๋๋ค. ์ฆ, Weex๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ Vue ์ปดํฌ๋ํธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋งํ ์ ์์ ๋ฟ๋ง ์๋๋ผ iOS ๋ฐ Android์์๋ ๋ ๋๋ง ํ ์์๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค!
ํ์ฌ Weex๋ ์์ง ๊ฐ๋ฐ ์ค์ด๋ฉฐ ReactNative๋งํผ ์ฑ์ํ๊ณ ์ ํฌ์ ์ธ ํ ์คํธ๋ฅผ ๊ฑฐ์น์ง๋ ์์์ง๋ง ๊ฐ๋ฐ์ ์ธ๊ณ ์ต๋์ ์ ์ ์๊ฑฐ๋ ๋น์ฆ๋์ค์ ์์ฐ ์๊ตฌ์ ์ํด ์ฃผ๋๋๊ณ ์๊ณ Vue ํ์ ์ ๊ทน์ ์ผ๋ก ํ๋ ฅ ํ ๊ฒ์ ๋๋ค. Weex ํ๊ณผ ํจ๊ป Vue ๊ฐ๋ฐ์๋ฅผ์ํ ์ํํ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
NativeScript๋ ๋ ๋ค๋ฅธ ๋์์ ๋๋ค. ์ปค๋ฎค๋ํฐ ์ฃผ๋ ํ๋ฌ๊ทธ์ธ์ด ๊ฐ๋ฐ ์ค์ ๋๋ค.
MobX๋ React ์ปค๋ฎค๋ํฐ์์ ๊ฝค ์ ๋ช ํด์ก๊ณ ์ค์ ๋ก Vue์ ๊ฑฐ์ ๊ฐ์ ๋ฐ์ํ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค. ์ ํ๋ ๋ฒ์ ๋ด์์ React + MobX ์ํฌํ๋ก์ฐ๋ ์ข ๋ ์ฅํฉํ Vue๋ก ์๊ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์กฐํฉ์ ์ฌ์ฉํ๊ณ ์๊ณ ๊ทธ๊ฒ์ ์ฆ๊ธฐ๊ณ ์๋ค๋ฉด Vue๋ก ๋์ด์ค๋ ๊ฒ์ด ์๋ง๋ ๋ค์ ๋จ๊ณ์ผ ๊ฒ์ ๋๋ค.
์ผ๋ถ Vue์ ๋ฌธ๋ฒ์ Angular์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค (์ :v-if์ng-if). Angular๊ฐ ์ ๋๋ก ๋ ๋ง์ ๊ฒ๋ค์ ๊ฐ์ง๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๊ฐ๋ฐ ์ด๊ธฐ์ Vue์๊ฒ ์๊ฐ์ด ๋์์ต๋๋ค. Angular์ ํจ๊ป ์ ๊ณต๋๋ ๋ง์ ๊ณ ํต์ด ์์์ง๋ง Vue๊ฐ ์๋นํ ๊ฐ์ ์ ์ ๊ณตํ๋ ค๊ณ ์๋ํ์์ต๋๋ค.
Vue๋ API์ ๋์์ธ๋ฉด์์ Angular 1๋ณด๋ค ํจ์ฌ ๊ฐ๋จํฉ๋๋ค. ํ๋ฒํ์ง ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ธฐ์ ์ถฉ๋ถํ ํ์ต๊ธฐ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก 1 ์ผ ๋ฏธ๋ง์ผ๋ก ์์๋๋ฉฐ Angular 1์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
Angular๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํด์ผ ํ๋์ง์ ๋ํ ๊ฐ์๊ฐ ๊ฐํ๊ณ Vue๋ ๋์ฑ ์ ์ฐํ๊ณ ๋ชจ๋๋ฐฉ์์ ์๋ฃจ์ ์ ๋๋ค. ์ด๋ก ์ธํด Vue๋ ๋ค์ํ ํ๋ก์ ํธ์๋ณด๋ค ์ ํฉํ๊ฒ ์ ์ฉ๋ ์ ์์ผ๋ฉฐ, ๋๋ก๋ ์ฝ๋ฉ์ ์์ํ๊ธฐ ์ํด ์์ฌ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋๋ฐ ์ ์ฉ ํ ๋๊ฐ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํซ ๋ชจ๋ ๋ฆฌ๋ก๋ฉ, ๋ฆฐํธ (linting), CSS ์ถ์ถ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ๋์์ ๋น ๋ฅด๊ฒ ์ค์ ํ ์์๋ Webpack ํ ํ๋ฆฟ์ ์ ๊ณตํฉ๋๋ค.
Angular 1์ ์ค์ฝํ๊ฐ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ๋ฐ๋ฉด Vue๋ ์ปดํฌ๋ํธ ๊ฐ์ ๋จ๋ฐฉํฅ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ก ์ธํด ๋ฐ์ดํฐ์ ํ๋ฆ์ด ๋จ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค.
Vue๋ ๋๋ ํฐ๋ธ์ ์ปดํฌ๋ํธ๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํฉ๋๋ค. ์ง์์ด๋ DOM ์กฐ์๋ง ์บก์ํ ํ๊ธฐ ์ํ ๊ฒ์ด๊ณ ์ปดํฌ๋ํธ๋ ์์ฒด ๋ทฐ์ ๋ฐ์ดํฐ ๋ก์ง์ด ์๋ ์์ฒด์ ํฌํจ ๋จ์์ ๋๋ค. Angular์์๋ ์ด ๋ ์ฌ์ด์ ๋ง์ ํผ๋์ด ์์ต๋๋ค.
Vue๋ ๋ ๋์ ์ฑ๋ฅ์ ๊ฐ์ง๋ฉฐ ๋ณ๊ฒฝ์ ๋ํ ๊ฒ์ฌ๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ์ฝ๊ฒ ์ต์ ํ ํ ์ ์์ต๋๋ค. Angular 1์ ๊ฐ์์๊ฐ ๋ง์ผ๋ฉด ๋๋ ค์ง๋๋ค. ๋ฒ์๊ฐ ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ์ด๋ฌํ ๋ชจ๋ ๊ฐ์์๋ฅผ ๋ค์ ํ๊ฐํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ ์ผ๋ถ ๊ฐ์์๊ฐ ๋ค๋ฅธ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒฝ์ฐ ๋ค์ด์ ์คํธ ์ฃผ๊ธฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ์ฌ โ์์ ํโํด์ผ ํ ์๋ ์์ต๋๋ค. Angular ์ฌ์ฉ์๋ ๋ค์ด์ ์คํธ ์ฃผ๊ธฐ๋ฅผ ๋ฒ์ด๋๊ธฐ ์ํด ์ข ์ข ์จ๊ฒจ์ง ๊ธฐ์ ์ ์์งํด์ผํ๋ฉฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ง์ ๊ฐ์์์ ํจ๊ป ๋ฒ์๋ฅผ ์ต์ ํ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Vue๋ ๋น๋๊ธฐ ๋๊ธฐ์ด์ด ์๋ ํฌ๋ช ํ ์ข ์์ฑ ์ถ์ ๊ด์ฐฐ ์์คํ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ๊ฐ ์ ํ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ช ์์ ์ข ์ ๊ด๊ณ๊ฐ ์๋ ํ ๋ ๋ฆฝ์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ AngularJS์ Vue๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ด ์์ต๋๋ค.
Angular 2๋ ์์ ํ ์๋ก์ด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์น์ ์ ๋ง๋ค์์ต๋๋ค. ์๋ฅผ ๋ค์ด, 1๊ธ ์ปดํฌ๋ํธ ์์คํ ์ด ์์ผ๋ฉฐ ๋ง์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด ์์ ํ ๋ค์ ์์ฑ ๋์์ผ๋ฉฐ API๋ ์๋นํ ํฌ๊ฒ ๋ณ๊ฒฝ๋์์ต๋๋ค.
Angular๋ TypeScript๊ฐ ํ์์ ์ ๋๋ค. ๋ฌธ์ ๋ํ TypeScript ๊ธฐ๋ฐ์ ๋๋ค. TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด Java์ C#์ ๋ค๋ฃจ๋ ์ฌ์ฉ์์๊ฒ ์์ฐ์ฑ์ ์ฌ๋ ค์ฃผ๊ณ ์ ์ ํ์ ์ฒดํฌ ๋ฑ์ ๋ง์ ์ด์ต์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ๋๋ค์ด TypeScript๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ ์์ต๋๋ค.
๋ง์ ์๊ท๋ชจ ์ฌ๋ก์์ TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฐ์ฑ ํฅ์๋ณด๋ค ๋ ๋ง์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ TypeScript ์์ด Angular๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์๊ธฐ ๋๋ฌธ์ Vue๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Vue๋ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์๋ ๋งค์ฐ ์ ํฉํ๋ฉฐ ๊ณต์ Typings ๋ฐ ๊ณต์ decorator๋ฅผ ํตํด TypeScript์ ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ฑ๋ฅ๋ฉด์์ ๋ณผ ๋ ๋ ํ๋ ์์ํฌ๋ ๋ชจ๋ ๋งค์ฐ ๋น ๋ฅด๋ฉฐ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ์ดํฐ๊ฐ ์ถฉ๋ถํ์ง๋ ์์ ๊ฒฐ๋ก ์ ๋ด์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ์ซ์๋ฅผ ํ์ธํ๋ ค๋ ๊ฒฝ์ฐ Vue 2.0์ ์ด ์จ๋ํํฐ ๋ฒค์น ๋งํฌ์ ๋ฐ๋ผ Angular 2๋ณด๋ค ์์์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์ต์ AOT compilation๊ณผ tree-shaking์ ํฌํจํ Angular๋ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์์ด์ก์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ Vue 2 ํ๋ก์ ํธ(~30kb gzipped)๋ angular-cli(~130kb gzipped)๋ณด๋ค ํจ์ฌ ์์ต๋๋ค.
Vue๋ Angular 2๋ณด๋ค ํจ์ฌ ๋ ๊ฐ์์ ์ด๋ฉฐ, ๋ค์ํ ๋น๋ ์์คํ ์ ๋ํ ๊ณต์์ ์ธ ์ง์์ ์ ๊ณตํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์์ ๋ฅผ ๋๋ฆฌ๊ณ ์์ง๋ง ์ผ๋ถ ๊ฐ๋ฐ์๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ฐ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ํ๋๋ง ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
Vue๋ฅผ ์์ํ๋ ค๋ฉด HTML ๋ฐ ES5 JavaScript (์ฆ, ์ผ๋ฐ ์๋ฐ ์คํฌ๋ฆฝํธ)์ ์ต์ํด์ผํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ณธ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด [์๋ด์]the guide๋ฅผ ์ฝ๋ ํ๋ฃจ ๋ง์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์์ต๋๋ค.
Angular์ ํ์ต๊ณก์ ์ ํจ์ฌ ๊ฐํ๋ฆ ๋๋ค. ํ๋ ์์ํฌ API๋ ๋ฐฉ๋ํ๋ฉฐ ์์ฐ์ฑ์ด ์ฌ๋ผ๊ฐ๊ธฐ ์ ์ ๋งค์ฐ ๋ง์ ๊ฒ๋ค์ ์์์ผํฉ๋๋ค. Angular์ ๋ณต์ก์ฑ์ ๋๊ท๋ชจ ์ฑ์ ๋ชฉํ๋ก ํฉ๋๋ค. ํ์ง๋ง ๊ฒฝํ์ด ๋ถ์กฑํ ๊ฐ๋ฐ์๊ฐ ์ ํํ๊ธฐ์ ํจ์ฌ ์ด๋ ต์ต๋๋ค.
Ember๋ ๋์ ์ฐฌ์ฌ๋ฅผ ๋ฐ๋ ์์ ํ ๊ธฐ๋ฅ์ ํ๋ ์์ํฌ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ง์ ๊ธฐ์กด์ ๊ดํ์ ์ ๊ณตํ๋ฉฐ, ์ผ๋จ ์ต์ํด์ง๋ฉด ์์ฐ์ฑ์ ๋์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ํ์ต ๊ณก์ ์ด ๋๊ณ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํจ๊ป ์๋ํ๋ ๋์จํ๊ฒ ๊ฒฐํฉ ๋ ๋๊ตฌ ์งํฉ์ ์ฌ์ฉํ์ฌ ๋ ์ฐฝ์ ์ธ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ๋ ค๊ณ ํ๋ฉด ํธ๋ ์ด๋ ์คํ๊ฐ ์์ต๋๋ค. ํ์๋ ๋ ๋ง์ ์์ ๋ฅผ ์ ๊ณตํ์ง๋ง ๋ ๋ง์ ๊ตฌ์กฐ์ ๋ํ ๊ฒฐ์ ์ ์๊ตฌํฉ๋๋ค.
์ฆ, Vue ์ฝ์ด์ Ember์ templating ๋ฐ ๊ฐ์ฒด ๋ชจ๋ธ ๋ ์ด์ด์ ๋น๊ตํ๋ฉด ๋ ์ ์ ์ ์์ต๋๋ค.
Vue๋ ์ผ๋ฐ JavaScript ๊ฐ์ฒด ๋ฐ ์์ ํ ์๋์ผ๋ก ๊ณ์ฐ๋ ์์ฑ์ ๋ํด ๋์ ๊ฑฐ์ฌ๋ฆฌ์ง ์๋ ๋ฐ์ํ์ ์ ๊ณตํฉ๋๋ค. Ember์์๋ Ember ๊ฐ์ฒด์ ๋ชจ๋ ๊ฒ์ ๋ฉํํ๊ณ ๊ณ์ฐ๋ ์์ฑ์ ์ข ์์ฑ์ ์๋์ผ๋ก ์ ์ธ ํด์ผํฉ๋๋ค.
Vue์ ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ JavaScript ํํ์์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ์ฉํ์ง๋ง Handlebars์ ํํ์ ๋ฐ ํฌํผ ๋ฌธ๋ฒ์ ์๋์ ์ผ๋ก ๋น๊ตํ ๋ ๋งค์ฐ ์ ํ์ ์ ๋๋ค.
์ฑ๋ฅ ์ธก๋ฉด์์ Vue๋ Ember 2.0์ ์ต์ Glimmer ์์ง ์ ๋ฐ์ดํธ ์ดํ์๋ Ember๋ณด๋ค ์๋ฑํ ๋ฐ์ด๋ฉ๋๋ค. Vue๋ ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ์ผ๊ด ์ฒ๋ฆฌํ์ง๋ง Ember์์๋ ์ฑ๋ฅ์ด ์ค์ํ ์ํฉ์์ ์คํ ๋ฃจํ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ผํฉ๋๋ค.
Knockout์ MVVM ๋ฐ ์์กด์ฑ ์ถ์ ์ ๊ฐ์ฒ์์์ผ๋ฉฐ ๋ฐ์ํ ์์คํ ์ Vue์ ๊ทธ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ IE6์ ๋ํ ์ง์๊ณผ ํจ๊ป ๋ชจ๋ ๊ฒ์ ๊ณ ๋ คํ์ฌ ๋งค์ฐ ์ธ์์ ์ ๋๋ค! Vue๋ IE9+ ๋ง ์ง์ํฉ๋๋ค.
ํ์ง๋ง ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ก๊ณ ์ค๋๋์ด ๋ณด์ด๊ธฐ ์์ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปดํฌ๋ํธ ์์คํ ์๋ ๋ผ์ดํ ์ฌ์ดํด ํ ์ด ์ ํ ์์ผ๋ฉฐ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ด์ง๋ง ์ปดํฌ๋ํธ์ ์์์ ์ ๋ฌํ๊ธฐ์ํ ์ธํฐํ์ด์ค๋ Vue์ ๋นํด ์ฝ๊ฐ ์ด์ํจ์ ๋๋ ์ ์์ต๋๋ค.
API ๋์์ธ์๋ ์ฒ ํ์ ์ธ ์ฐจ์ด๊ฐ ์๋ ๊ฒ ๊ฐ์ ํธ๊ธฐ์ฌ์ด ์๊ธด๋ค๋ฉด ๋จ์ํ ํ ์ผ ๋ชฉ๋ก์ ์ด๋ป๊ฒ ์์ฑํ๋์ง ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ๋ถ๋ช ํ ๋ค์ ์ฃผ๊ด์ ์ด์ง๋ง, ๋ง์ ์ฌ๋๋ค์ Vue์ API๊ฐ ๋ ๋ณต์กํ๊ณ ๊ตฌ์กฐ๊ฐ ์ ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Polymer๋ Google์ด ํ์ํ๋ ๋ ๋ค๋ฅธ ํ๋ก์ ํธ์ด๋ฉฐ ์ค์ ๋ก Vue์ ์๊ฐ์ ์์ฒ์ด์์ต๋๋ค. Vue์ ์ปดํฌ๋ํธ๋ Polymer์ ์ฌ์ฉ์ ์ง์ ์๋ฆฌ๋จผํธ์ ๋์จํ๊ฒ ๋น๊ตํ ์ ์์ผ๋ฉฐ ๋ ๋ค ๋งค์ฐ ์ ์ฌํ ๊ฐ๋ฐ ์คํ์ผ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ Polymer๋ ์ต์ ์น ์ปดํฌ๋ํธ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋กํ๋ฉฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์์๋ ์ฑ๋ฅ์ด ์ ํ๋๋ ์ฝ๊ฐ์ ํด๋ฆฌํ์ ์๊ตฌํฉ๋๋ค. ๋์กฐ์ ์ผ๋ก, Vue๋ IE9์ ์์กด์ฑ์ด๋ ํด๋ฆฌํ์ด ์์ด๋ ์๋ํฉ๋๋ค.
Polymer 1.0์์ ํ์ ์ฑ๋ฅ์ ๋ณด์ํ๊ธฐ ์ํด ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์์คํ ์ ๋งค์ฐ ์ ํ์ ์ผ๋ก ๋ง๋ค์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Polymer ํ ํ๋ฆฟ์์ ์ง์๋๋ ์ ์ผํ ํํ์์ Boolean ๋ถ์ ๋ฐ ๋จ์ผ ๋ฉ์๋ ํธ์ถ์ ๋๋ค. ๊ณ์ฐ๋ ์์ฑ ๊ตฌํ ๋ํ ๋งค์ฐ ์ ์ฐํ์ง ์์ต๋๋ค.
Polymer ์ฌ์ฉ์ ์ ์ ์๋ฆฌ๋จผํธ๋ HTML ํ์ผ๋ก ์ ์๋์ด ์ผ๋ฐ JavaScript/CSS(๋ฐ ํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ ์ธ์ด ๊ธฐ๋ฅ)๋ก ์ ํ๋ฉ๋๋ค. ์ด์ ๋นํด Vue์ ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ES2015+ ๋ฐ ์ํ๋ ๋ชจ๋ CSS ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋ก๋์ ํ๊ฒฝ์ผ๋ก ๋ฐฐํฌ ํ ๋ Polymer๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ์ ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํ๋ HTML ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋์์ HTTP/2 ์ง์์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ ๋ก๋ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ ๋์ ์ฌ์ฉ์ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ์ ๋ฐ๋ผ ๊ฐ๋ฅํ ์๋ ์๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋์งํ์ง ์์ ๊ฒฝ์ฐ์๋ Vulcanizer๋ผ๊ณ ํ๋ ํน์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฆฌ๋จธ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฌถ์ด์ผํฉ๋๋ค. ์์์ ๋ณผ ๋ Vue๋ ๋น๋๊ธฐ ์ปดํฌ๋ํธ ๊ธฐ๋ฅ๊ณผ Webpack์ ์ฝ๋ ๋ถํ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ๋ค์ ์ผ๋ถ๋ฅผ ์ง์ฐ ๋ก๋ ๋๋๋ก ์ฝ๊ฒ ๋ถ๋ฆฌ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ด์ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์ฑ ๋ก๋ ์ฑ๋ฅ์ ๋์ผ ์ ์์ต๋๋ค.
Vue์ ์ฌ์ฉ์ ์ ์ ์๋ฆฌ๋จผํธ ๋ฐ Shadow DOM ์คํ์ผ ์บก์ํ์ ๊ฐ์ ์น ์ปดํฌ๋ํธ ์คํ์ ๋์ฑ ์๋ฒฝํ๊ฒ ํตํฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ๋ก์๋ ๋ชจ๋ ์ฃผ์ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์์ ์ฑ์์ํค๊ณ ๊ด๋ฒ์ํ๊ฒ ๊ตฌํํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
Riot 3.0์ ์๊ณ ์๋ฆ๋ต๊ฒ ๋์์ธ ๋ API๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌํ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ ๋ชจ๋ธ (Riot์์ โํ๊ทธโ๋ผ๊ณ ํจ)์ ์ ๊ณตํฉ๋๋ค. Riot๊ณผ Vue๋ ๋์์ธ ์ฒ ํ์ ๋ง์ ๋ถ๋ถ์ ๊ณต์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Vue๋ Riot๋ณด๋ค ์ฝ๊ฐ ๋ฌด๊ฒ์ง๋ง ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
๋ ๋์ ์ฑ๋ฅ. ๊ฐ์ DOM์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค Riot์ DOM ํธ๋ฆฌ ์ํ๋ฅผ ํ๋ฏ๋ก ์ต๊ทค๋ฌ 1๊ณผ ๊ฐ์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ณด๋ค ์ฑ์ํ ๋๊ตฌ ์ง์. Vue๋ Webpack๋ฐ Browserify์ ๋ํ ๊ณต์์ ์ผ๋ก ์ง์ํ์ง๋ง Riot๋ ๋น๋ ์์คํ
ํตํฉ์ ์ปค๋ฎค๋ํฐ ์ง์์ ์์กดํฉ๋๋ค.