SPA (Single Page Application)
์ผ๋ฐ์ ์ธ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ํด๋ผ์ด์ธํธ๊ฐ ์น ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ์๋ฒ๋ก๋ถํฐ html ์ ์ ๋ฌ ๋ฐ์ ๋ ๋๋ง ์์ง์ ํตํด ํ๋ฉด์ ๋ณด์ฌ์ค๋ค. ํ ํ์ด์ง์ ํด๋นํ๋ ํ์ด์ง ์ฉ๋์ด ์ปค์ง๋ฉด ์์ฒญ๋ง๋ค ๋งค๋ฒ ์๋ก์ด ํ์ด์ง๋ฅผ ์ ๋ฌ ๋ฐ๊ธฐ ๋ฒ๊ฒ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด SPA, Single Page Application ์ด๋ค. SPA ๋ ๋จ์ผ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ์ฒด ํ์ด์ง๋ฅผ ํ๋์ ํ์ด์ง์ ๋ด์ ๋์ ์ผ๋ก ํ๋ฉด์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ํํํ๋ค. ํ์ด์ง ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ค๋ ๊ฒ์ด ์ต์ด ๋ก๋๋์์ ๋ ๋ฏธ๋ฆฌ ๋ธ๋ผ์ฐ์ ์ ์ฌ๋ผ๊ฐ ํ ํ๋ฆฟ๋ง ๊ต์ฒดํ๋ ๊ฒ์ด๋ค. ํ๋ฉด ์ด๋ ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ html ๋ก ์ ๋ฌ(์๋ฒ์ฌ์ด๋ ๋ ๋๋ง) ๋ฐ์ง ์๊ณ ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ ๋์ ์ผ๋ก ๋ ๋๋ง ํ๋ค.
๋ํ์ ์ธ SPA ํ๋ ์์ํฌ๋ Angular, React, Vue ๋ฑ์ด ์๋ค. SPA ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ธํ DOM ์กฐ์์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋ ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ์ ์ ํ์ํจ๋ค๋ ๋ฌธ์ ์ ์ด ์์ด ๊ฐ์ DOM(Virtual DOM)์ ์ฌ์ฉํ๋ค. ๊ฐ์ ๋์ ์ฌ์ฉํ๋ฉด DOM ํธ๋ฆฌ์ ์ ์ฌํ ๊ฐ์์ ๊ฐ์ฒด ํธ๋ฆฌ๋ก html ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค๊ฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด ๋ชจ๋ ๋ณํ๋ฅผ ๋ชจ์ ํ ๋ฒ์ ํ๋ฉด์ ๊ฐฑ์ ํ๋ค.
Vue Router ๋?
Vue ์์ ํ๋ฉด์ ์ ํํ ๋๋ router ๋ฅผ ์ฌ์ฉํ๋ค. ๋ผ์ฐํฐ๋ ํน์ ์ฃผ์์ ์ ๊ทผํ ํ์ด์ง ์ ๋ณด๋ฅผ ์ค์ ํ ์ ์๋ค.
ํน์ ์ฃผ์๋ก ์ ๊ทผํ ๊ฒฝ์ฐ ์ด์ ํด๋นํ๋ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋ผ์ฐํฐ์์ ๋ผ์ฐํธ๋ฅผ ์ค์ ํ๋ค๊ณ ํ๋ค.
์ ํํ๊ฒ๋ ํ์ด์ง๋ฅผ '์ ํ' ํ๋ ๊ฒ์ด ์๋ ํ์ด์ง ๋ด๋ถ ์ปดํฌ๋ํธ๋ค์ '์ฌ๋ฐฐ์น' ํ๋ ๊ฒ์ด๋ค.
url ๋ณ๊ฒฝ ์ DOM ์ ์๋ก ๊ฐฑ์ ํ๋ ๊ฒ์ด ์๋๋ผ ๋ฏธ๋ฆฌ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ฐ ๋ณ๊ฒฝ๋ ์์ ์์ญ๋ง ๊ฐฑ์ ํ์ฌ ์ ์ฐํ ํ์ด์ง ์ ํ์ด ๊ฐ๋ฅํ๋ค.
vue ์์๋ vue-router ๋ผ๋ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ํ๋ค.
- ๋ผ์ฐํฐ ์ค์นํ๊ธฐ
vue-router๋ฅผ ์ค์นํ๊ณ package.json ํ์ผ์์ ์ถ๊ฐ๋ ๋ชจ๋์ ํ์ธํ ์ ์๋ค.
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
npm install vue-router --save
- ๋ผ์ฐํฐ ์์ฑ
์์ฑ | ํ์ ์์ฑ | ์์ฑ ๊ฐ | |
mode | hash (default) | ๋ชจ๋ URL ์ hash(#) ํํ๋ก ์๋น์ค, URL ์ด ๋ณ๊ฒฝ๋ ๋ ํ์ด์ง๊ฐ ๋ค์ ๋ก๋๋์ง ์์ | |
history | ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ URL ํ์ ๊ฐ๋ฅ | ||
redirect | ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๋ฆฌ๋ค์ด๋ ํธ | ||
routes | path | url ๊ฒฝ๋ก | |
component | ํด๋น url ์ ์ฌ์ฉํ ์ปดํฌ๋ํธ | ||
children | ์ค์ฒฉ ๋ผ์ฐํ ๋ฐฐ์ด | ||
alias | ๋ณ์นญ |
- ๋ผ์ฐํฐ ๋์ ํ๋ฆ
โ ์น ์ฌ์ดํธ๋ฅผ ์ด๋ฉด public > index.html ํ์ผ๋ง ๋ ๋๋ง ๋จ
โก Vue ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด์ โ ์ ํ๊ทธ์ ์ธ์คํด์ค๊ฐ ์ฐ๊ฒฐ๋๊ณ render function ์์ App ์ด๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ๋ณด์ฌ์ง
โข src > App.vue ์์ ๋ผ์ฐํฐ๋ก ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ๊ณ ์์
<router-link> ๊ฐ <a> ํ๊ทธ๋ก ๋ฐ๋์ด์ ์คํ๋จ
โฃ ๋ผ์ฐํฐ์ ๊ด๋ จ๋ ์ค์ ์ router > index.js ์์ ์ง์ ๋ ๊ฒฝ๋ก์ ๋ฐ๋ผ ํด๋น ๊ฒฝ๋ก๋ฅผ ๋ณด์ฌ์ค
Router ๊ธฐ๋ณธ
- ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ด์ฉํ ํ์ด์ง ์ด๋ <router-link>
<route-link to="url"> : ํ์ด์ง ์ด๋ ํ๊ทธ, ํ๋ฉด์์๋ <a> ํ๊ทธ๋ก ์นํ
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
- ๋ผ์ฐํ ํ์ด์ง ํ์ <router-view>
<route-view> : ํ์ด์ง ํ์ ํ๊ทธ, ๋ณ๊ฒฝ๋๋ url์ ๋ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฟ๋ ค์ค
<router-view></router-view>
- ๋ค๋น๊ฒ์ด์ url ์ด๋ ๋ฐฉ์ ๋น๊ต
์ ์ธ์ ๋ฐฉ์ | ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ | ํน์ง |
<router-link:to="..."> | router.push(...) | ์๋ก์ด URL ์ ํ์คํ ๋ฆฌ ์คํ์ ๋ฃ์ด ๋ธ๋ผ์ฐ์ ์ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ด์ URL ๋ก ์ด๋ |
<router-link:to="..." replace> | router.replace(...) | ์๋ก์ด URL ์ ํ์คํ ๋ฆฌ ์คํ์ ์ถ๊ฐํ์ง ์๊ณ ํ์ฌ URL ์ ๋์ฒด |
- | router.go(n) | ํ์คํ ๋ฆฌ ์คํ์์ n ๋งํผ ์, ๋ค๋ก ์ด๋ |
- ๋ผ์ฐํฐ์ ๊ธฐ๋ณธ ๊ฒฝ๋ก
'๋ฃจํธ url'/#/'๋ผ์ฐํฐ ์ด๋ฆ'
๊ธฐ๋ณธ ๊ฒฝ๋ก์ '#' ๊ฐ์ ์ ์ธํ๊ณ ์ถ์ผ๋ฉด mode๋ฅผ history๋ก ์ค์
- Nested Routers vs Named Views
ํน์ url ์ ์ง์ ๋ 1๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ ํ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ ๊ฒ์ Nested Router, ํน์ url ์ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์์ญ ๋ณ๋ก ์ง์ ํ์ฌ ๋ ๋๋ง ํ๋ ๊ฒ์ Named View ๋ผ๊ณ ํ๋ค.
- Nested: ์์ ์ปดํฌ๋ํธ๊ฐ ํ์ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ ํ์
- Named: ๊ฐ์ ๋ ๋ฒจ์์ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ํ ๋ฒ์ ํ์
- ๋ผ์ฐํฐ๋ก ๊ฐ ์ ๋ฌํ๊ธฐ
๋ผ์ฐํฐ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ฐ๊ฒฐํ๋ฉด์ ํด๋น ์ปดํฌ๋ํธ์ ๋์ ์ผ๋ก ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ path ๋ฅผ ํตํ ๊ฐ ์ ๋ฌ, params ๋ฅผ ํตํ ๊ฐ ์ ๋ฌ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค
โ path ๋ฅผ ํตํ ๊ฐ ์ ๋ฌ
// router.push()์ ์ธ์๋ก path๋ฅผ ๋๊ธธ ๋ key=value๋ฅผ ์์ฑ
router.push("/login?id=test@naver.com");
// path๋ฅผ ํตํด ๊ฐ์ ๋ฐ๊ธฐ ์ํด vue ๊ฐ์ฒด์ query ์ด์ฉ
this.$route.query.key
โก params ๋ฅผ ํตํ ๊ฐ ์ ๋ฌ
- url ๊ฒฝ๋ก์ ๋ ธ์ถ๋์ง ์๊ณ ์ ๋ฌํ ์ ์๋ค.
- ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํ๊ฑฐ๋ ๋ฆฌ๋ก๋ํ ๋ ๊ฐ์ด ์ ์ง๋์ง ์๋๋ค.
- path ์ param ์ ๊ฐ์ด ์๋๋์ง ์์ผ๋ฏ๋ก name ์ ์ด์ฉํ๋ค.
// name๊ณผ props:true ์ถ๊ฐ
routes: [
{
name: 'login',
path: '/login',
component: Login,
props: true
}
]
// path ๋์ name์ ์ด์ฉํด ์ด๋ค ๊ฒฝ๋ก๋ก ๊ฐ์ง ๊ฒฐ์ , params๋ฅผ ์ด์ฉํด ์ ๋ฌํ ๊ฐ์ ์๋ ค์ค
router.push({name:"login", params:{"id":"test@naver.com"}}});
// this.$route.params.key ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์
this.$route.params.id
์ฐธ๊ณ ์๋ฃ ๋ฐ ์ถ์ฒ ๐โ๏ธ
https://www.huskyhoochu.com/what-is-spa/
'๊ฐ๋ฐ > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vue3 Composition API (0) | 2022.04.06 |
---|---|
Vuex / ์ํ๊ด๋ฆฌ / Vuex ํจํด ๋ฐ ์์ (0) | 2022.04.05 |
Vue ์ปดํฌ๋ํธ / ์ปดํฌ๋ํธ ๊ฐ ํต์ (0) | 2022.04.04 |
Vue ์ฌ์ฉ๋ฒ / ๋ฌธ๋ฒ / ์ต์ / ๋๋ ํฐ๋ธ (0) | 2022.03.28 |
Vue.js ๊ธฐ๋ณธ ๊ฐ๋ / ์ฌ์ฉํ๋ ์ด์ / ๊ฐ์ ๋ (0) | 2022.03.17 |
๋๊ธ