GraphQL을 사용하는 이유
1. GraphQL이란?
GraphQL은 2012년도에 페이스북에 의해 고안된 API용 쿼리 언어이자 쿼리를 수행하기 위한 런타임이다. 2015년에 오픈소스로 공개되었다. GraphQL은 REST 및 웹서비스 아키텍처를 대체할 수 있다. 클라이언트가 필요한 데이터를 명확하게 요청할 수 있는 기능을 제공하며, 클라이언트의 요청 구조에 맞게 서버 측에서도 같은 구조로 응답한다. 이러한 구조는 기존에 REST API가 지녔던 OverFetching(불필요한 데이터를 받는 것)과 UnderFetching(필요한 데이터를 받지 못하는 것)의 단점을 보완할 수 있다.
2. GraphQL 구성 요소
2-1. Server측 구성 요소
- Query(쿼리) : 쿼리는 GraphQL 서버와 통신하기 위해 GraphQL 클라이언트가 만든 응용 프로그램 요청으로 값을 가져오는 데 사용된다.
- Schema(스키마) : 스키마는 객체 타입과 필드로 이루어져 있는 데이터 타입의 집합이다. 데이터의 타입을 정의하고 각 필드의 스칼라타입(String,Int ... )과 Nullable 정보를 정의하고 사용한다. 생성되는 기본 타입들은 GET할때 사용되지만 Mutation Type은 데이터를 추가/삭제/수정 시 사용된다.
const typeDefs = gql`
type User {
id: ID!
firstName: String!
lastName: String!
fullName: String!
}
type Tweet {
id: ID!
text: String!
author: User
}
#GET
type Query {
allUsers: [User!]!
allTweets: [Tweet!]!
tweet(id: ID!) : Tweet
}
#POST/PUT/DELETE
type Mutation {
postTweet(text: String!, userId: ID!) : Tweet!
deleteTweet(id: ID!) : Boolean!
}
`
- Resolver(리졸버) : GraphQL에서 Query,Mutation과 같은 타입이 실제로 일을 하는 부분으로 행동하는 부분을 함수로 만든 집합체다.
const resolvers = {
Query: {
allTweets() {
return tweets;
},
tweet(root, {id}) {
return tweets.find((tweet) => tweet.id === id);
},
allUsers() {
return users;
}
},
User : {
firstName({firstName}) {
return firstName;
},
fullName({firstName, lastName}) {
return `${firstName} ${lastName}`;
}
},
Mutation: {
postTweet(_, {text, userId}) {
const newTweet = {
id:tweets.length + 1,
text,
};
tweets.push(newTweet);
return newTweet;
},
deleteTweet(_, {id}) {
const tweet = tweets.find((tweet) => tweet.id === id);
if (!tweet) return false;
tweets = tweets.filter((tweet) => tweet.id !== id);
return true;
}
},
Tweet: {
author({userId}) {
return users.find(user => user.id === userId);
}
}
}
3. GraphQL vs REST API
3-1. GraphQL의 장점
- 복잡한 데이터를 가져오는 데 둘 이상의 요청이 필요 없으며 단일 요청만으로 필요한 데이터를 가져올 수 있다.
- 필요한 데이터만 가져오므로 주고 받는 데이터의 양을 최소화하여 성능을 향상시킨다.
- RestAPI로 관리할 수 없는 다양하고 복잡한 요청까지 가능하다.
- Endpoint가 '/graphql' 하나로 업데이트 시에도 추후 변경 사항이 없다.
3-2. GraphQL의 단점
- 소규모 응용프로그램에 적합하지 않다.
- 성공 여부에 관계 없이 HTTP 200 상태 코드를 반환한다.
- Query 양이 많아진다.
- 단순한 것도 REST 보다 복잡하게 구현한다.
3-3. GraphQL vs REST
GraphQL | REST |
일반적인 API 문제를 해결하기 위한 쿼리 언어 | API 설계를 위한 표준 아키텍쳐 스타일 |
단일 Endpoint를 사용하여 HTTP를 통해 배포 | 각각 리소스를 노출하는 URL 집합 (Endpoint 여러 개) |
Client 중심 아키텍처 | 서버 중심 아키텍처 |
API 버전관리 불필요 | API 버전관리 필요 |
내장된 캐싱 매커니즘 부족 | 자동으로 캐싱 사용 |
JSON형태 응답 출력 | XML/JSON/YAML 로 된 응답 출력 |
단순하게 데이터 목록을 불러오거나 상세 조건이 필요 없는 경우에는 REST를 쓰는 것이 좋고, 특정 데이터를 얻기 위해 여러번에 걸쳐 통신해야하는 경우는 GraphQL을 사용하는게 좋다.
4. 결론
현재 만들고 있는 프로젝트는 상세 검색이 필요한 서비스이기 때문에 GraphQL을 사용하는게 유리하나 여러 블로그 글들을 읽어봤을때 확실히 REST의 강점도 존재하며, 다양한 플랫폼에서도 돌아가길 원하기 때문에 두 가지 다 만들어 놓고 필요한 걸 가져다 쓰는 방식으로 해야할 것 같다.
2022.09.27 - [개발 Study/Node, js, react] - [GraphQL] GraphQL 사용법 - (1) Schema 생성 후 ApolloServer 연동하기
2022.09.29 - [개발 Study/Node, js, react] - [GraphQL] GraphQL 사용법 - (2) Sequelize + MSSQL 연동
'개발 Study > GraphQL' 카테고리의 다른 글
[GraphQL/Typescript] GraphQL로 이미지 파일 업로드하기 (1) | 2022.12.14 |
---|---|
[GraphQL] GraphQL 사용법 - (4) ThunderClient로 API 테스트하기 (0) | 2022.10.04 |
[GraphQL] GraphQL 사용법 - (3) Sequelize 사용하기(1:1, ForeignKey, Join) (1) | 2022.09.30 |
[GraphQL] GraphQL 사용법 - (2) Sequelize + MSSQL 연동 (1) | 2022.09.29 |
[GraphQL] GraphQL 사용법 - (1) Schema 생성 후 ApolloServer 연동하기 (2) | 2022.09.27 |
댓글