ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • axios
    현재/Vue 2021. 9. 6. 16:09

    1. 개요

     1) vue에서 권고하는 HTTP 통신 라이브러리로 promise(자바스크립트 비동기 처리 패턴 중 하나) 기반

     2) 브라우저, node.js를 위한 promise API를 활용하는 HTTP 비동기 통신 라이브러리

     

     ※ 비동기(asynchronous)

      (1) 특정 코드의 연산이 끝날 때까지 기다리지 않고, 다른 코드를 실행

      (2) 사용자 입장에서는 마치 동시에 여러 코드가 진행되는 것처럼 보임 (병행처리 개념) 

      (3) example: ajax, setTimeout()

      (4) 원하는 결과값이 노출되지 않을 가능성이 존재

       - callback: ajax를 통해 서버 통신 후 response를 callback함수를 태워 원하는 결과값 도출 가능

       § callback hell

         서버에서 데이터를 받아와 인코딩, 사용자 인증 등을 진행한 후 화면에 표시해야하는 경우

         callback함수 안에 callback 함수가 연속해서 이어지는 형식으로 코드가 작성되면

         가독성이 떨어지고 유지, 보수도 어려움 -> callback 함수를 분리하는 것이 하나의 해결 방법

     

       - promise: 자바스크립트 비동기 처리에 사용되는 객체

       - async & await: 자바스크립트 비동기 처리에 사용되는 가장 최근 패턴

     

    2. promise

     1) ajax 통신 코드

    function resultData(callbackFunc){
       $.get('url address/product/xxx', function(response){
          callbackFunc(response);   // 서버 로직을 통해 받은 데이터 response를 callbackFunc() method로
       });
    }
    
    
    resultData(function(data) {
       // response 값이 data로 전달
       console.log("--------------- data ---------------");
       console.log(data);
    });

     

     2) promise 적용

    function resultData(callback){
       // new Promise method 추가
       return new Promise(function(reslove, reject){
          $.get('url address/product/xxx', function(response){
             if(response != null && response != ''){
                // 유효 데이터가 존재하고 데이터를 받으면 reslove method 호출
                setTimeout(function() {   // 3초 후에 결과 로딩
                   reslove(response);
                }, 3000);
             } else {
                // 데이터 존재하지 않거나, 오류 또는 실패 발생
                reject(new Error("request is failed!"));
             }
             
          });
       });
    }
    
    resultData().then(function(data){
       // resolve method 결과값이 전달
       console.log("------- reslut ------");
       console.log(data);
    }).catch(function(err){
       console.log("------- result:: error ------");
       console.log(err);
    });

     

     3) promise 상태

      (1) pending: 비동기 처리 로직이 아직 완료되지 않은 상태

      (2) fullfilled: 비동기 처리가 완료되어 promise가 결괏값을 return한 상태

       - then() 을 이용하여 처리 결괏값을 받을 수 있음

      (3) rejected: 비동기 처리가 실패하거나 오류가 발생한 상태

       - 실패한 이유를 catch() 로 받을 수 있음

     

    3. async & await

    function fetchUser(){
       var url = 'https://xxx.yyy.com/users/abc1234';
       return fetch(url).then(function(response){
          return response.json();
       });
    }
    
    function fetchAddress(){
       var url = 'https://xxx.yyy.com/address/abc1234';
       return fetch(url).then(function(response){
          return response.json();
       });
    }
    
    /*
    * 1. fetchUser method를 통해서 사용자 정보 호출
    * 2. 사용자 정보 중 아이디가 abc1234 라면 주소 정보 호출
    * 3. 받아온 주소 정보를 console log로 출력
    */
    async function logGetAddress(){
       var user = await fetchUser();
       
       if(user.id === 'abc1234'){
          var getAddress = await fetchAddress();
          console.log(getAddress.title);
       }
    }

     1) 가독성

     2) promise 패턴과 달리 비동기 처리에 대한 부담 절감

     

     

    # reference

    https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/

    https://joshua1988.github.io/web-development/javascript/promise-for-beginners/

    https://joshua1988.github.io/web-development/javascript/js-async-await/

     

    4. axios 특징

     1) promise(ES6) API 사용: return 값이 promise 객체 형태

     2) node.js에서 사용 가능, 요청 취소 가능

     3) request데이터, response 데이터 변형

     4) HTTP 요청, 응답을 JSON 형태로 자동 변

     5) catch에 걸렸을 때 then을 실행하지 않고, console에 해당 error log 출력

     6) fetch와 차이

      (1) 자바스크립트 내장 라이브러리가 아니라 import 필요

      (2) 지원하지 않는 구형 브라우저 존재

      (3) 네트워크 에러가 발생했을 때 response timeout API를 제공하지 않아 계속 대기해야 함

    import axios from 'axios'	// 필수
    
    ...
    
    new Vue({
       el: '#app',
       methods:{
          getData: function(){
             axios.get('url 주소')
                  .then(function(response){   // 응답 성공
                     console.log('-------- response ---------');
                     console.log(response);
                  }).catch(function(err){     // 응답 실패
                     console.log('-------- err -------');
                     console.log(err);
                  });
          }
       }
    });
    
    ...

     

     

    '현재 > Vue' 카테고리의 다른 글

    Vue (2)  (0) 2021.11.05
    Vue (1)  (0) 2021.11.04
    CSR, SSR  (0) 2021.09.23
    SPA, MPA  (0) 2021.08.25

    댓글