API 통신을 위한 표준이다. REST와 같은 레이어.
REST API의 단점을 보완하기 위해 페이스북에서 만든 API 표준이다.
over-fetching 과 under-fetching 문제를 해결한다.
불필요한 정보까지 전송하는것.
예를 들면 어떤 게시글의 작성자의 아이디가 필요할 때.
작성자 아이디를 조회하는 엔드포인트가 있다면 좋겠지만 없다고 가정해보자.
이런 경우 게시글 정보를 조회 한 후에 거기에 있는 작성자 정보를 사용해야한다.
불필요한 게시판의 정보까지 전달받게 되는 것이다.
필요한 정보가 부족한 것
이번엔 사용자의 아이디로 친구 리스트, 작성 글 리스트, 좋아요 목록이 필요하다.
하지만 이 정보들을 한 번에 전달해주는 엔드포인트가 없다.
이런 경우 여러번에 걸쳐서 조회가 일어나게 된다.
GraphQL은 이런 단점들을 보완해준다.
GraphQL은 /graphql 이라는 하나의 엔드포인트만을 사용한다.
또한 여러개의 쿼리 또는 뮤테이션을 동시에 보낼수도 있고 필요한 정보만 받아올수도 있다.
한 번의 조회만으로 딱 필요한 정보만 받아서 사용 할 수 있다.
또한 쿼리 형식으로 좀 더 코드 친화적인? 요청을 작성 하는 것도 장점이라고 생각한다.
쿼리는 주로 데이터 조회에 사용하고 뮤테이션은 데이터 조작에 사용한다.
GraphQL에서는 다양한 스칼라 타입을 지원한다.
Int : 정수형
Float : 실수형
String : 문자열
Boolean : 논리값
ID : 식별자 타입, 문자열의 형식이다.
→ 실험 해보니 ID값으로 넣어도 서버에서 받는 값은 같았다. 암호화를 위한 타입같다.
enum: 열거형 타입
type: 사용자 정의 타입
input: 사용자 정의 입력 타입
[]: 리스트
!: not null
쿼리와 뮤테이션은 .graphqls 파일에 작성한다.
정의
type Query{
getBoardList: [Board]
getBoardListByBoardId(boardId: Int!): [Board]
}
조회
query{
getBoarList{
boardId
content
author
updatedDate
},
getBoardListByBoardId(boardId: 1){
author
}
}
조회는 GET 요청으로 해도 되고 POST요청으로 해도 된다.
여러개의 쿼리를 요청 할 수 있다.
정의
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
}