GraphQL 실습 (3)

김민아·2022년 10월 6일
0

GraphQL 실습

GraphQL 실습

GitHub GraphQL playground

GitHub GraphQL API에서 제공하는 Explorer로 GraphQL을 연습해 보자. Explorer 상단의 초록 버튼으로 github 로그인을 하면 별도의 토큰없이 쿼리를 보내고 응답을 받을 수 있다.

explorer 깃허브 로그인

실행 버튼 옆에 prittier, History, Explorer 버튼은 각각 코드를 정렬하고, 보낸 쿼리들을 확인하고, 어떤 필드가 있는지 볼 수 있다.

React에서 GraphQL 세팅

  1. 실습을 위해 react 앱을 만든다. (선택)

    npx create-react-app 'fe-sprint-graphql'
  2. @octokit/graphql 라이브러리를 설치한다.
    로컬 환경에서 graphQL의 쿼리를 쉽게 수행할 수 있게 도와주는 라이브러리이다.

    npm install @octokit/graphql
  3. 쿼리를 작성할 *.jsgraphqlimport한다.
    @octokit/graphql 사용 방법은 여기를 참고하여 작성한다.

    import { graphql } from "@octokit/graphql";
  4. github token을 발급받는다.
    github에서 상단 프로필에서 setting 메뉴 >
    왼쪽 사이드에서 Developer settings >
    Personal access tokens > generate token 버튼

    🛑 주의! 토큰은 발행될 때 한번만 노출된다. 다른 곳에 복사해 둔다.

    github token을 발급

  5. token을 환경변수로 설정했다.
    레퍼런스 참고 | 환경변수 우선순위는?

    // .env.local
    REACT_APP_GHP_TOKEN="ghp_로 시작하는 토큰"

여기까지 세팅이 끝났다. 😇

React에서 GraphQL 실습

📍 header

.env.local에 저장해둔 토큰을 가져와 header에 넣어준다.
처음에 레퍼런스없이 헤맸던 부분인데, token 처럼 스키마 타입을 넣지 않으면 제대로 인식되지 않았다. 검색해본 결과 Bearer 를 넣어서 성공했지만, 나중에 레퍼런스처럼 token 으로 수정하였다.

{
	headers: {
		authorization: `token ${token}`,
	},
}

📍 query

가장 난이도가 빡?셌던 부분! 😇 들여쓰기 지옥 Explorer에서 실습한대로 적용했다고 생각했는데, syntax 에러가 나서 시간이 오래 걸렸다.💀

async를 위해 getRepository 함수를 선언하고 app.js에 작성했다. 쿼리만 작성하면 아직 햇갈릴 것 같아서 전체 코드를 넣었다.

여러 repository를 검색할 일은 없겠지만, discussions의 갯수는 달라질 수 있을 것 같아서 변수로 변경했다. query가 길어지다보니 header를 상단에 배치하는 것이 가독성이 좋아보였다.

// app.js > getRepository

async function getRepository() {
  const GHP_TOKEN = process.env.REACT_APP_GHP_TOKEN;

  const { repository, viewer } = await graphql({
    headers: {
      authorization: `token ${GHP_TOKEN}`,
    },
    owner: "codestates-seb",
    name: "agora-states-fe",
    num: 5,
    query: `query repository($owner: String!, $name: String!, $num: Int!) {
        repository(name: $name, owner: $owner) {
          discussions(first: $num) {
            edges {
              node {
                category {
                  name
                }
                author {
                  login
                  avatarUrl
                }
                createdAt
                title
                id
                url
                answer {
                  author {
                    login
                    avatarUrl
                  }
                  bodyHTML
                  createdAt
                  id
                }
              }
            }
          }
        },
        viewer {
          login
          avatarUrl
        }
      }`,
    },);
    return {repository, viewer};
}

결과는?

감격의 순간.. 🥹 위 discussion과 아래 login된 (본인) 정보가 잘 나온다! 헤맨 만큼 블로깅도 정성스럽게 작성하게 된다.
또 헤맬테니까 참고하려면..

TO DA~


출처

더 공부해 볼 것

  • Authorization의 Bearer과 token 타입의 차이? 복습 필요 😇
  • Apollo Client ::TODO::

0개의 댓글