"유저 정보가 필요한데, API 응답에 유저의 주소, 나이, 가입일, 마지막 접속 기록까지 딸려오네... 난 그냥 이름이랑 프로필 사진만 필요한데..." 😫
REST API를 사용해 본 개발자라면 누구나 이런 경험이 있을 겁니다. 서버가 정해놓은 '고정 메뉴'대로만 데이터를 받아야 해서, 필요하지도 않은 정보까지 받아오는 오버페칭(Over-fetching) 이 발생하거나, 화면 하나를 그리기 위해 여러 API를 호출해야 하는 언더페칭(Under-fetching) 문제에 부딪히곤 하죠.
이런 데이터 낭비와 비효율을 해결하기 위해 페이스북이 개발한 혁신적인 API 설계 방식이 바로 GraphQL입니다.
GraphQL이란? 데이터界的 '맞춤형 뷔페' 🍽️
GraphQL은 "Graph Query Language"의 약자로, 이름처럼 데이터 구조를 그래프(Graph)로 보고 필요한 부분만 콕 집어 질의(Query)하는 언어입니다. REST API와의 차이를 레스토랑에 비유하면 아주 쉽습니다.
- REST API: 정해진 코스 요리와 같습니다. /users/1 이라는 메뉴를 주문하면, 서버(주방)는 전채, 메인, 디저트(이름, 주소, 가입일 등)를 모두 담아 한 접시에 내어줍니다. 손님은 스테이크만 먹고 싶어도, 원치 않는 샐러드까지 받아야 합니다.
- GraphQL: 원하는 음식만 골라 담는 맞춤형 뷔페와 같습니다. 손님(클라이언트)은 "나는 저기 있는 스테이크 한 조각과, 이쪽에 있는 와인 한 잔만 주세요" 라고 정확히 원하는 것만 명시해서 주문할 수 있습니다. 서버(주방)는 그 주문서에 적힌 것만 정확히 담아 내어줍니다.
GraphQL에서는 클라이언트가 API의 데이터 구조를 보고, 필요한 데이터의 종류와 깊이를 직접 결정해서 요청을 보낼 수 있습니다. 서버는 그 요청의 모양 그대로 응답을 내려주죠.
GraphQL의 세 가지 핵심 개념
GraphQL은 크게 세 가지 요소로 이루어져 있습니다.
- 스키마 (Schema): 서버가 제공할 수 있는 모든 데이터의 종류와 그 관계를 정의한 '메뉴판' 입니다. 마치 "우리 레스토랑에는 User라는 요리가 있고, 그 안에는 name, age, posts 같은 재료들이 있습니다. posts는 Post라는 다른 요리와 연결되어 있어요" 라고 상세히 설명해 놓은 청사진과 같습니다. 이 스키마 덕분에 클라이언트는 어떤 데이터를 요청할 수 있는지 명확히 알 수 있습니다.
- 쿼리 (Query): 데이터를 읽기(Read) 위한 요청입니다. 클라이언트가 서버에게 "이 메뉴판(스키마)에서, User의 name과 그 유저가 쓴 posts의 title만 골라서 줘!" 라고 보내는 주문서입니다.
- 뮤테이션 (Mutation): 데이터를 생성(Create), 수정(Update), 삭제(Delete) 하기 위한 요청입니다. "새로운 User를 추가해 줘!" 또는 "이 Post의 내용을 수정해 줘!" 와 같이 시스템에 변경을 일으키는 작업들을 의미합니다.
간단한 쿼리 예시
사용자 ID가 '100'인 유저의 이름과, 그 유저가 최근에 작성한 게시물 3개의 제목만 가져오고 싶다고 가정해 봅시다.
// 클라이언트가 서버에 보내는 GraphQL 쿼리
query GetUserWithPosts {
user(id: "100") {
name
posts(last: 3) {
title
}
}
}
서버는 이 쿼리를 받고, 정확히 이 구조에 맞춰 응답을 내려줍니다.
// 서버가 클라이언트에 보내는 JSON 응답
{
"data": {
"user": {
"name": "홍길동",
"posts": [
{ "title": "GraphQL 정말 편하네요!" },
{ "title": "주말에 다녀온 맛집 후기" },
{ "title": "새로운 프로젝트 시작" }
]
}
}
}
단 한 번의 요청으로, 필요 없는 데이터 낭비 없이 원하는 정보만 쏙쏙 가져왔습니다!
마치며
GraphQL은 클라이언트와 서버 간의 소통 방식을 근본적으로 바꾸는 강력한 도구입니다. 특히 다양한 종류의 클라이언트(웹, 모바일 앱 등)가 존재하는 현대 애플리케이션 환경에서, 각 클라이언트의 요구사항에 맞춰 유연하게 데이터를 제공할 수 있다는 점은 엄청난 장점이죠.
물론 REST보다 초기 설정이 복잡하고, 캐싱 전략이 까다롭다는 단점도 있습니다. 하지만 데이터 효율성과 개발 유연성이 중요한 프로젝트라면, GraphQL은 당신의 팀에게 "API 주소 하나만 줄게, 필요한 건 네가 알아서 가져가!" 라고 말할 수 있는 멋진 경험을 선사할 것입니다. 🚀