Over-fetching과 Under-fetching

GraphQL을 처음 쓰고 알아가면서 왜 GraphQL을 사용하냐고 했을 때
알아야한다고 생각되는 개념이 Over-fetchingUnder-fetching 인 것 같다.

Over-fetching

Over-fetcing은 API를 호출 시 필요보다 많은 데이터(사용하지 않을)를 가져오는 것이다.

예를 들어 클라이언트에게 페이스북 친구 목록을 보여주기 위해 필요한 정보는
친구들의 ID, 이름, 프로필 사진 URL 이라고 하면
친구의 정보지만 친구 목록 보여주기 기능에 필요하지 않은 정보인 출신이나 좋아요를 누른 페이지 등이 추가적으로 딸려오는 것이다.

예를 들자면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
friends: [
{
// 필요한 정보
"id": 1
"name": "Chris",
"profile_url": "http://localhost.com/users/chris/profile.jpg",
// 필요하지 않은 정보
"hometown": "Seoul",
"likes": {
"pages": [1, 2, 3, 4],
"posts": [1, 2, 3, 4]
}
},
{
// 필요한 정보
"id": 2
"name": "Brian",
"profile_url": "http://localhost.com/users/brian/profile.jpg",
// 필요하지 않은 정보
"hometown": "N.Y.",
"likes": {
"pages": [2, 7, 20],
"posts": []
}
}
]
}

이렇게 불필요한 정보로 인해 서버와 네트워크의 자원이 불필요하게 추가로 사용된다.

Under-fetching

Under-fetching은 하나의 endpoint로의 요청으로는 충분한 데이터를 받지 못하는 것을 말하고
이로 인해서 두 개 혹은 그 이상의 endpoint에 요청을 해야한다.

앞의 예제를 확장 시켜 내 정보 페이지에 내 정보내 친구 목록을 보여줘야하는데
API의 endpoint가 GET /users/{id}(내 정보)와 GET /users/{id}/friends(친구 목록) 이렇게 나눠져 있다고 하면
하나의 endpoint를 통해 필요한 정보를 모두 받아올 수 없어 필연적으로 API를 2번 호출해야한다.
그러면 단일 API 호출에 비해 네트워크 오버헤드가 추가되기 때문에
사용자가 앱 사용시 느린 속도로 인한 불편함을 느낄 수 있다.

Share