GraphQL이란 무엇인가?
GraphQL은 페이스북에서 개발한 쿼리 언어로, RESTful API를 대체하는 새로운 방식의 API입니다. GraphQL은 클라이언트 측에서 쿼리를 작성하면 서버에서 해당 쿼리에 대한 결과만을 가져오는 방식으로 동작합니다.
RESTful API에서는 클라이언트에서 데이터를 가져올 때, API의 URI를 통해 해당 데이터를 가져오는데, 이 때 필요한 데이터만큼 URI를 조합하여 가져와야 합니다. 하지만 GraphQL은 서버 측에서 정의된 스키마(schema)를 기반으로 클라이언트에서 원하는 데이터를 쿼리하여 가져올 수 있습니다. 예를 들어 아래와 같이 서버에 Query를 날려서 데이터를 가져올 수 있습니다.
query {
user {
name
age
}
}
위 쿼리를 보내면, 서버에서는 "user" 객체의 "name"과 "age" 필드를 반환합니다. 이렇게 필요한 필드만을 요청할 수 있기 때문에, 불필요한 데이터를 받을 필요가 없습니다.
다음은 "사용자" 객체의 "이름"과 "나이" 필드와 함께, 해당 사용자가 작성한 "포스트" 객체의 "제목"과 "작성일" 필드를 요청하는 GraphQL 쿼리입니다.
query {
user {
name
age
posts {
title
createdAt
}
}
}
위 쿼리를 보내면, 서버에서는 "user" 객체의 "name"과 "age" 필드와 함께 "posts" 필드를 반환합니다. "posts" 필드에는 "제목"과 "작성일" 필드가 포함되어 있습니다. 이렇게 하나의 요청으로 여러 객체와 필드를 반환받을 수 있기 때문에, REST API와 비교해서 효율적인 요청을 보낼 수 있습니다.
GraphQL의 구성요소
GraphQL은 Query, Schema, Resolver세 가지 핵심 구성 요소로 이루어져 있습니다.
- Query(질의): 클라이언트가 원하는 데이터를 서버로 보내는 것입니다. GraphQL의 쿼리는 REST API의 엔드포인트와 비슷한 역할을 합니다. 하지만 GraphQL의 쿼리는 REST API와 달리 원하는 데이터만을 선택적으로 가져올 수 있습니다.
- Schema(스키마): 클라이언트와 서버 간의 데이터 교환에 대한 계약서입니다. 스키마는 데이터의 형식과 구조를 정의하며, 클라이언트가 가져올 수 있는 데이터의 종류와 해당 데이터에 대한 요청 방식을 결정합니다.
- Resolver(해결자): 서버에서 데이터를 가져오는 로직을 구현하는 함수입니다. 클라이언트가 요청한 데이터가 어떻게 가져와질지 결정합니다. Resolver는 스키마에서 요청한 필드와 연결되어 있으며, 이 필드를 해결하기 위해 데이터 소스와 연결하여 결과를 반환합니다.
GraphQL의 장단점
GraphQL의 장점
필요한 데이터만 가져올 수 있다
REST API에서는 요청한 데이터와 상관 없이 모든 데이터를 반환합니다. 그러나 GraphQL은 클라이언트가 원하는 데이터만 선택적으로 가져올 수 있습니다.
여러 API 호출이 필요 없다
REST API에서는 여러 엔드포인트를 호출해야 하는 경우가 많습니다. 그러나 GraphQL은 하나의 엔드포인트에서 여러 데이터를 가져올 수 있습니다.
강력한 타입 시스템을 가지고 있다
GraphQL의 타입 시스템은 스키마에 정의되어 있으며, 클라이언트는 요청할 수 있는 데이터와 해당 데이터의 형식을 알고 있습니다.
디버깅이 쉽다
REST API에서는 오류 메시지가 자주 일어납니다. 그러나 GraphQL은 실행 중인 쿼리를 확인하고 문제가 발생한 위치를 쉽게 찾을 수 있습니다.
GraphQL의 단점
GraphQL은 다음과 같은 단점들이 있습니다.
학습 곡선이 높음
GraphQL은 RESTful API보다 더 복잡하고 학습 곡선이 더 높습니다. 이는 새로운 개념과 용어를 익혀야 하며, 새로운 도구와 프레임워크를 배워야 한다는 것을 의미합니다.
오버헤드 발생 가능성
GraphQL 쿼리는 클라이언트에서 서버로 전송될 때, 쿼리에 포함된 필드, 인자 및 쿼리의 복잡도에 따라 데이터 전송량이 증가할 수 있습니다. 이는 대량의 데이터를 처리할 때 오버헤드가 발생할 수 있으며, RESTful API보다 데이터 전송량이 큰 경우가 많습니다.
보안 취약점 발생 가능성
GraphQL API는 RESTful API보다 복잡하고 강력하기 때문에 취약점이 발생할 가능성이 높습니다. 또한, 쿼리 문자열에 대한 제한이 없기 때문에, 사용자가 악의적인 쿼리 문자열을 보낼 수도 있습니다.
캐싱이 어려움
GraphQL은 RESTful API와 달리 HTTP 캐시를 지원하지 않습니다. 이는 동일한 쿼리가 여러 번 수행될 때, 매번 데이터베이스에 쿼리를 보내야 한다는 것을 의미합니다. 이는 불필요한 데이터베이스 요청이 발생하며, 성능이 저하될 수 있습니다.
스키마 변경 관리가 어려움
GraphQL API에서 스키마는 API 버전 관리와 호환성을 유지하기 위해 중요합니다. 스키마가 변경되면 클라이언트 측에서 코드를 업데이트해야 합니다. 이는 기존에 사용 중인 클라이언트 애플리케이션의 호환성 문제를 일으키며, 업그레이드가 어려울 수 있습니다.
이러한 단점들은 GraphQL을 사용할 때 고려해야 하는 중요한 요소입니다. 하지만 이러한 단점들은 전체적으로 GraphQL이 가진 장점과 비교했을 때, 상대적으로 작은 문제입니다.