[React] 동기 / 비동기 통신

2023. 8. 28. 21:00·Front/React

오늘은 동기 비동기 통신에 대해 공부했다

간단하게 동기 통신은 서버 컴퓨터가 작업이 끝날 때 까지 기다리는 통신이고

비동기 통신은 안기다리는 건데 비동기 통신은 요청(request)들이 서로 기다릴 필요가 없을 대 사용한다.

비동기 통신이 더 효율적이며 동기 통신은 필요할 때 사용하면 된다.

 

JavaScript는 기본적으로 동기적으로 작동하지만, 최신 라이브러리(설치해서 쓰는 애들)들은 기본적으로 비동기로 작동한다. (비동기가 더 효율적이기 때문에)

 

VS code에서 동기 / 비동기 통신 사용하기

실습을 위해 아래 페이지의 API를 사용할 것이다

https://koreanjson.com/
 

Korean JSON

{ Korean JSON } Super simple JSON API in Korean. Request GET, POST, PUT, DELETE actions and get JSON data in Korean back to get the most out of the look and feel of Korean language when prototyping your project. 한국어 데이터를 제공하는 초간

koreanjson.com

 
더 정확히는 ( https://koreanjson.com/posts/1 ) 를 쓸것임
 
 
 
그 전에!! 지금까지는 함수를 사용할 때
 
function 함수이름() {
    //내용
}

 

이렇게 썼는데 JavaScript에서는 이렇게 쓰면 중복이 될 수 있기 때문에 앞으로는

 

 const 함수이름 = () => {
   //내용
 }

 

이렇게 함수 표현을 화살표 함수로 변경해서 쓰기로 했다.

 

 

비동기(Asynchronous) 통신

const data = axios.get("https://koreanjson.com/posts/1")
console.log(data) //Promis

 

axios 라이브러리는 비동기적으로 작동한다. 콘솔에는 Promis라는 결과값을 받게 되는데 데이터를 받아오지 못하고 줄거야! 하고 약속만 해 놓은 것이다. 데이터를 받기 위해서는 axios.get 전에 데이터가 올 때 까지 기다리겠다는 명령을 해야하는데 그 명령어가 바로 await이다.

 

 

동기(Syncronous) 통신

await를 쓰기 위해서는 async라는 명령어가 필요하다. 둘이 짝궁이라고 생각하면 된다!

async는 함수 앞에 적어서 사용한다.

  const  onClickSync = async() => {
    const result = await axios.get("https://koreanjson.com/posts/1");
    console.log(result);
  }

 

 

실습타임!!😆(Rest-API)

import axios from "axios";

export default function RestGetPage() {
  
  //비동기통신 함수
  const onClickAsync = () => {
    const result = axios.get("https://koreanjson.com/posts/1");
    console.log(result);
  };
  
  //동기통신 함수
  const onClickSync = async () => {
    const result = await axios.get("https://koreanjson.com/posts/1");
    console.log(result);
  };

  return (
    <>
      <div>동기 비동기 통신 실습</div>
      <div>
        <button onClick={onClickAsync}>REST-API(비동기) 요청하기</button>
        <button onClick={onClickSync}>RESP-API(동기) 요청하기</button>
      </div>
    </>
  );
}

 

 

 

 

비동기 요청 버튼과 동기 요청 버튼을 만들어 각각 클릭해보면 첫번째는 Promis 두번째는 데이터를 가져 오는 것을 확인할 수 있다. 근데 보면 가져온 데이터에 뭔가 많은데 data의 내용을 가져와서 화면에 표시하도록 다시 코드를 작성해보면

 

 

import axios from "axios";
import { useState } from "react";

export default function RestGetPage() {
  //state
  const [title, setTitle] = useState("");

  //비동기통신 함수
  const onClickAsync = () => {
    const result = axios.get("https://koreanjson.com/posts/1");
    console.log(result);
  };
  
  //동기통신 함수
  const  onClickSync = async() => {
    const result = await axios.get("https://koreanjson.com/posts/1");
    console.log(result.data);
    console.log(result.data.title);
    setTitle(result.data.title);
  }



  return (
    <>
      <div>동기 비동기 통신 실습</div>
      <div>
        <button onClick={onClickAsync}>REST-API(비동기) 요청하기</button>
        <button onClick={onClickSync}>RESP-API(동기) 요청하기</button>
        <div>{title}</div>
      </div>
    </>
  );
}

 

 

 

 

 

실습타임!!😆(Graphql-API)

이번에는 그래프큐엘 에이피아이를 이용해서 실습을 해봤다. rest-api랑은 다르게 use~로 시작한다.

 

const [실행함수] = useMutation()

 

useMutation하고 () 안에 세팅을 해주는데 꽤 길기 때문에 따로 변수를 만들어서 넣어준다.

 

const CREATE_BOARD = gql`
  mutation {
    createBoard(
      writer: "유리"
      title: "오늘의 기분"
      contents: "배고프고 마라탕 먹고싶고"
    ) {
      _id
      number
      message
    }
  }
`;

변수명은 CREATE_BOARD 주로 대문자로만 이용해서 만든다고 한다. gql은 Graphql의 약자이고 이것을 이용하기 위해서는

 

import { gql, useMutation } from "@apollo/client";

 

을 import 해주어야 한다.

 

import { gql, useMutation } from "@apollo/client";

const CREATE_BOARD = gql`
  mutation {
    createBoard(
      writer: "유리"
      title: "오늘의 기분"
      contents: "배고프고 마라탕 먹고싶고"
    ) {
      _id
      number
      message
    }
  }
`;

export default function GraphqlMutationPage() {
  const [나의함수] = useMutation(CREATE_BOARD);

  const onClickSubmit = async () => {
    const result =  await 나의함수()
    console.log(result)
  };

  return (
    <div>
      <button onClick={onClickSubmit}>GRAPHQL-API 요청하기</button>
    </div>
  );
}

 

여기까지 코드를 작성해 보았는데 const [] 안에 한글로 된 실행함수를 만들 수 있다는 건 쫌 신기..

useMutation 자체가 비동기로 작동하기 때문에 동기 처리를 위해 async - await를 사용해 주었다.

저작자표시 (새창열림)

'Front > React' 카테고리의 다른 글

[React] Context란? | Context 사용방법과 예시  (1) 2024.09.07
React와 Next.js의 차이와 Next.js 프로젝트 생성하기  (0) 2024.01.22
[React] 카카오 지도 구현  (0) 2023.04.24
Next.js 리렌더링하면 Styled-Components 적용 안됨  (0) 2023.04.13
[React] Edit Page 보완 - defaultValue와 myvariables  (0) 2023.03.18
'Front/React' 카테고리의 다른 글
  • [React] Context란? | Context 사용방법과 예시
  • React와 Next.js의 차이와 Next.js 프로젝트 생성하기
  • [React] 카카오 지도 구현
  • Next.js 리렌더링하면 Styled-Components 적용 안됨
soyeon26
soyeon26
  • soyeon26
    개발 일지
    soyeon26
  • 전체
    오늘
    어제
    • 분류 전체보기 (107)
      • Web (22)
        • Web (1)
        • HTTP (0)
      • Language (29)
        • Java Script (3)
        • Type Srcipt (1)
        • Java (25)
      • Front (19)
        • HTML+CSS (4)
        • React (15)
      • Back (41)
        • Spring(Springboot) (9)
        • JSP (21)
        • Database (5)
        • NestJS (6)
      • Devops (6)
        • Docker (1)
        • Git & SVN (5)
      • App (7)
        • Android (7)
      • IT 정보 (3)
  • 블로그 메뉴

    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백엔드
    Next.js
    과학기술인등록번호 조회
    강의후기
    강의 후기
    csr과ssr의 차이
    java의 정석
    SSR
    Spring
    서블릿
    React
    인프런
    springboot
    김영한
    프론트엔드
    javascript
    자바스크립트set
    sql강의
    과학기술인번호 조회
    csrvsssr
    React Next.js
    SQL강의 추천
    과학기술인 등록
    과학기술인 번호 발급
    과학기술인 등록번호 발급
    스프링부트
    Java
    데이터베이스 강의
    Next.js 필요성
    중복제거
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
soyeon26
[React] 동기 / 비동기 통신
상단으로

티스토리툴바