[GraphQL] Apollo Server로 GraphQL API 서버 만들기 (1)
GraphQL이란?
페이스북이 창시, API 구축을 위한 쿼리 언어. REST API의 단점을 보완하였으며 사용자가 많은 서비스들의 구축에 유리한 방식.
REST와의 사용 방식 비교
1. GET/POST/PUT/DELETE vs QUERY/MUTATION
2. 사용방법: /memeber/1 (REST). vs member(1) (GraphQL)
오버패칭 극복
REST API를 사용하게 될 시에 클라이언트는 필요하지 않은 데이터들까지 API가 주는 그대로 받아야 하는 단점이 있음. (Over Fetching)
반면 GraphQL은 원하는 데이터만 받을 수 있다.
언더패칭 극복과 단일 엔드포인트
또한 REST API에서 필요한 정보를 제공받기 위해서는 두 번 이상 요청해야 하는 경우가 있다. (Under Fetching) 가령 사원의 ID만을 넘겨주어, 상세 정보를 조회하기 위해서는 API를 한번 더 호출해야 한다. 이에 따라 API 서버 또한 여러개의 엔드 포인트가 설계되어 개발될 수 밖에 없다.
GraphQL에서는 중첩 쿼리를 사용하여 구체적인 원하는 데이터 포멧을 요구할 수 있으며, 하나의 엔드 포인트에서 원하는 데이터를 골라 가져올 수 있다.
네트워크 비용 감소 기대
오버패칭을 극복하여 Response의 사이즈가 가벼워짐에 따라 네트워크 비용의 감소를 기대할 수 있음.
언더패칭을 극복하여 요청의 횟수가 감소하여 네트워크 비용 감소를 기대할 수 있음.
GraphQL의 용어
스키마 (Schema)
API 설계 시 GraphQL을 사용하여 쿼리할 데이터를 명세하는 스키마를 생성한다.
요청과 반환할 수 있는할 수 있는 객체를 정의하며 그에 따른 필드 유형들을 정의한다.
쿼리가 요청되면 해당 스키마의 유형과 비교하여 검증한다.
리졸버 (Resolver)
요청이 스키마에 의해 검증되었으면 이에 따른 결과를 생산하기 위해 실행되는 부분을 정의하는 곳이다.
쿼리(Query)와 변형(Mutation)
클라이언트에서 API를 사용하는 방식이라고 생각하자. REST API의 GET이 Query, POST/PUT/DELETE가 Mutation으로 사용된다고 생각하면 된다.
간단한 GraphQL 문법
게시판을 만든다고 가정하고, fetchBoardsCount는 게시글의 총 개수 가져오기, fetchBoards는 Boards의 읽기, createBoards는 Boards의 쓰기라고 가정하자.
Query(게시글 총 개수 가져오기)
query {
fetchBoardsCount
}
넘겨줄 인자도 없고 반환값이 단일 개체일 시 다음과 같이 사용할 수 있다. 게시글 개수를 가져오는 것이기 때문에 query를 사용한다.
Query(게시글의 제목만 가져오기)
query {
fetchBoards {
title
}
}
중괄호 안에 질의 결과로 원하는 필드만 설정하여 쿼리할 수 있다.
Query(게시글의 제목과 내용 가져오기)
query {
fetchBoards {
title
content
}
}
중괄호 안에 질의 결과로 원하는 필드만 설정하여 쿼리할 수 있다.
Query(1번 게시글의 제목과 내용 가져오기)
query {
fetchBoards(1) {
title
content
}
}
함수와 마찬가지로 Argument를 Pass하여 원하는 질의를 할 수 있다.
Mutation(게시글 쓰기)
mutation{
createBoards(writer: "재휘", createBoardsInput: {
title:"월드컵", detail: "한반두 짱"
}){
success
message
}
}
Object의 형태로 Args를 전달하여 성공 여부와 메시지 얻어오기.
다음 장에서 Apollo Server로 기본적인 GraphQL 서버를 만들어보는 것을 포스팅해보려고 한다.
'Backend > Node.js (NestJS)' 카테고리의 다른 글
[NestJS] - 3. 모듈 구조 - Module/Service/Controller (0) | 2023.02.09 |
---|---|
[NestJS] - 2. NestJS 프로젝트 생성 (0) | 2023.02.08 |
[NestJS] - 1. NestJS 소개 (0) | 2023.02.08 |
[GraphQL] Apollo Server로 GraphQL API 서버 만들기 (2) (0) | 2023.01.21 |
[Express] Swagger API 문서 직접 작성해보기 (0) | 2023.01.18 |