Day 4 학습목표
두 개의 컴퓨터가 서로 데이터를 주고 받기 위한 HTTP 통신 중
요청이 있으면 반드시 응답을 받아와야하는 HTTP의 규칙
등록하고, 요청했는데 안 불러와진다?
글이 작성해서 백엔드로 넘어간 다음 db에 저장이 되면, 그 내용을 불러와야하는데
등록이 되기 전에 불러오는 요청이 들어가서 없다고 나온다
(ex.네이버 메인 / 게임받으며 카톡하기)
' async/ await ': 비동기를 동기로 바꿔주는 명령어
백엔드에서 데이터를 받아올 때까지 기다려야 하지만, 그렇지 않고 두 번째 줄로 바로 넘어오게 된다.
data 안에는 비어있음, 언젠간 주겠다는 promise 만..
왜 ?
📌 javascript는 기본적으로 동기적 방식이다
한 줄 한 줄 내려간다.
📌 axios 등의 라이브러리 => 비동기적 방식
데이터 요청을 했는데, 기다리지 않고 다음 줄로 내려와버린다.
기다리게 하는 명령어
async는 await가 실행되는 함수에 붙여주면 된다.
클릭 함수의 이름은 보통 두 가지로 많이 사용한다
1) handleClick 2) onClick
axios로 get 요청을 보내보자
결과는???
다 받아올 때까지 기다리지 않고 바로 console.log()를 해버리는 바람에 Promise만 나온다.
async/await 를 다시 해보자
결과는??
백엔드에서 데이터를 받아올 때까지 기다렸다가 result {} 저장해서 보여준다.
data를 보려면 result.data!
자바스크립트였다면 이렇게 했겠지만, 리액트에서는 state를 쓰자.
{data}는 빈 문자열이었다가.
rest api 요청 후, 데이터를 받아오면 result.data.titledl data state에 저장되어 보여지게 된다.
app.js (설정파일)에 graphql을 위한 설정을 해야한다.
const [실행함수] = useMutation() - 변경 / post, put, delete
const [실행함수] = useQuery() - 가져오기 / get
실행하기
createBoard()
import { useState } from 'react';
import { gql, useMutation } from '@apollo/client';
const CREATE_BOARD = gql`
mutation {
createBoard(
writer: "철수"
title: "제목입니다~"
contents: "내용이에요!!!"
) {
_id
number
message
}
}
`;
export default function GraphqlMutationPage() {
const [data, setData] = useState('');
const [callGraphql] = useMutation(CREATE_BOARD);
const onClickGraphqlApi = async () => {
const result = await callGraphql();
console.log(result);
setData(result.data.createBoard.message);
};
return (
<div>
<div>{data}</div>
<button onClick={onClickGraphqlApi}> Graphql-Api 요청하기 </button>
</div>
);
}
1) useMutation을 이용해서 함수를 만든다.
2) playground에서 처럼 요청 함수를 작성한다.
2-1) 상단이나 다른 파일에 mutation/query 함수 작성 후 변수에 담아야 함
2-2) 이 때, apollo/client에서 gql, useMutation을 import 해야함
2-2) 그 함수의 이름을 useMutation에 걸어주기
3) 실행 함수에 await 를 붙여, 백엔드에 저장 및 데이터 응답을 받아 올 수 있게 기다려야 한다
4) result.data 안에 함수 이름으로 한 번 더 들어가야 함.
=> result.data.createBoard.return 받고싶은 것
5) 게시물 등록에 성공했다면 {data}에 내용이 나올 것.
단, app.js에 셋팅을 해야 사용할 수 있다!
왜? 필요할까??
rest api는 백엔드 컴퓨터의 주소를 알고있다. (Endpoint)
하지만 graphql에서는 api의 이름을 알지만, 백엔드 컴퓨터의 주소를 모른다.
전체 설정에서 주소를 작성하는 것!
그래서
apolloclient, apolloprovider가 필요하다
url: 백엔드컴퓨터 주소
cache : 임시저장하겠다. 데이터 요청, 받아오는 것이 다른 공간에 임시 저장이 되는 것
여기는 페이지 컴포넌트
어떤 컴포넌트와 상관 없이 모든 페이지에 적용하고 싶다면,
apolloclient 의 내용을 apolloprovider를 통해 제공해주어야 한다.
이제 모든 페이지에서 useMutation 등을 사용할 수 있다!
개발자 도구 활용하기
Elements : html, css 관련 내용을 디버깅하는 곳. 수정한 것은 임시이기 때문에 저장되지 않는다.
Network : api를 요청한 내용을 확인 할 수 있음
헤더 : 요청헤더와 응답헤더 를 확인할 수 있다.
내가 요청한/응답받은 내용, 요약정보 등등을 확인할 수 있다.
페이로드 : 요청했던 데이터
리스폰스 : 응답받은 데이터
프리뷰 : 깔끔하게 확인 가능
네트워크 문제가 생기면 꼭 이 탭에서 메세지 확인을 해야한다.
하드코딩 x
playground에서 변수명과 타입을 잘 보고 써주어야 함! 똑같이!
왜? 변수에 담고, 규칙에 따라 전달하기 위해서
변수에 내용이 담기면
$가 붙은 곳으로 찾아가게 된다.
그 후, 백엔드로 전달
묶음 상단에서 writer를 두 api로 나누어 보낼 수 있음!
input에 데이터를 넣으면, onChange를 통해 state에 내용을 저장한다.
그 후 그 state의 내용은 버튼을 클릭했을 때 백엔드로 보낼 수 있다.
오늘 공부를 돌아보며
아아.. 400 에러에 빠졌다...
3시간째 뭘 해도 400만 나온다...
어떡하지..