Axios란 무엇인가?
axios란, Pormise 기반의 http 통신을 위한 클라이언트 라이브러리이다.
vue에는 vue-resource라는 것이 있으나, 2016년 9월 이후 업데이트가 되어있지않고, Evan You(Vue 만든사람) 또한, 공식적으로 추천하지 않고, axios 쓰는 것을 추천한다.
Axios 설치하기
npm으로 axios를 설치한다.
npm install axios vue-axios
Axios 등록하기
Vue 애플리케이션을 개발할 때, Vuex(store.js)의 actions에서 axios를 사용하므로, store.js에 axios를 등록한다.1
2
3
4
5
6
7
8
9
10
11// store.js
import Vue from 'vue'
import Vuex from 'vuex'
// axios & vue-axios를 import
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(Vuex);
// axios & vue-axios를 등록
Vue.use(VueAxios, axios);
Axios 사용하기
1. JSON server 만들기
가상의 서버에서 데이터를 만들어 사용하기 위해, 프론트엔드 개발자가 직접 JSON server를 구축하여, axios 통신을 테스트할 수 있다.
npm install -g json-server
2. JSON server 만들기
JSON server에 가상 데이터를 만들기 위해, db.json 파일을 src 폴더 아래에 만들고, 다음과 같이 데이터를 추가한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25// db.json
{
"todos": [
{
"id": "1",
"text": "vue",
"completed": false
},
{
"id": "2",
"text": "react",
"completed": false
},
{
"id": "3",
"text": "angular",
"completed": true
},
{
"id": "4",
"text": "python",
"completed": false
}
]
}
3. JSON server 띄우기(Running)
json-server --watch src/db.json --port 4000
4. Vuex(store.js)의 actions에 메소드 등록하기
actions에 등록하고, 등록할 때, mutations를 commit하여 변경된 상태를 추적가능하게 하면 된다.
서버와 통신을 할 때, CRUD라는 것이 있는데, todo 앱과 비교하면 다음과 같다.
- Create: addTodo
- Read: getTodo
- Update: changeTodo(toggle)
- Delete: deleteTodo
Vuex(store.js)의 actions에 메소드 등록할 때, 위에 4가지로 나눠서 코드를 작성해보자.
<1>. Create: addTodo1>
Create는 클라이언트단에서 데이터를 새로 생성하여, 서버에 추가하는 것이다. todo 앱에서는 addTodo가 된다.
Vuex(store.js)의 actions에 메소드 등록할 때, axios의 post를 사용한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// store.js
actions: {
addTodo: function(context, payload) {
// post를 사용할 때는, 요청할 uri에 보낼 데이터를 같이 요청한다.
axios.post('http://localhost:4000/todos', {
id: 4,
text: payload,
completed: false
})
// 요청이 성공하면, mutations에 commit을 하여, 원래 데이터에 요청한 데이터를 추가한다.
.then((res) => {
console.log(res);
context.commit('addTodo', res.data)
})
// 요청이 실패하면, 에러에 대한 조치를 취한다.
.catch((err) => {
console.log(err);
})
}
}
actions에서 commit한 mutations에 로직을 작성한다.1
2
3
4
5mutations: {
addTodo (state, todo) {
state.todoList = [...state.todoList, todo]
}
}
<2>. Read: getTodo2>
Read는 클라이언트단에서 데이터를 서버에 요청하여, 데이터를 받는 것이다. todo 앱에서는 getTodo가 된다.
Vuex(store.js)의 actions에 메소드 등록할 때, axios의 get을 사용한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// store.js
actions: {
getTodo: function(context) {
// get을 사용할 때는, 요청할 uri를 작성한다.
axios.get('http://localhost:4000/todos')
// 요청이 성공하면, mutations에 commit을 하여, 원래 데이터에 요청받은 데이터를 할당한다.
.then((res) => {
console.log(res);
context.commit('getTodo', res.data)
})
// 요청이 실패하면, 에러에 대한 조치를 취한다.
.catch((err) => {
console.log(err);
})
}
}
actions에서 commit한 mutations에 로직을 작성한다.1
2
3
4
5mutations: {
getTodo (state, data) {
state.todoList = data;
}
}
<3>. Update: changeTodo(toggle)3>
Update는 클라이언트단에서 기존에 있던 데이터를 서버에 요청하여, 데이터를 변경하는 것이다. todo 앱에서는 toggle이 된다.
Vuex(store.js)의 actions에 메소드 등록할 때, axios의 patch를 사용한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// store.js
actions: {
toggle: function(context, payload) {
// patch를 사용할 때는, 요청할 uri에 변경할 데이터의 uri를 붙여서 보낸다. 예를 들어, /todos/id가 올 수 있다.
axios.patch(`http://localhost:4000/todos/${payload}`)
// 요청이 성공하면, mutations에 commit을 하여, 특정 데이터가 변경된 상태로 데이터가 변경된다.
.then((res) => {
console.log(res);
context.commit('toggle', payload)
})
.catch((err) => {
console.log(err);
})
},
}
actions에서 commit한 mutations에 로직을 작성한다.1
2
3
4
5
6mutations: {
toggle (state, id) {
const index = state.todolist.findIndex((item)=>item.id === id);
state.todolist[index].completed = !this.todolist[index].completed;
},
}
<4>. Delete: deleteTodo4>
Update는 클라이언트단에서 기존에 있던 데이터를 서버에 요청하여, 데이터를 변경하는 것이다. todo 앱에서는 toggle이 된다.
Vuex(store.js)의 actions에 메소드 등록할 때, axios의 patch를 사용한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// store.js
actions: {
deleteTodo: function(context, payload) {
// delete를 사용할 때는, 요청할 uri에 제거할 데이터의 uri를 붙여서 보낸다. 예를 들어, /todos/id가 올 수 있다.
axios.delete(`http://localhost:4000/todos/${payload}`)
// 요청이 성공하면, mutations에 commit을 하여, 특정 데이터가 지워진 상태로 데이터가 변경된다.
.then((res => {
console.log(res);
context.commit('deleteTodo', payload)
}))
.catch((err) => {
console.log(err);
})
}
}
actions에서 commit한 mutations에 로직을 작성한다.1
2
3
4
5
6
7mutations: {
deleteTodo (state, id) {
state.todoList = state.todoList.filter((t) => {
return t.id !== id
})
}
}