ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2019.04.14] fetch API의 개념, 그리고 다시 정리해본 Promise
    개발 블로깅/Modern script 2019. 4. 14. 18:05

    서버와의 비동기 요청방식 fetch라는 것이 있다. 오잉? 비동기 요청방식은 Ajax 아니야?

    맞다. fetch는 Ajax의 방식 중 하나이다. 그것도 최신 방식!

    나는 지금까지 Ajax라는 것이 있는 건 줄 알았고, 그냥 써보기만 했다. 근데 사실 비동기 방식의 유래도 있었다.

     

    # 비동기 서버 요청의 초기 방식 XML Http Request

    왠지 자바에서 서버 통신할 때 많이 본 듯한... 초기에 비동기 요청방식을 사용하려면 저렇게 많은 코드의 틀이 필요로 했다. 그러나 그 코드를 줄이고 간편하게 사용하고자 해서 이후에 나온 것이 Ajax이다. 

     

    # 비동기 방식 Ajax란?

     

    그리고 Ajax 방식 중 최신기술인 fetch API

    이 틀에서 바로 사용 가능! 참고로 fetch API는 promise 방식의 기반이라고 함.

     

    # Promise 방식

    then 키워드 이것은 앞은 함수 실행이 끝나면 그 다음으로 할 일을 정해주는 것.

    'fetch('서버주소')' 는 웹 브라우저에게 '이 서버주소로 요청해줘' 라는 의미이고, 뒤에 .then이 붙으면 '요청 끝나고나서 이 할일을 해줘!' 라는 것.

    그런데 중요한 것은 여기에 있다...!

    fetch는 서버와의 통신에서 사용되는 것. 그럼 서버쪽은 요청을 어떻게 받아내고 응답을 할 때의 소스코드가 어떻게 될까?

    function runPromise(resolve, reject){
      resolve('전달해줄 데이터');
    }
    const fetch = ('응답받은 서버주소') =>{
      return new Promise(runPromise);
    }

    fetch는 위에도 썼듯이 promise 기반이다. 그래서 Promise라는 클래스를 사용한다. 그래서 사실 서버에서는 Promise의 인스턴스를 반환해준다. 위 코드를 보면 runPromise라는 함수를 전달한다. (그리고 사실 위 코드처럼 저렇게 runPromise로 함수를 빼기보단 new Promise() 괄호 안에 익명함수로 쓰는게 맞다.)

    runPromise는 첫번째 인자 resolve, 두번째 인자 reject를 가진다. resolve는 정상적으로 실행이 되었을 시 클라이언트에게 전달해줄 값을 인자로 넣어준다. reject는 클라이언트의 요청에 문제가 있을 시, catch로 반환할 값을 전달해준다.

    fetch().then((response)=>{
      console.log(response);
    });
    

     

    그러면 fetch()에서 반환받은 Promise 인스턴스 안의 then이라는 함수에다가, 우리가 요청 뒤에 처리해줄 함수를 인자로 전달해주면 된다. 위 코드의, 전달해줄 함수의 매개변수 response가 API에서 요청으로 전달받은 값으로 들어온다.

     

    그러면 Promise라는 녀석은 구조가 어떻게 되어 있길래 클라이언트에서 저렇게 사용할 수 있을까?
    그래서 직접 Promise 구조를 만들어 봤다.

     

    # 직접 만들어본 Promise 구조

    class Mypromise{
      constructor(runPromise){
    	this.runPromise = runPromise;
    	this.myResponse = null;
        this.myReject = null;
      }
      then(func){
        this.runPromise(
    	  (resolveValue) => {
            this.myResponse = resolveValue;
          },
           (rejectValue) => {
             this.Myreject = rejectValue
           });
    	func(this.myResponse);
      }
    }
    

     

    저렇게 해서 사용해보니, 기존 Promise와 똑같이 사용된다.ㅎㅎㅎㅎ

    이 구조를 파악하고 짜느라 시간이 좀 걸렸다... 그래도 이번 기회에 프로미스와 fetch API 구조를 완전히 이해하게 되었다.

    반응형

    댓글 2

    • ppyap 2020.08.07 21:15

      안녕하세요!
      Mypromise와 같이 만들어도 fetch().then( ... ).then( ... ) 처럼 then을 연결해서 쓸 수 있나요?
      코드만 보면 then이 아무것도 리턴하지 않는 것 같아서요!

      • Hello이뇽 2020.08.07 21:23 신고

        아ㅎㅎ 네 지금보니까 then을 따로 리턴하지 않네요! 작년에 아직 아무것도 모를 때 혼자 짜본거라 오랜만에 저의 부족한 코드를 보게 되았네요..😂 감사합니다.!.

Designed by Tistory.