Skip to content

GraphQL은 정확하게 데이터를 요청하는 방법을 설명하는 구문이다. 서로를 참조하는 복잡한 엔티티를 사용하는 애플리케이션의 데이터 모델을 사용하고, 그것을 다양한 방식으로 조회해야 할때 유용하게 사용된다.

최근 GraphQL 생태계는 Apollo, GraphiQL, GraphQL Explorer와 같은 강력한 도구와 라이브러리로 확장되고 있다.

GraphQL 동작방식

GraphQL은 GraphQL API에서 만들 수 있는 모든 쿼리와 반환하는 모든 타입에 대해 설명하는 스키마를 정의하는 것으로 시작한다. 스키마 정의 언어(SDL)에서는 엄격한 타입 정의를 사용하기 때문에 스키마 정의가 쉽지 않다.

쿼리 전에 스키마를 통해 쿼리에 대한 유효성 검사를 한 뒤 본 요청이 백엔드 애플리케이션에 도달하면, 전체 스키마를 통해 GraphQL 작업이 해석된 후, 프론트엔드 애플리케이션에 응답할 데이터가 생성된다. 하나의 대규모 쿼리를 서버에 요청하면 API는 요청한 데이터의 형태와 정확히 일치하는 JSON 데이터를 응답으로 반환한다.

GraphQL에는 RESTful한 CRUD 작업 외에도 서버로부터 실시간 알림을 받는 구독이 있다.

GraphQL의 장점

1. 스키마에서 타입 사용

  • GraphQL은 무엇을 할 수 있는지 미리 게시하여 검색 성능을 높인다. GraphQL API에서 클라이언트에 접근하면 사용 가능한 쿼리를 확인할 수 있다.

2. 그래프 형태의 데이터에 유용함

  • GraphQL은 연결된 관계의 데이터를 다루는데 효율적이다. (하지만 단순한 구조의 데이터를 다루는데에는 효율성이 떨어진다.)

3. 비슷한 API를 계속 만들지 않아도 됨

  • REST는 여러 버전의 API를 제공하지만, GraphQL은 발전하는 단일 버전을 사용하여 새로운 기능을 언제든 사용할 수 있고, 서버 코드를 더 깔끔하고 유지 관리가 용이하게 작성할 수 있다.

4. 상세한 에러 메시지

  • GraphQL은 SOAP과 유사한 방식으로 발생한 에러에 대한 세부 정보를 제공한다. 에러 메시지는 resolver와 에러가 발생한 쿼리 부분에 대한 정보를 명시한다.

5. 유연한 권한

  • GraphQL에서는 개인 정보를 보호하며 특정 기능을 선택적으로 노출할 수 있다. 반면 REST 아키텍처는 데이터를 부분적으로 공개할 수 없다. 데이터 전부가 노출되거나 전부 보호된다.

GraphQL의 단점

1. 성능 문제

  • GraphQL은 하나의 요청에 너무 많은 중첩 필드가 있는 경우, 시스템에 과부하가 발생한다.

2. 캐싱의 어려움

  • GraphQL은 HTTP 캐싱 시멘틱을 재사용하지 않기 때문에 사용자 정의 캐싱을 구현하기 어렵다.

3. 러닝커브

  • 배우고 사용하는데 시간이 필요하다.

GraphQL 사용예시

모바일 API 개발

네트워크 성능과 단일 메시지의 페이로드 최적화가 중요하다. 따라서 GraphQL은 모바일 기기에서 보다 효율적인 데이터 로딩을 제공한다.

복잡한 시스템과 마이크로서비스

GraphQL은 API 뒤에 있는 여러 시스템 통합의 복잡성을 숨길 수 있다. GraphQL은 여러 시스템으로부터 데이터를 집계하여 하나의 글로벌 스키마로 병합한다. 이는 시간에 지남에 따라 확장하는 레거시 인프라 또는 third-party API와 관련이 있다.