본문 바로가기

React

[새싹 프론트엔드] 9주차 - 1 네트워크 통신 (동기 vs 비동기) / fetch

동기 방식 vs 비동기방식

 

동기 방식(synchronous)

요청을 보낸 후 응답을 받아야 다음 동작을 실행할  수 있는 방식

 

특징

• 설계가 간단하고 직관적

• 요청에 대한 응답을 받을 때까지 대기해야 하는 단점

- 서버가 응답을 할 때 까지 기다려야 함

(버튼 하나 눌러줘 했는데 10분걸린다 하면 10분동안 대기. 응답을 받은 후 비로소 다시 뭔가를 할 수 있음 코딩한 순서 그대로 출력)

 

비동기 방식(Asynchronous)

요청을 보낸 후 응답을 받기 전에 다음 작업을 먼저 실행 하는 방식

- useState, fetch

 

특징

• 동기 방식보다 복잡함

• 요청에 대한 응답을 받기까지의 대기 시간에 다른 작업을 할 수 있음

ex) set state 값 바꿔주고 바로 콘솔에 찍었는데 이전 데이터만 나오는 경우 비동기 방식이라 그런 거임!

 

 

실습) 동기 방식

Sync.js

const Sync = () => {
   console.log("1. 안녕하세요");
   console.log("2. 반가워요");
   console.log("3. 안녕히계세요");
   return <div></div>;
};

export default Sync;

 

실행 결과

 

 

실습) 비동기 방식

Async.js

const Async = () => {
   console.log("1. 안녕하세요");
   setTimeout(() => console.log("2. 반가워요"), 3000); //3초가 지난 뒤에 앞에 있는 콜백함수 실행해줘
   console.log("3.안녕히계세요");
   return <div></div>;
};

export default Async;

 

실행 결과

그 일을 하는 도중 (대기시간 중에) 다른 일 수행

 


async와 await

자바스크립트의 비동기 처리 패턴

 

async

  함수 선언부에 async 키워드 작성

 

await

  async 키워드가 붙어있는 함수 내부에서만 사용 가능

  결과를 얻을 때까지 대기 - 동기방식처럼 처리 가능

 

 

사용 방법

 function 키워드

async function 함수이름(){
   await 비동기_처리할_함수 또는 값
}

 

• 화살표 함수

const 함수이름 = async() => {
   await 비동기_처리할_함수 또는 값
}

async의 자식에서만 await을 쓸 수 있음

 

 

예시

const AsyncAwait = () => {
  async function getName(){
    let user = await fetch('mysite.com/users/1');

    // 리턴 받은 결과의 user.name 출력
    console.log(user.name);
  }

   // 함수 호출
   getName();

   return <div></div>;
};

export default AsyncAwait;

 

async  await을 안 썼을 경우 undefine이 뜰 수도 있음 그 데이터가 들어있다는 보장이 없으므로

패치 너는 일 해 나는 찍으러 갈게 이런 식으로 패치가 비동기 방식으로 되어있었기 때문

 


fetch() 함수로 데이터 가져오기

 

데이터 가져오기

JSONPlaceholder

https://jsonplaceholder.typicode.com

 

JSONPlaceholder - Free Fake REST API

{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. As of Oct 2022, serving ~1.7 billion requests each month.

jsonplaceholder.typicode.com

 

제공하는 데이터

https://jsonplaceholder.typicode.com/Path    path자리에 표에 있는 거 쓰고 싶은 데이터 가져다 넣기

Path 데이터 수
posts 100
comments 500
albums 100
photos 5000
todos 200
users 10

 

https://jsonplaceholder.typicode.com/users 접속

 

 

실습) Fetch를 이용한 데이터 가져오기(1)

Fetch.js

import React from "react";

const Fetch = () => {
  const url = "https://jsonplaceholder.typicode.com/users/1";
  let user;

  fetch(url)
    .then((res) => res.json())
    .then((data) =>
      user = data);
      
  console.log(user);
  
  return <div>{user}</div>;
};

export default Fetch;

 

실행 결과)

 

실습) Fetch를 이용한 데이터 가져오기(2)

 

Fetch.js

import React from "react";

const Fetch = () => {
  const url = "https://jsonplaceholder.typicode.com/users/1";
  let user;

  fetch(url)
    .then((res) => res.json())
    .then((data) => {
      console.log("1");
      user = data;
      console.log(user);
      console.log("2");
    });

  console.log("3");
  console.log(user);
  console.log("4");
  return <div>{user}</div>;
};

export default Fetch;

 

실행 결과

 

비동기 방식으로 되어 순서가 뒤바뀜

 

실습) Fetch를 이용한 데이터 가져오기(3)

 

Fetch.js

import React from "react";

const Fetch = () => {
  const url = "https://jsonplaceholder.typicode.com/users/1";
  let user;

  function getUser() {
     const response = fetch(url);
     return response.then((response) => response.json());
  }

  async function callFunc() {
     user = await getUser();
     console.log(user.name);
  }

  callFunc();
  
  return <div>{user}</div>;
};

export default Fetch;

 

실행 결과

 

실습) Fetch를 이용한 데이터 가져오기(4)

 

Fetch.js

import React, { useState } from "react";

const Fetch = () => {
  const url = "https://jsonplaceholder.typicode.com/users/1";
  const [user, setUser] = useState("");

  useEffect(() => {
    fetch(url)
      .then((response) => response.json())
      .then((data) => setUser(data.name));
  }, []);

  return <div>{user}</div>;
};

export default Fetch;

 

실행 결과

 

 

새싹DT 기업연계형 프론트엔드 실무 프로젝트 과정 9주차 블로그 포스팅