TIL - Ajax, fetch 함수와 API

haileyself·2019년 9월 21일

Ajax

Asynchronous JavaScript and XML의 약자
Ajax는 빠르게 동작하는 동적인 웹페이지를 만들기 위해 쓰이는 개발 기법중 하나!
Ajax는 웹페이지 전체를 다시 로딩하지 않고, 웹페이지의 일부분만을 갱신할 수 있음 !

Ajax는 JSON, XML, HTML, 텍스트 파일 등 다양한 형태의 데이터를 주고 받을 수 있음.

이러한 Ajax를 구현할 수 있는 여러가지 기술 중 !
최신 기술인 fetch 에 대해서 알아보고 써보자.

프로젝트를 하면서, 백엔드 데이터를 받아와서 홈페이지를 구현했어야했다. (하드코딩 X)
그때 처음으로 fetch라는 것을 썼는데 사실..모르고 썼다.
공부가 필요해서 공부하면서 정리하는 것 !

fetch API

fetch함수에 대해서는 생활코딩 강의를 통해 배우게 되었다.
fetch함수를 사용하는 방법부터 알아보자 !

 fetch('work1.html').then(function(response){
            response.text().then(function(text){
             document.querySelector('article').innerHTML = text;  
            })
        })

일단 fetch 함수의 원리보다는 사용법을 먼저 익히는 게 중요하다고 하셨다..
사용법도 모르고 그냥 대충 감으로 복사해서 썼던...과거를 반성하며..

자 일단
fetch 뒤에는 연결할 서버나 파일을 적으면 되고
then 함수를 통해서 뒤에 있는 것들이 fetch로 가져온 것들을 가지고 진행된다는 것을 깨달음

저 위에 코드를 사용하게 되면
work1.html 에 있는 내용이 article이라고 만들어놓은 부분에 넣어지게 된다 !
실행된 화면을 보자면

image.png

요렇게 fetch 버튼 위에 이런 내용이 들어온 것을 볼 수 있다!

다음 강의들을 통해서 fetch함수에 대해서 더 배워보겠다..
fetch함수를 자유자재로 사용해보고싶다.

fetch API 원리

  • fetch('work.html') // fetch라는 함수는 첫번째 인자로 전달 된 데이터를 서버에게 요청하는 함수

image.png

fetch 함수가 연결된 fetch버튼을 누르면 개발자도구의 Network 화면에 work1.html이 뜨는 것을 볼 수 있다.
(이게 바로 client가 서버에 work1.html에 연결 요청한 것)

  • .then(callbackme); 앞에 요청한 서버의 응답이 끝나면 then(callbackme) callbackme라는 함수를 실행해라 !
    클라이언트가 요청한 데이터에 대해서 서버가 데이터를 응답해주는데 시간이 걸린다.. 1시간이 걸릴 수도 있음! 근데 그때 동안 컴퓨터가 아무것도 안하고 기다리는 것은 시간낭비!
    응답이 올때까지 마냥 기다리는 게 아니라 일단 실행해놓고 서버가 응답할때까지 다른일을 할 수 있게끔 하게 하는 함수가 then임!

then을 쓰면 then 뒤에 오는 것들은 서버응답이 끝나면 실행이 된다.
then 뒤 함수는 실행중에, then 함수 뒤에 오는 것들은 실행 됨 !

Ex.

function callbackme() {
  console.log('response done') }

	fetch('css').then(function(callbackme);
    console.log(1);
	console.log(2);

코드펜에서 실행을 했더니 css 파일에 연결이 되지않아서, 아래와 같이 콘솔창이 뜨게되었다.

image.png

로드 실패했다는 에러메세지가 뜨지만,
보면 callbackme 라는 함수보다 console창에 적힌 숫자들이 먼저 뜨는 것을 볼 수있다.
이렇게 then 함수에 포함되는 내용들은
클라이언트가 요청한 데이터를 서버로 부터 응답받은 후에 실행되는 것들이라는 것을 알 수 있다!
컴퓨터는 그동안 동기적 프로그래밍이 아닌, 다음에 뜨는 명령인
console.log(1) ;
console.log(2) ; 를 기다림 없이 수행한다!

  • 참고: 익명함수 쓰는 법
function callback() {
  console.log('response end'); 
}
//이거는 아래와 같다
callback = function () {
  console.log('response end');
}
// then 에서 쓰는 함수는 fetch 와 함께 쓰이고, 여러군데서 안불릴 함수라서 그냥 익명함수로 써도됨
// 그래서 아래와 같이 나타내기 가능
fetch('work1.html').then(function() {
  console.log('response end'); 
}); 

fetch API 함수의 콜백함수 인자

fetch함수를 부르면서 불르는 콜백함수의 첫번째 인자로는 'response'라는 객체를 받을 것이라고
fetch API사용설명서에 써있다!

그래서 함수를 써보면,, 아래와 같이 쓸 수 있다.

<!DOCTYPE html>
<html>
  <body>
    <article></article>
    <input
      type="button"
      value="fetch"
      onclick="
      // fetch('work1.html').then(function(response){
      //   response.text().then(function(text){
      //     document.querySelector('article').innerHTML = text;
      //   })
      // })
      fetch('work1.html').then(function(response){
        console.log(response);
      });
      console.log(1);
      console.log(2);
    "
    />
  </body>
</html>

response가 뭔지 잘 몰라서 찍어봤더니 콘솔에 아래와 같이 나왔다.
근데 신기한게 강의에서는 status가 response 콘솔찍어서 나온 값이랑
network에 똑같이 나오는 거라고 했는데 내꺼는 좀 달랐다.

image.png

image.png

304랑 200..
304는 서버가 client에게 너도 이 파일을 가지고 있으니, 나한테 요청하지말고
너가 너껄써 ! 라고 알려주는 메세지라고 한다~~
그리고 reponse로 나온 200은 통신이 잘 되었다고 하는건데
console은 나에게 잘나왔다고 알려주고
네트워크는 잘됬는데 그래도 너가 정확한 메시지는 알아야지 !해서 이렇게 나왔다보다
(실제로 내가 내 컴퓨터에 저장한 파일을 불러왔음!)

  • 없는 파일을 불러왔더니 이런 메세지가 뜸...

image.png

image.png
404는 데이터통신에 실패하면 나오는 메세지 !

이제 response가 객체고, 서버에서 데이터 전송을 실패하면 status에 404가 나온다는 걸 아니깐
그걸 활용해서 로직을 짤 수 있음!

 fetch('html').then(function(response){
        if(response.status == '404'){
          alert('Not found');
        };
      });

이런식으로 활용가능!

  • 최종적으로 정리해보면,
    fetch함수는 ajax 를 하기 위해서 쓰는 함수다 !
    fetch로 서버에 데이터를 요청~
    then은 비동기프로그래밍 가능하게 함 !
    then안에 있는 함수는 서버에서 응답오면 실행되게해~ 이렇게 !
    then뒤에오는 함수는 call back함수로 첫번째 인자는 response를 가짐.
    response은 status를 포함한 객체임.

  • 그렇다면 궁금한 점이 생기는데,
    react에서 fetch함수를 쓸 때, 왜 then을 한번 더쓸까?
    -> fetch then으로 받은 response 를 활용해서 다음 fecth 함수에서 사용할때는
    앞단의 response를 가지고 처리하기때문에 then을 쓰고 2번째 fetch 함수를 넣는 게 아닐까..라고
    생각이드는데 조금 더 공부를 해봐야겠다.

여기서 더나아가 promise에 대해 공부하는 것이 필요.
근데 너무 어렵다..

공부내용 출처 : 생활코딩 강의 및 구글 검색

profile
Keep on my way ! :)

0개의 댓글