[CodeCamp-Week 1] Rest-API vs GraphQL- API

·2022년 7월 7일
0

state 박스에 데이터 넣어주기도 버거운 내가 API를 배웠다 (넹...?)
와중에 이 어려운 API가 종류도 두 가지라 두 가지나 알아야한다!
axios의 Rest-API와 apollo-client의 GraphQL-API에 대해 살펴보자!

1. API 란?

우선 컴퓨터 상에서 특정 정보를 얻기 위해선 무조건 "2개"의 컴퓨터가 필요하다.
두 컴퓨터가 텍스트 데이터를 주고 받는 길을 HTTP라고 한다.

HTTP를 통해 프론트엔드 컴퓨터가 요청(request)을 하면, 백엔드 컴퓨터가 요청받은 데이터를 데이터베이스에서 가져와 응답(respose)해준다.

API란, 프론트엔드 컴퓨터가 백엔드 컴퓨터로 요청(request)을 보냈을 때 실행되는 백엔드 기능이라고 할 수 있다.
데이터가 넘쳐나는 세상에서 프론트엔드 컴퓨터는 다양한 데이터를 요청할 것이므로 HTTP는 수십 수만 개가 필요하고, 그 HTTP를 백엔드에서 담당하는 것이 API라고 할 수 있다.

2. API 종류

Rest-API

1) Rest-API는 API 이름이 홈페이지 주소처럼 생겼다.

http://naver.com/board/1

2) Rest-API를 쓸 경우 프론트엔드에서는 백엔드에서 response 해주는 모든 데이터를 받아야한다.

3) Rest-API의 요청 담당자(라이브러리)는 axios이다.

GraphQL-API

1) GraphQL-API는 일반적인 함수처럼 생겼다.

board(1)

2) GraphQL-API는 Rest-API와 달리 프론트엔드에서 필요한 데이터만 골라서 받을 수 있다.

3) GraphQL-API의 요청 담당자(라이브러리)는 apollo-client이다.

3. CRUD

CRUD란, Creat Read Update Delete의 약자로 API를 생성하고 읽고 수정하고 삭제하는 것을 의미한다.

Rest-API

Rest-API에서는 post, get, put, delete로 실행할 수 있다.

GraphQL-API

GraphQL-API에서는 Creat Update Delete는 Mutation으로, Read는 Query로 실행할 수 있다.

4. API 명세서

API 명세서란, API에 대한 내용을 설명해주는 API 설명서이다.
프론트엔드가 해당 API를 활용하기 전, 백엔드에서 만들어 둔 API의 개수와 구성을 확인하기 위해 필요하다. 따라서 API 명세서 역시 백엔드가 만든다.

Rest-API

Rest-API는 API의 내용을 직접 확인하는 연습 창구와 API를 설명해둔 설명서 창구가 다르다.
연습은 포스트맨(Postman)에서 가능하며, 설명서는 스웨거(Swagger)에서 확인할 수 있다.

GraphQL-API

GraphQL-API는 연습 창구와 설명서 창구가 하나로 같다.
(Rest-API 보다 친절한 친구다!)
플레이그라운드 (Playground)에서 설명서를 확인하며 연습해볼 수 있다.

5. VS Code에서 활용하기

API 실행 방식에는 동기 실행비동기 실행이 있다.
게시글 등록 API와 게시글 불러오기 API가 있는 경우, 게시글 등록 API를 통해 게시글 등록이 완료되어야 게시글 불러오기 API를 통해 게시글을 불러올 수 있을 것이다.

자바스크립트의 경우 기본적으로 동기 실행이 디폴트 값이기 때문에 게시글 등록, 조회와 같이 순차적으로 처리를 해야 할 경우 따로 처리할 것이 없다.
그러나, 우리가 사용하는 axios와 apollo-client 라이브러리는 비동기 실행이 디폴트 값이기 때문에 따로 동기 실행으로 변환시켜줘야 한다!
이를 위해 async/await를 활용한다.

Rest-API

1) 비동기 통신

function freeBoard() {
	const data = axios.get ('http://koreanjson.com/posts/1')
    console.log(data)  // Promise
 }

2) 동기 통신

 async function freeBoard() {
	const data = await axios.get ('http://koreanjson.com/posts/1')
    	console.log(data)  //{id: 1, title: "정당한..."}
 }

[화살표 함수로 표현할 경우]

const freeBoard = asyns () => {
	const data = await axios.get ('http://koreanjson.com/posts/1')
    console.log(data)  //{id: 1, title: "정당한..."}
 }

GraphQL-API

첫번째로 '_app.js' 파일에서 설치 도구를 셋팅해줘야 한다. 아직 내가 이 과정은 이해를 한게 아니므로... 세팅한 상태로 치고 넘어가겠다!

1) 비동기 통신

 // graphql 요청에 필요한 도구 불러오기
 import {useMutation, gql} from '@apollo/client'
 
 // graphql 코드 생성
 const CREATE_BOARD = gql `
    mutation {
        createBoard(writer:"철수", title:"제목입니다~~", contents:"내용이에요!!!"){
            _id
            number
            message
        }
    }
`
  
//버튼 클릭 시 실행되는 함수에서 mutation 코드 생성 및 mutation 코드 실행
export default function GraphqlMutationPage() {
    const [createBoard] = useMutation(CREATE_BOARD)

    const onClickGraphqlApi = () => {
        const result = createBoard()
        console.log(result)
        console.log(result.data.createBoard.message)
    }

    return (
        <button onClick={onClickGraphqlApi}>GraphQl-API 요쳥하기!</button>
    )
}

2. 동기 통신

 // graphql 요청에 필요한 도구 불러오기
 import {useMutation, gql} from '@apollo/client'
 
 // graphql 코드 생성
 const CREATE_BOARD = gql `
    mutation {
        createBoard(writer:"철수", title:"제목입니다~~", contents:"내용이에요!!!"){
            _id
            number
            message
        }
    }
`
  
//버튼 클릭 시 실행되는 함수에서 mutation 코드 생성 및 mutation 코드 실행
export default function GraphqlMutationPage() {
    const [createBoard] = useMutation(CREATE_BOARD)

    const onClickGraphqlApi = async() => {
        const result = await createBoard()
        console.log(result)
        console.log(result.data.createBoard.message)
    }

    return (
        <button onClick={onClickGraphqlApi}>GraphQl-API 요쳥하기!</button>
    )
}
profile
개발을 개발새발 열심히➰🐶

0개의 댓글