GraphQL이란?

이재연·2021년 1월 14일
1

GraphQL

API 통신을 위한 표준이다. REST와 같은 레이어.
REST API의 단점을 보완하기 위해 페이스북에서 만든 API 표준이다.
over-fetching 과 under-fetching 문제를 해결한다.

over-fetching

불필요한 정보까지 전송하는것.

예를 들면 어떤 게시글의 작성자의 아이디가 필요할 때.
작성자 아이디를 조회하는 엔드포인트가 있다면 좋겠지만 없다고 가정해보자.
이런 경우 게시글 정보를 조회 한 후에 거기에 있는 작성자 정보를 사용해야한다.
불필요한 게시판의 정보까지 전달받게 되는 것이다.

under-fetching

필요한 정보가 부족한 것

이번엔 사용자의 아이디로 친구 리스트, 작성 글 리스트, 좋아요 목록이 필요하다.
하지만 이 정보들을 한 번에 전달해주는 엔드포인트가 없다.
이런 경우 여러번에 걸쳐서 조회가 일어나게 된다.

하나의 end-point

GraphQL은 이런 단점들을 보완해준다.
GraphQL은 /graphql 이라는 하나의 엔드포인트만을 사용한다.
또한 여러개의 쿼리 또는 뮤테이션을 동시에 보낼수도 있고 필요한 정보만 받아올수도 있다.
한 번의 조회만으로 딱 필요한 정보만 받아서 사용 할 수 있다.
또한 쿼리 형식으로 좀 더 코드 친화적인? 요청을 작성 하는 것도 장점이라고 생각한다.

쿼리? 뮤테이션?

쿼리는 주로 데이터 조회에 사용하고 뮤테이션은 데이터 조작에 사용한다.

스칼라 타입

GraphQL에서는 다양한 스칼라 타입을 지원한다.

Int : 정수형
Float : 실수형
String : 문자열
Boolean : 논리값
ID : 식별자 타입, 문자열의 형식이다.
→ 실험 해보니 ID값으로 넣어도 서버에서 받는 값은 같았다. 암호화를 위한 타입같다.
enum: 열거형 타입
type: 사용자 정의 타입
input: 사용자 정의 입력 타입
[]: 리스트
!: not null

쿼리와 뮤테이션 작성

쿼리와 뮤테이션은 .graphqls 파일에 작성한다.

  • 쿼리

정의

type Query{
	getBoardList: [Board]
	getBoardListByBoardId(boardId: Int!): [Board]
}
  • getBoardList라는 쿼리이고 Board타입의 리스트를 반환한다.
  • getBoardListByBoardId라는 쿼리는 정수타입의 파라미터를 받는다. 이 파라미터는 not null이어야 한다.

조회

query{
	getBoarList{
		boardId
		content
		author
		updatedDate
	},
	getBoardListByBoardId(boardId: 1){
		author	
	}
}

조회는 GET 요청으로 해도 되고 POST요청으로 해도 된다.
여러개의 쿼리를 요청 할 수 있다.

  • getBoardList를 조회하며 boardId, content, author, updatedDate 값을 받는다.
  • getBoardListByBoardId는 boardId 1을 파라미터로 보내며 author값을 받는다.
  • 뮤테이션

정의

type Mutation{
	setBoard(author: ID!, content: String!, removeKey: String!): Board
	removeBoard(boardId: Int!, removeKey: String!): Board
}

쿼리와 비슷한 방식으로 작성한다.
하지만 파라미터로 input 타입만 받을 수 있다.

조회

mutation{
    setBoardByBoard(board:{
        boardId:1,
        content:"content",
        author:"author"
        }){
        boardId
        content
        author
        updatedDate
    },    
    removeBoard(boardId:1, removeKey:"key"){     
        updatedDate
    }
}

조회 역시 쿼리와 비슷하다.

  • 타입
type Board{
	boardId:Int
	content: String
	author: String
	updatedDate: String
}

input InputBoard{
	boardId: Int
	content: String
	author: String
}

enum boardType {
  INFO
  HUMOR
  FREE
}
  • 정의부

합치면 이런 형태의 .graphqls 파일이 된다.

type Mutation{
	setBoard(author: ID!, content: String!, removeKey: String!): Board
	removeBoard(boardId: Int!, removeKey: String!): Board
}

type Query{
	getBoardList: [Board]
	getBoardListByBoardId(boardId: Int!): [Board]
}

type Board{
	boardId:Int
	content: String
	author: String
	updatedDate: String
}

input InputBoard{
	boardId: Int
	content: String
	author: String
}

enum boardType {
  INFO
  HUMOR
  FREE
}

출처

https://graphql.org/learn/

0개의 댓글