Syw.Frontend

๐Ÿงฉ Vue 2๋กœ ๋ฐฐ์šฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ดˆ

1๋‹จ๊ณ„. Vue 2 + Express + Axios ์ธ์ฆ ๊ธฐ๋ฐ˜ ํˆฌ๋‘์•ฑ ๋งŒ๋“ค๊ธฐ

1-4. Axios๋กœ ์™ธ๋ถ€ API์—์„œ ํ•  ์ผ ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

  • Axios๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžŒ๋‹ค.
  • ์™ธ๋ถ€ API๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ Vue ์•ฑ์— ๋ Œ๋”๋งํ•œ๋‹ค.

โœ… 1. Axios ์„ค์น˜

Vue CLI ํ”„๋กœ์ ํŠธ์—์„œ Axios๋Š” ๋ณ„๋„ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

npm install axios

์„ค์น˜ ํ›„, src/App.vue ๋˜๋Š” ๋ณ„๋„ API ๋ชจ๋“ˆ์—์„œ import axios from 'axios' ์‚ฌ์šฉ


โœ… 2. ์‚ฌ์šฉํ•  ์™ธ๋ถ€ API

JSONPlaceholder์—์„œ ์ œ๊ณตํ•˜๋Š” ์ƒ˜ํ”Œ API๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

https://jsonplaceholder.typicode.com/todos?_limit=5

์ด API๋Š” ๊ฐ€์งœ ํ•  ์ผ(todos) ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ป ์‹ค์Šต: API๋กœ ํ•  ์ผ ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

โœ… App.vue

<template>
  <div class="todo-container">
    <h2>๐Ÿ“ก ์™ธ๋ถ€์—์„œ ๋ถˆ๋Ÿฌ์˜จ ํ•  ์ผ ๋ชฉ๋ก</h2>
    <button @click="fetchTodos">๋ถˆ๋Ÿฌ์˜ค๊ธฐ</button>
    <ul class="todo-list">
      <TodoItem
        v-for="todo in todos"
        :key="todo.id"
        :content="todo.title"
        @delete="removeTodo(todo.id)"
      />
    </ul>
  </div>
</template>

<script>
import axios from 'axios'
import TodoItem from './components/TodoItem.vue'

export default {
  components: { TodoItem },
  data() {
    return {
      todos: []
    }
  },
  methods: {
    async fetchTodos() {
      try {
        const res = await axios.get(
          'https://jsonplaceholder.typicode.com/todos?_limit=5'
        )
        this.todos = res.data
      } catch (err) {
        alert('๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')
      }
    },
    removeTodo(id) {
      this.todos = this.todos.filter(todo => todo.id !== id)
    }
  }
}
</script>

<style scoped>
.todo-container {
  max-width: 480px;
  margin: 40px auto;
  padding: 24px;
  border: 1px solid #ccc;
  border-radius: 12px;
  background: #f9f9f9;
  box-shadow: 0 4px 10px rgba(0,0,0,0.05);
}

h2 {
  text-align: center;
  margin-bottom: 20px;
}

button {
  display: block;
  margin: 0 auto 20px;
  padding: 8px 16px;
  background-color: #2196f3;
  color: white;
  border: none;
  border-radius: 6px;
  cursor: pointer;
}
button:hover {
  background-color: #1976d2;
}
</style>

โœ… ์‹คํ–‰ ๊ฒฐ๊ณผ

  • ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์™ธ๋ถ€ API์—์„œ ํ•  ์ผ 5๊ฐœ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ๋ชฉ๋ก์— ํ‘œ์‹œ
  • ๊ฐ ํ•ญ๋ชฉ์€ TodoItem ์ปดํฌ๋„ŒํŠธ๋กœ ๋ Œ๋”๋ง๋˜๋ฉฐ, ์‚ญ์ œ๋„ ๊ฐ€๋Šฅ

๐Ÿง  ๊ฐœ๋… ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช…
axios.get(url) ๋น„๋™๊ธฐ GET ์š”์ฒญ์„ ๋ณด๋ƒ„
await / async ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฐ ๋’ค ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
v-for API๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐฐ์—ด์„ ๋ฐ˜๋ณต ๋ Œ๋”๋ง
filter() ํŠน์ • ์•„์ดํ…œ ์‚ญ์ œ ์‹œ ์‚ฌ์šฉ

โœ… ๋งˆ๋ฌด๋ฆฌ

  • Axios๋Š” Vue์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” HTTP ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ API ์—ฐ๋™์€ ์‹ค์ „ ์•ฑ์—์„œ ๊ฑฐ์˜ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ์„ ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub - heroyooi/vue2-app at ch4

๐Ÿ’ฌ ๋Œ“๊ธ€

    โ€ป ๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.