클라이언트(Web, App 등)에서 화면을 그리기 위해서는 서버가 만들어놓은 API를 호출해서 데이터를 가져와야 한다.
하나의 화면을 그리기 위해서 여러 API를 호출해 데이터를 조합하여 사용하는 경우가 많은데, 페이지가 복잡해 질수록 데이터 조합도 복잡해질 것이다.
GraphQL에서 해결하고자 하는 문제는 크게 두 개로 볼 수 있다.
Over-Fetching
over fetching은 필요하지 않은 데이터까지 받아오는 것을 의미한다.
유저의 닉네임만을 가져와야 할 때, API에서는 닉네임 뿐만 아니라 다른 정보까지도 주는 경우가 많을 것이다.
{
user : {
id : 1,
nickname : "daengdaeng",
name : "cream",
age : 6,
follower : [2, 3, 4],
...
}
}
이 때문에 불필요한 네트워크 자원의 낭비가 발생하는 것을 over fetching이라고 부른다.
Under-Fetching
under-fetching은 필요한 데이터를 가져오기 위해 여러 번의 API를 호출해야 하는 것을 의미한다.
유저가 팔로우하고 있는 다른 유저의 게시글을 가져온다고 가정했을 때, 다음과 같이 두 번의 API 호출이 필요할 것이다.
- 팔로우 중인 유저 목록 조회
- 특정 유저의 게시글 목록 조회
GraphQL에서는 클라이언트가 필요한 데이터만을 선택하여 한 번에 가져올 수 있도록 해서 이러한 문제를 해결한다.
장단점
장점
HTTP 요청을 줄일 수 있다.
- 원하는 정보를 하나의 쿼리에 담아 요청할 수 있음
HTTP 응답 사이즈를 줄일 수 있다.
- Restful은 응답의 형태가 정해져있으나 GraphQL은 원하는 정보만 선택하여 받아올 수 있음
하나의 엔드포인트만을 사용하기 때문에 엔드포인트 관리가 편하다.
- API별로 엔드포인트를 지정하고 Request Model을 논의하는 단계가 줄어듬
클라이언트 로직이 간단해진다.
- 클라이언트에서는 데이터를 가공하는 작업이 줄어들기 때문에 로직이 간단해짐
- 서버에서는 추가 로직이 필요할 수 있음
단점
HTTP 캐싱이 어렵다.
- Restful은 HTTP 통신을 할 때 엔드포인트마다 헤더 설정을 통해 데이터를 캐싱할 수 있지만 GraphQL은 하나의 엔드포인트를 사용하기 때문에 캐싱이 어려움
- Apollo Client 라이브러리에서는 캐시 옵션을 제공
에러 핸들링이 어렵다.
- GraphQL 쿼리 호출시 성공한 쿼리는 data에, 실패한 쿼리는 errors에 담기는데 각각에 대해 핸들링이 필요함
설계가 복잡하다.
- 클라이언트에서 편하게 호출하려면 서버에서 작업이 많아질 수 밖에 없음.
- 쿼리의 조합에 대해 미리 예상하고 대응해야 하며, 너무 많은 쿼리를 호출했을 때는 성능에 문제가 발생할 수 있기 때문에 제한이 필요함
API 버전 관리가 어렵다.
- 하나의 엔드포인트만을 사용하기 때문에 버전이 달라지는 경우, QueryV1 QueryV2 등과 같이 사용하게 될 수 있음
'Backend > GraphQL' 카테고리의 다른 글
BFF Pattern이란? (0) | 2024.11.10 |
---|