GraphQL과 REST는 인터넷을 통한 데이터 교환을 위한 API를 설계하는 두 가지 접근방식이다.
1. 고정 구조 데이터 교환
REST API는 클라이언트 요청이 고정된 구조를 따라야 리소스를 수신할 수 있다. 엄격한 구조는 사용하기 쉽지만 필요한 데이터를 정확히 교환하기에 무조건 효율적인 수단인 건 아니다.
2. 오버페칭 및 언더페칭
REST API는 항상 전체 데이터 세트를 반환한다. 예를 들어 REST API의 person 객체로부터는 그 사람의 이름, 생년월일, 주소 및 전화번호를 받게 된다. 전화번호만 있으면 이 모든 데이터를 얻을 수 있다.
또한 개인의 전화번호와 마지막 구매 내역을 알려면 여러 개의 REST API 요청이 필요하다. /person
이라는 URL은 전화번호를 반환하고 /purchase
라는 URL은 구매 내역을 반환한다.
소셜 미디어 개발자는 API 요청을 처리하기 위해 많은 양의 코드를 작성해야 했고, 이는 성능과 사용자 경험에 영향을 미쳤다.
SO ?
GraphQL이 쿼리 기반 솔루션으로 부상했다. 쿼리는 한 번의 API 요청 및 응답 교환에서만 정확한 데이터를 반환할 수 있다.
REST API는 HTTP 메서드를 사용하여 작업을 수행하는 API를 구축하기 위한 아키텍처 스타일인 반면, GraphQL은 클라이언트 사이드에서 필요한 데이터만 요청할 수 있는 API를 위한 쿼리 언어다.
GraphQL과 REST는 모두 클라이언트-서버 모델에서 서로 다른 서비스 또는 애플리케이션 간에 데이터를 교환할 수 있는 널리 사용되는 API 아키텍처 스타일이다.
프론트엔드 및 백엔드 팀은 이러한 API 아키텍처를 사용해 모듈식 애플리케이션 및 접근성이 뛰어난 애플리케이션을 만든다. API 아키텍처를 사용하면 시스템을 안전하고 모듈화되고 확장 가능한 상태로 유지할 수 있다. 또한 시스템의 성능이 향상되고 다른 시스템과의 통합이 더 쉬워진다.
1. 아키텍처
REST와 GraphQL 모두 몇 가지 일반적인 API 아키텍처 원칙을 구현한다. 공통적인 원칙으로는
2. 리소스 기반 설계
REST와 GraphQL은 모두 리소스를 중심으로 데이터 교환을 설계한다. 리소스는 클라이언트가 API를 통해 엑세스하고 조작할 수 있는 모든 데이터 또는 객체를 말함. 각 리소스마다 고유할 식별자 URI)와 클라이언트가 해당 리소스에 대해 수행할 수 있는 작업세트(HTTP 메서드)가 있다.
3. 데이터 교환
REST와 GraphQL 모두 유사한 형식을 지원한다.
JSON은 모든 언어, 플랫폼 및 시스템이 인식하는 가장 널리 사용되는 데이터 교환 형식이다. 서버는 JSON 클라이언트에 반환한다. XML 및 HTML을 비롯한 다른 형식도 사용 가능하지만 일반적으론 사용하지 않는다.
둘다 캐싱을 지원해서 클라이언트와 서버는 자주 액세스하는 데이터를 캐싱하여 통신 속도를 높일 수 있다.
4. 언어 및 데이터베이스 중립성
GraphQL과 REST API 모두 클라이언트 측과 서버 측의 모든 데이터베이스 구조 및 프로그래밍 언어를 지원한다. 따라서 모든 애플리케이션과의 상호 운영성이 뛰어남.
REST API는 애플리케이션 통신을 위한 아키텍처 개념이다. 반면 GraphQL은 사양, API 쿼리 언어 및 도구 세트이다. GraphQL은 HTTP를 사용해 단일 엔드포인트에서 작동한다.
클라이언트 측 요청
리소스에서 읽기 전용 데이터를 가져오려면 GET을 사용하고, 새 리소스 항목을 추가하려면 POST를 사용하며, 리소스를 업데이트하려면 PUT을 사용
2.대조적으로 GraphQL 요청
클라이언트에 반환되는 데이터
REST아키텍처에서는 서버가 지정한 전체 리소스 구조로, 서버에서 클라이언트로 데이터가 반환된다.
REST에서 반환되는 데이터의 예
REST에서 GET /posts는 다음을 반환한다.
[
{
"id": 1,
"title": "First Post",
"content": "This is the content of the first post."
},
{
"id": 2,
"title": "Second Post",
"content": "This is the content of the second post."
},
{
"id": 3,
"title": "Third Post",
"content": "This is the content of the third post."
}
]
GraphQL에서 반환되는 데이터의 예
GraphQL을 사용할 경우 클라이언트가 제공한 구조에 지정된 데이터만 반환된다.
GET /graphql?query{post(id: 1) {id title content}}
는 첫 번째 게시물만 반환한다.
{
"data": {
"posts": [
{
"id": "1",
"title": "First Post",
"content": "This is the content of the first post."
},
]}}
또한 다양한 기능 영역에 대해 GraphQL API와 REST API 모두 사용하여 단일 애플리케이션을 구축할 수도 있음.
REST | GraphQL | |
---|---|---|
무엇인가요? | REST는 클라이언트와 서버 간의 정형 데이터 교환을 정의하는 일련의 규칙 | GraphQL은 API를 생성하고 조작하기 위한 쿼리 언어, 아키텍처 스타일 및 도구 세트 |
가장 적합한 용도 | REST는 리소스가 잘 정의된 간단한 데이터 소스에 적합 | GraphQL은 크고 복잡하며 서로 연관된 데이터 소스에 적합 |
데이터 액세스 | REST에는 리소스를 정의하는 URL 형태의 여러 엔드포인트가 있음. | GraphQL에는 단일 URL 엔드포인트가 있음. |
반환된 데이터 | REST는 서버가 정의한 고정된 구조로 데이터를 반환 | GraphQL은 클라이언트가 정의한 유연한 구조로 데이터를 반환 |
데이터 구조 및 정의 방법 | REST 데이터는 형식이 약하게 지정됨. 따라서 클라이언트는 형식이 지정된 데이터를 반환할 때 해석하는 방법을 결정해야함. | GraphQL 데이터는 엄격하게 형식이 지정됨. 따라서 클라이언트는 미리 결정되고 상호 이해되는 형식으로 데이터를 수신함. |
오류 검사 | REST를 사용할 경우 반환된 데이터가 유효한지 클라이언트가 확인해야 함. | GraphQL을 사용하면 잘못된 요청이 일반적으로 스키마 구조에 의해 거부됨. 그 결과 오류 메시지가 자동으로 생성 |