POST https://api.happybeenbooks.com/graphql
이렇게 하면 API의 버전 관리가 보다 용이해짐
RESTful API는 '어느 책들'의 데이터에 대한 요청인지는 명확하게 나타낼 수 있지만
각각에서 어떤 항목들을 받아올 것인지는 특정하지 못함
GET https://api.happybeenbooks.com/v1/books
GET https://api.happybeenbooks.com/v1/books/1
클라이언트앱에서 책의 목록이 간략한 정보와 함께 나타난 화면을 보여주려면 서버로부터 각 책의 제목과 작가만 받아오면 되지만
RESTful API의 규격대로 만든 API에서는 각 리소스의 모든 데이터가 반환됨
때문에 필요 이상의 데이터가 전송되는 overfetching 문제가 발생함
우리가 사용하는 각종 서비스들에는 이러한 요청과 응답들이 지속적으로 교환되기 때문에 그 과정에서 데이터 낭비, 오버헤드 발생할 수 있음
GraphQL에서는 POST 메소드로 이와 같은 요청을 실어보냄
// POST
query {
books {
title
author
}
}
{
"data": {
"books": [
{
"title": "Clean Code",
"author": "been"
},
{
"title": "Good Code",
"author": "happybeen"
},
{
"title": "Love Code",
"author": "bini"
}
]
}
}
이처럼 GraphQL에서는 클라이언트가 필요로 하는 정보만을 선택해서 서버에 요청할 수 있음
GraphQL로 해결할 수 있는 RESTful API의 또 다른 문제는 Underfetching임(요청을 여러번 보내야 하는 문제)
GET https://api.happybeenbooks.com/v1/books/1
GET https://api.happybeenbooks.com/v1/books/1/reviews
GET https://api.happybeenbooks.com/v1/users/1
GET https://api.happybeenbooks.com/v1/users/2
이처럼 한 화면을 띄우기 위해 여러차례 요청을 보내야 하는 문제를 Underfetching이라고 함
RESTful API는 하나의 요청으로는 충분한 데이터를 받아오지 못하는 Underfetching 문제와
각 요청들에서 필요 이상의 데이터까지 받아와지는 Overfetching 문제도 발생함
하지만 이 과정을 GraphQL로는 이렇게 진행할 수 있음
query {
book(id: "1") {
title
author
reviews {
comment
rating
user {
name
}
}
}
}
{
"data": {
"book": {
"title": "Clean Code",
"author": "been",
"reviews": [
{
"coment": "This book is very good",
"rating": 5,
"user": {
"name": "Kim"
}
},
{
"coment": "Excellent",
"rating": 4,
"user": {
"name": "Lee"
}
]
}
}
}
mutation {
addBook(
title: "Effective JS",
author: "Jhon",
publishedDate: "2024-08-10",
isbn: "1234567890",
status: "available"
) {
id
title
author
publishedDate
isbn
status
}
}
데이터의 조회 -> query
데이터의 추가, 수정, 삭제 -> mutation
addBook이라고 이름지어진 작업에 추가될 데이터를 담고, 응답으로 받아오고자 하는 데이터도 명시하면 다음과 같은 응답을 받을 수 있음
{
"data": {
"addBook" : {
"id": "123",
"title" : "Effective JS",
"author" : "Jhon",
"publishedDate": "2024-08-10",
"isbn": "1234567890",
"status": "available"
}
}
subscription {
reviewAdded(bookId: "1") {
comment
rating
user {
name
}
}
}
{
"data": {
"reviewAdded": {
"coment": "Excellent",
"rating": 4,
"user": {
"name": "Lee"
}
}
}
}
type Book {
id: ID!
title: String!
author: String!
PublishedDate: String!
isbn: String!
status: String
reviews: [Review]
}
type User {
id: ID!
name: String!
email: String!
}
type Review {
id: ID!
bookId: ID!
userId: ID!
rating: Int!
comment: String
user: User
book: Book
}
type Query {
books(Status: String): [Book]
book(id: ID): Book
users: [User]
user(id: ID!): User
}
type Mutation {
addBook)
title: String!, author: String!, publishedDate: String!, isbn: String!, status: String): Book
deleteBook(id: ID!): Book
)
}
type Subscription {
bookAdded: Book
bookUpdate: Book
bookDeleted: ID
}
1. Caching의 어려움
2. 성능문제
3. 학습곡선
- 복잡하고 방대한 데이터 모델을 가진 서비스
- 클라이언트가 데이터 요청이 많은 제어권을 가진 서비스들
- 데이터의 업데이트에 대한 실시간 반응이 필요한 서비스