๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Vue.js

Vue.js(4) Router ๋ฐ Axios, async await ๊ฐœ๋…

by Jo__y 2022. 10. 9.

Vue Router

์‹ฑ๊ธ€ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.
ํŽ˜์ด์ง€๊ฐ„์— ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๋ผ์šฐํ„ฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
var router = new VueRouter({ ... })

  • ๋ผ์šฐํ„ฐ ์˜ต์…˜ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
    • routes : ๋ผ์šฐํŒ… ํ•  URL ๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ฐ’ ์ง€์ •
      • path : ํŽ˜์ด์ง€ url
      • component : ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ๋ฟŒ๋ ค์งˆ ์ปดํฌ๋„ŒํŠธ
    • mode URL ์˜ ํ•ด์‰ฌ ๊ฐ’ ์ œ๊ฑฐ ์†์„ฑ
      • mode=''history' ===> # ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ถ™๋Š” ๊ฒƒ์„ ์ œ๊ฑฐ
    1. ์ธ์Šคํ„ด์Šค์— ๋ผ์šฐํ„ฐ ์ธ์Šคํ„ด์Šค ๋“ฑ๋ก
      new Vue({ router: router ...})

์„ค์น˜

https://router.vuejs.org/installation.html
๊ณต์‹์‚ฌ์ดํŠธ ์„ค์น˜ ๋งํฌ

npm install vue-router

npm : node pakcage manager

const router = new VueRouter({   // ๋ผ์šฐํ„ฐ ๊ฐ์ฒด ์ƒ์„ฑ
    mode: 'history',
    routes: [    // ํŽ˜์ด์ง€์˜ ๋ผ์šฐํŒ… ์ •๋ณด
        {
            path: '/login',   // ํŽ˜์ด์ง€ url
            component: () =>   // ํ•ด๋‹น url ์—์„œ ํ‘œ์‹œ๋  ์ปดํฌ๋„ŒํŠธ
                import ('@/views/LoginPage.vue'),
        },   ... 

์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… import ('@/views/LoginPage.vue')

๊ธฐ์กด์ฒ˜๋Ÿผ import ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒ˜์Œ์— ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
ํ•ด๋‹น url ๋กœ ์ด๋™ํ–ˆ์„๋•Œ๋งŒ ๋“ค๊ณ  ์˜ค๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ํŽ˜์ด์ง€ url์ด ๋ณ€๊ฒฝ๋ฌ์„๋•Œ ๊ทธ์—๋”ฐ๋ผ ๋ฟŒ๋ ค์ง€๋Š” ์˜์—ญ

router-link

๋Š” ์‹ค์ œ ํ™”๋ฉด์—์„œ๋Š” ํƒœ๊ทธ๋กœ ๋ณ€ํ˜•๋˜์„œ ๋‚˜์˜จ๋‹ค.

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์œ„ํ•ด router-link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -->
    <!-- ๊ตฌ์ฒด์ ์ธ ์†์„ฑ์€ `to` prop์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. -->
    <!-- ๊ธฐ๋ณธ์ ์œผ๋กœ `<router-link>`๋Š” `<a>` ํƒœ๊ทธ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.-->
    <router-link to="/login">Go to Login</router-link>
    <router-link to="/main">Go to Main</router-link>
  </p>
  <!-- ๋ผ์šฐํŠธ ์•„์šธ๋ › -->
  <!-- ํ˜„์žฌ ๋ผ์šฐํŠธ์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. -->
  <router-view></router-view>
</div>

์—†๋Š” ํŽ˜์ด์ง€ ์ ‘๊ทผ ๋ผ์šฐํ„ฐ ์ฒ˜๋ฆฌ

path : '*',
compoment: () => import ( ... NotFoundPage.vue)

Axios

  • ajax ํ†ต์‹ ๊ณผ ๊ฐ™์ด ๋น„๋™๊ธฐ ํ†ต์‹  ๊ธฐ๋ฒ•์ด๋‹ค.
  • vue resource ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ => 2๋…„์ „์— ์—†์–ด์ง
  • Vue ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” HTTPํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.
  • npm install axios ๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•˜๊ฑฐ๋‚˜
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script> CDN ์ž…๋ ฅ์„ ํ†ตํ•ด ์„ค์น˜ ํ•œ๋‹ค.

axios ๋ชจ๋“ˆ์—์„œ request/response ๋Š” ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด request๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋‚˜์„œ response ๋„ ์‘๋‹ต์„ ๋ฐ›๊ธฐ ์ „์— ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์ˆ˜ํ–‰ํ•ด๋ฒ„๋ ค์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ•œ๋‹ค.

testFunction() {
    const response = axios.get('api/test')
    console.log(response)
}

๊ฒฐ๊ณผ

Promise {<pending>} __proto__: Promise [[PromiseStatus]]: "resolved" [[PromiseValue]]: Object

javascript ๋Š” axios() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ request๋ฅผ ๋ณด๋‚ด๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  response๋ฅผ ์–ธ์ œ ๋ฐ›๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ , ๋‹ค์Œ ๋ฌธ์žฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•ด Promise ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Promise
๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ๋„ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ => ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

testFunction() {
    axios.get('api/test')
    .then(function(response) {
        console.log(response)
    })
}

.then() ๋งŒ ๋ถ™์ด๋ฉด ๊ฒฐ๊ณผ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
๋‹จ ! .then() ๊ตฌ๋ฌธ ๋‚ด์—์„œ๋งŒ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

testFunction() {
    axios.get('api/test')
    .then(function(response) {
        console.log(response)
    })

    console.log('Test')
}

console.log('Test')

async await

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜์™€ ํ”„๋กœ๋ฏธ์Šค์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ๋‹ค.
async function ํ•จ์ˆ˜๋ช… () { await ๋น„๋™๊ธฐ_์ฒ˜๋ฆฌ_๋ฉ”์„œ๋“œ_๋ช…() ; }
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

acync ๋Š” ์–ด๋–ค ๊ฐ’์„ return ํ•˜๋˜๊ฐ„์— Promise ๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.

Vue CLI

npm install -g @vue/cli ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด sudo ์•ž์— ๋ถ™์ด๋ฉด ๋œ๋‹ค.

main.js

import App from './App.vue'
new Vue({ el : '#app', render : h => h(App), // ==> ํ…œํ”Œ๋ฆฟ์†์„ฑ ์ •์˜๋ฌ์„๋•Œ render ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. })

App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ Vue ์— ์ง‘์–ด๋„ฃ๊ณ  ๋žœ๋”๋ง ํ–ˆ๋‹ค.

์‹ฑ๊ธ€ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ

<template></template>
<script></script>
<style></style>
์„ธ ์†์„ฑ์„ ํ•œํŒŒ์ผ์— ๊ด€๋ฆฌํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด ์‹ฑ๊ธ€ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

์‹ฑ๊ธ€ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ์—์„œ props ์†์„ฑ ์‚ฌ์šฉ

์‹ฑ๊ธ€ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ์—์„œ event emit ์‚ฌ์šฉ

Store

state ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ

mutations state๊ฐ’(๋ฐ์ดํ„ฐ) ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฉ”์„œ๋“œ

 * commit() ์œผ๋กœ ๋™์ž‘์‹œํ‚จ๋‹ค.

์ฐธ์กฐ

  1. async..await์™€ axios ๋ฐ Promise
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€