새로 Nest.js 를 공부하면서 GraphQL 을 사용해보게 되었는데, 관련되어 한번 정리하면 좋을것같아 정리합니다.
REST API는 실제 개발하면서 많이 사용해본 구조이고, GraphQL은 새로 사용해보는 개념인데 두개의 차이점이 정확히 무엇인지 궁금해졌습니다. 정리하면서 두가지를 분석해보려고 합니다.
GraphQL 과 REST는 모두 클라이언트-서버 모델에서 다른 서비스와 데이터 통신을 위해 사용하는 API 아키텍처 입니다.
“클라이언트에게 데이터를 전송시켜주는 공통된 목적을 갖고 있다.”
고 볼 수 있습니다. 각각 웹 개발에서 클라이언트와 서버간의 데이터 통신을 위한 수단이라는 점에서 본질적으로 유사한 목적과 구조를 공유한다고 할 수 있습니다.
HTTP 메소드 기반으로 서버와 클라이언트의 통신을 지원하는 구조. 사용자는 원하는 데이터를 API URL 과 HTTP 메소드를 기반으로 조합해 호출할 수 있으며, 많은 BE/FE 서비스 사이의 통신 부분에서 현재 REST API 를 사용하고 있습니다.
개인적으로는 ‘웹 개발’이라고 하면 가장 먼저 떠오르는 통신 방식이 REST API입니다.
추가로, REST API는 단순한 URL-메소드 조합을 넘어서 일정한 설계 규칙(URI 명확성, 무상태성, 자원 중심 설계 등)을 따릅니다. 때문에 REST 방식을 따른다고 해서 반드시 RESTful하다고는 할 수 없으며, 이를 둘러싼 논의도 꾸준히 이어지고 있습니다.
REST API 에 대해 고민하게 해준 영상.
"그런 REST API로 괜찮은가" https://deview.kr/2017/schedule/212
GraphQL은 클라이언트가 필요한 데이터 구조를 명시적으로 요청할 수 있도록 설계된 쿼리 언어이자 서버 측 런타임입니다. 하나의 엔드포인트를 통해 다양한 형태의 요청을 처리할 수 있으며, 클라이언트는 어떤 필드가 필요한지를 직접 정의함으로써 불필요한 데이터 전송을 줄일 수 있습니다.
기존 REST API가 리소스 단위로 URL을 나누고 각 HTTP 메소드에 따라 행동을 정의하는 구조였다면, GraphQL은 단일 엔드포인트에서 쿼리 문법을 통해 동적으로 데이터를 요청하거나 조작하는 방식입니다.
특히 프론트엔드 입장에서 GraphQL은 필요한 데이터를 선언적으로 요청할 수 있기 때문에, over-fetching(불필요한 데이터 과다 수신)이나 under-fetching(필요한 데이터 부족) 문제를 해결하는 데 유용합니다.
다만 GraphQL이 REST보다 무조건 우월한 것은 아니며, 캐싱 구조나 보안, 복잡한 쿼리 최적화 등의 이슈에 대해서는 설계 단계에서 신중한 접근이 필요하다고 생각합니다.
간단하게 정리해보면 다음과 같습니다. 두 차이점을 이해하고 필요에 따라 다르게 선택하여 사용하면 도움이 될 것으로 보입니다.
REST는 단순하고 범용적으로 사용되며 자원 중심적입니다.
GraphQL은 데이터 요구에 따라 유연하게 대응할 수 있는 쿼리 중심적 구조입니다.
REST가 구조적으로 단순하고 익숙하다면, GraphQL은 복잡한 클라이언트 요구사항에 더 적합합니다.
아직 GraphQL 을 많이 사용해본건 아니지만 Nest.js 와 함께 개발해보면서, REST 이외에 통신 방법을 경험해보며 수평적으로 확장, 발전해나 갈 수 있는 좋은 경험이 될다.