# μ•‘μ‹œμ˜€μŠ€

λ·°μ—μ„œ κΆŒκ³ ν•˜λŠ” HTTP 톡신 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ•‘μ‹œμ˜€μŠ€(Axios)μž…λ‹ˆλ‹€. Promise 기반의 HTTP 톡신 라이브러리이며 μƒλŒ€μ μœΌλ‘œ λ‹€λ₯Έ HTTP 톡신 λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ— λΉ„ν•΄ λ¬Έμ„œν™”κ°€ μž˜λ˜μ–΄ 있고 APIκ°€ λ‹€μ–‘ν•©λ‹ˆλ‹€.

# μ•‘μ‹œμ˜€μŠ€ μ„€μΉ˜

ν”„λ‘œμ νŠΈμ— μ•‘μ‹œμ˜€μŠ€λ₯Ό μ„€μΉ˜ν•˜λŠ” 방법은 CDN 방식과 NPM 방식 2가지가 μžˆμŠ΅λ‹ˆλ‹€.

# CDN 방식

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

# NPM 방식

npm install axios

# μ•‘μ‹œμ˜€μŠ€ μ‚¬μš©λ°©λ²•

라이브러리λ₯Ό μ„€μΉ˜ν•˜κ³  λ‚˜λ©΄ axiosλΌλŠ” λ³€μˆ˜μ— μ ‘κ·Όν•  수 있게 λ©λ‹ˆλ‹€. axios λ³€μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μ•„λž˜μ™€ 같이 HTTP GET μš”μ²­μ„ λ‚ λ¦¬λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

<div id="app">
  <button v-on:click="fetchData">get data</button>
</div>
new Vue({
  el: '#app',
  methods: {
    fetchData: function() {
      axios.get('https://jsonplaceholder.typicode.com/users/')
        .then(function(response) {
          console.log(response);
        })
        .catch(function(error) {
          console.log(error);
        });
    }
  }
})

μœ„ μ½”λ“œλŠ” get data λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ μ‚¬μš©μž 정보λ₯Ό λ°›μ•„μ˜€λŠ” μ½”λ“œμž…λ‹ˆλ‹€. μ‹€ν–‰ν•˜λ©΄ μ‚¬μš©μž 정보가 λΈŒλΌμš°μ € 개발자 λ„κ΅¬μ˜ μ½˜μ†”μ— 좜λ ₯λ©λ‹ˆλ‹€.

# μ•‘μ‹œμ˜€μŠ€ 응닡 μ œμ–΄

# .then

비동기 톡신이 μ„±κ³΅ν–ˆμ„ 경우, .then()은 μ½œλ°±μ„ 인자둜 λ°›μ•„ 결괏값을 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# .catch

.catch() λ₯Ό 톡해 였λ₯˜λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. error κ°μ²΄μ—μ„œλŠ” 였λ₯˜μ— λŒ€ν•œ μ£Όμš” 정보λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

axios.get('/hello')
    .catch(function (error) {
        if (error.response) {
            console.log(error.response.status);
            console.log(error.response.headers);
        }
    }

μœ„μ™€ 같이 .catchμ—μ„œ λ°›μ•„μ˜€λŠ” error 객체λ₯Ό 톡해 error.response.status 응닡 μƒνƒœμ½”λ“œμ™€ error.response.headers 응닡 헀더 정보λ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

기타 μ—λŸ¬ 처리 방법은 axios μ—λŸ¬ 처리 λ¬Έμ„œ (opens new window)λ₯Ό μ°Έκ³ ν•©λ‹ˆλ‹€.

# μ•‘μ‹œμ˜€μŠ€ HTTP μš”μ²­ λ©”μ„œλ“œ μ’…λ₯˜

μ•‘μ‹œμ˜€μŠ€μ—μ„œ 자주 μ‚¬μš©λ˜λŠ” HTTP μš”μ²­ λ©”μ„œλ“œλ₯Ό μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

# axios.get(url[, config])

μ„œλ²„μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¬ λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. 두 번째 νŒŒλΌλ―Έν„° config κ°μ²΄μ—λŠ” 헀더(header), 응닡 μ΄ˆκ³Όμ‹œκ°„ (timeout), 인자 κ°’(params) λ“±μ˜ μš”μ²­ 값을 같이 λ„˜κΈΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

axios.get('users/1')

# axios.post(url[, data[, config]])

μ„œλ²„μ— 데이터λ₯Ό μƒˆλ‘œ 생성할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. 두 번째 νŒŒλΌλ―Έν„° data에 생성할 데이터λ₯Ό λ„˜κΉλ‹ˆλ‹€.

axios.post('/books', { title: '1984' })

# axios.put(url[, data[, config]])

νŠΉμ • 데이터λ₯Ό μˆ˜μ •ν•  λ•Œ μš”μ²­ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. put 은 μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜κ±°λ‚˜, 이미 μ‘΄μž¬ν•˜λŠ” 데이터λ₯Ό λŒ€μ²΄ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. postμ™€μ˜ λ‹€λ₯Έ 점은 postλŠ” μ—¬λŸ¬ 번 ν˜ΈμΆœν•  경우, μƒˆλ‘œμš΄ 데이터가 μ§€μ†μ μœΌλ‘œ μΆ”κ°€λ©λ‹ˆλ‹€. 반면, put은 ν•œ 번 μš”μ²­μ„ ν•˜κ±°λ‚˜ μ—¬λŸ¬ 번 μ§€μ†μ μœΌλ‘œ μš”μ²­ν•΄λ„ 결괏값이 λ™μΌν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ•„λž˜ μ˜ˆμ‹œμ²˜λŸΌ 2번 μœ μ €μ˜ 이름을 Iron Man으둜 μˆ˜μ •ν•˜κΈ° μœ„ν•΄ axios.put μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€. μ΄λ•Œ, putμš”μ²­μ„ ν•œ 번 λ³΄λ‚΄κ±°λ‚˜ μ—¬λŸ¬ 번 보내도 2번 μœ μ €μ˜ 이름은 Iron Man으둜 λ™μΌν•˜κ²Œ μˆ˜μ •λ©λ‹ˆλ‹€.

axios.put('users/2', { name: 'Iron Man' })

# axios.delete(url[, config])

νŠΉμ • λ°μ΄ν„°λ‚˜ 값을 μ‚­μ œν•  λ•Œ μš”μ²­ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.

axios.delete('books/3')

# μ•‘μ‹œμ˜€μŠ€ HTTP μš”μ²­ Config μ˜΅μ…˜

μ•‘μ‹œμ˜€μŠ€ μš”μ²­μ„ ν•  λ•ŒλŠ” config 섀정이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

# method

methodλŠ” μš”μ²­μ„ ν•  λ•Œ μ‚¬μš©ν•  μš”μ²­ λ©”μ„œλ“œμž…λ‹ˆλ‹€. method의 기본값은 getμž…λ‹ˆλ‹€.

# url

url은 μ•‘μ‹œμ˜€μŠ€ μš”μ²­μ— μ‚¬μš©λ  μ„œλ²„μ˜ URL을 λ§ν•©λ‹ˆλ‹€.

url: '/books'

# method

methodλŠ” μš”μ²­μ„ ν•  λ•Œ μ‚¬μš©ν•  μš”μ²­ λ©”μ†Œλ“œμž…λ‹ˆλ‹€. method의 기본값은 get μž…λ‹ˆλ‹€.

method: 'get'

# baseURL

baseURL은 μ•‘μ‹œμ˜€μŠ€ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ, μΈμŠ€ν„΄μŠ€μ˜ κΈ°λ³Έ URL 값을 μ •ν•  수 μžˆλŠ” μ†μ„±μž…λ‹ˆλ‹€. 보톡 http://mysite.com/api/v1/처럼 API μ„œλ²„μ˜ κΈ°λ³Έ 도메인을 μ„€μ •ν•˜κ³ , μΈμŠ€ν„΄μŠ€ λ³„λ‘œ URL을 뒀에 μΆ”κ°€ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

baseURL: 'https://도메인.com/api/'

# headers

헀더λ₯Ό μˆ˜μ •ν•΄μ„œ 보내야 ν•œλ‹€λ©΄ headersλ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

 headers: {'X-Requested-With': 'XMLHttpRequest'}

# params

paramsλŠ” HTTP μš”μ²­μ— 뢙일 URL νŒŒλΌλ―Έν„°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ•„λž˜ μ˜ˆμ‹œ μ½”λ“œλŠ” https://domain.comμ΄λΌλŠ” URL둜 HTTP μš”μ²­μ„ λ³΄λƒˆμ„ λ•Œ https://domain.com?id=123으둜 μ „λ‹¬ν•˜λŠ” 것과 같은 효과λ₯Ό κ°€μ§‘λ‹ˆλ‹€. μ—¬κΈ°μ„œ paramsκ°€ nullμ΄λ‚˜ undefined인 κ²½μš°μ—λŠ” νŒŒλΌλ―Έν„°κ°€ μ‘°ν•©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

params: {
    id: 123
}

# data

dataλŠ” HTTP μš”μ²­ 보디에 μ‹€μ–΄μ„œ 보낼 데이터λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 주둜 데이터λ₯Ό μ‘°μž‘ν•΄μ•Ό ν•˜λŠ” PUT, POST, DELETE, PATCH λ“±μ˜ λ©”μ„œλ“œμ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

data: {
    firstName: 'Christine'
},
  
// μ•„λž˜μ˜ data config 섀정은 POST λ©”μ„œλ“œμ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

data: 'Age=26&City=New York'

# timeout

timeout은 HTTP μš”μ²­μ„ 보내고 응닡을 λ°›κΈ°κΉŒμ§€μ˜ μ œν•œ μ‹œκ°„μ„ μ„€μ •ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€. μš”μ²­ μ‹œκ°„μ΄ μ§€μ •λœ 값을 μ΄ˆκ³Όν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

// λ‹¨μœ„(millisecond)
timeout: 5000

# responseType

responseType은 μ„œλ²„λ‘œλΆ€ν„° μ–΄λ– ν•œ 데이터 ν˜•μ‹μœΌλ‘œ 응닡받을지 μ§€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ˜΅μ…˜μœΌλ‘œλŠ” arraybuffer, document, json, text, stream이 κ°€λŠ₯ν•©λ‹ˆλ‹€. κΈ°λ³Έ 값은 jsonμž…λ‹ˆλ‹€.

responseType: 'json'

# 기타 μ•‘μ‹œμ˜€μŠ€ μš”μ²­ Config

Config μ˜΅μ…˜μ€ λ©”μ„œλ“œ λ³„λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” μ˜΅μ…˜μ΄ λ‹€λ₯΄λ―€λ‘œ, μ•‘μ‹œμ˜€μŠ€ Request Config λ¬Έμ„œ (opens new window)λ₯Ό μ°Έκ³ ν•©λ‹ˆλ‹€.

# 기타 μ•‘μ‹œμ˜€μŠ€ API

기타 μ•‘μ‹œμ˜€μŠ€ κ΄€λ ¨ μ˜ˆμ œμ™€ APIλŠ” μ•‘μ‹œμ˜€μŠ€ λ¬Έμ„œ (opens new window)λ₯Ό μ°Έκ³ ν•©λ‹ˆλ‹€.