
REST와 GraphQL은 모두 널리 쓰이는 API 접근 방식이지만, 데이터를 어떻게 요청·조합·전달할 것인지에 대한 철학이 다르다. 본 글은 두 방식을 데이터 통합 관점에서 비교하고, 어떤 상황에서 어떤 방식을 선택할지 실무 기준을 제시한다.
| 항목 | REST API | GraphQL API |
|---|---|---|
| 기본 개념 | 자원(Resource) 중심 | 질의(Query) 중심 |
| 엔드포인트 | 다수(/users, /orders) | 단일(/graphql) |
| 응답 구조 | 서버가 고정 정의 | 클라이언트가 선택(필드 단위) |
| 문서화 | Swagger/OpenAPI | 스키마 자체가 문서화(Self-documenting) |
| 변경 관리 | 버전 분기(/v1, /v2) | 스키마 확장/Deprecated 필드 |
두 서비스가 있다고 가정한다. User는 사용자 서비스, Attendance는 이벤트 서비스가 소유.
GET /users/1
→ { "id": 1, "name": "Kim", "email": "kim@example.com" }
GET /attendance?userId=1
→ { "userId": 1, "streak": 6, "lastAttendanceDate": "2025-10-08" }
하나의 질의로 필요한 필드만 요청한다.
# POST /graphql
query {
user(id: 1) {
name
attendance {
streak
lastAttendanceDate
}
}
}
응답:
{
"data": {
"user": {
"name": "Kim",
"attendance": {
"streak": 6,
"lastAttendanceDate": "2025-10-08"
}
}
}
}
| 항목 | REST | GraphQL |
|---|---|---|
| 요청 방식 | URL + 메서드 | 단일 URL + 질의 언어 |
| 응답 구조 | 서버가 정함 | 클라이언트가 선택 |
/api/v1/users, /api/v2/users 처럼 URL 버전을 분리.type User {
id: ID!
name: String!
email: String @deprecated(reason: "Use contact.email instead")
contact: Contact
}
Gateway가 여러 REST 서비스를 호출해 응답을 합쳐 단일 응답으로 제공할 수 있다.
// 예시: GET /api/user/summary/:id
// 사용자 기본 정보 + 출석 정보를 합쳐 반환
const user = await http.get(`http://user-service/users/${id}`);
const attendance = await http.get(`http://event-service/attendance?userId=${id}`);
return {
id,
name: user.data.name,
attendance: {
streak: attendance.data.streak,
lastDate: attendance.data.lastAttendanceDate,
},
};
장점: 단순하고 의도 통제가 쉬움.
단점: 통합 포인트가 늘수록 엔드포인트 폭증, 응답 구조 중복, 문서 동기화 부담.
여러 서비스의 스키마를 합쳐 하나의 GraphQL 게이트웨이가 질의를 분해/중계/집계한다.
/graphql로 다양한 조합을 자유롭게 질의.장점: 클라이언트 주도형 통합, 스키마 일관성, Over/Underfetching 완화.
단점: Federation 구성 복잡성, N+1·캐싱·관측성 설계 필요, 운영 난이도.
핵심 정리
| 항목 | REST | GraphQL |
|---|---|---|
| 장점 | 단순, 캐싱 용이, 관측 쉬움 | 유연한 질의, 통합 조회, 스키마 문서화 |
| 단점 | 다중 요청·엔드포인트 폭증 | 복잡한 쿼리로 서버 부하, 캐싱/관측 난이도 |
| 성숙도 | 매우 높음 | 빠르게 성장 중이나 운영 난이도 존재 |
| 적합 | 행위 중심(로그인/명령형), 단순 API | 조회 중심 복합 화면, 집계/탐색형 API |
1) 행위 중심(CUD)·단순 트랜잭션: REST(또는 REST + MQ).
2) 조회 중심·복합 화면: GraphQL(또는 REST Aggregation).
3) 내부 대량 조회/저지연: gRPC(또는 GraphQL 서브그래프 내부 호출).
4) 상태 변경 전파/비동기 파이프라인: MQ(Kafka/RabbitMQ/Redis Streams).
5) 혼합 전략: /auth, /admin 등은 REST, 복합 조회는 /graphql로 제공.