-
[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 구조를 완전히 이해하게 되었다.
반응형'개발 블로깅 > Modern script' 카테고리의 다른 글
[2019.04.17] ES6 문법 - default parameter (0) 2019.04.17 [2019.04.17] ES6 문법 - Template Literals 문자열 처리 (0) 2019.04.17 [2019.03.27] Rest파라미터 개념 (0) 2019.03.28 [2019.03.27] 전개 연산자 개념 (0) 2019.03.27 [2019.03.27] 구조분해할당 개념 (0) 2019.03.27