GraphQL이란?
GraphQL은 Facebook에서 개발한 오픈 소스 기술로 데이터 쿼리(Query + Schema) 언어입니다.
클라이언트는 GraphQL 서버에 쿼리를 보내고 서버는 이러한 쿼리를 해석하고 데이터를 반환합니다.
이때 클라이언트가 요청한 필드만 반환하기 때문에 over fetching을 줄여 효율적이다.
또한 GraphQL은 스키마를 사용하여 데이터 모델을 정의하므로 클라이언트와 서버 간의 일관된 데이터 통신을 보장합니다.
이를 통해 클라이언트는 서버에서 제공하는 데이터에서 원하는 데이터를 얻을 수 있습니다.
GraphQL 대 Rest API
Rest API는 HTTP 요청 방법(GET, POST, PUT DELETE 등)을 사용하여 데이터를 요청하고 응답을 받습니다.
이때 상황에 따라 다른 방식을 사용해야 하며, 각 API는 자신만의 End Point를 가지고 있습니다.
GraphQL은 동일한 HTTP 요청 메서드를 사용하지만 POST만 사용하고 단일 엔드포인트를 사용합니다.
그리고 요청 시 본문에 있는 스키마에 따라 Query를 이용하여 요청하기 때문에 일관된 커뮤니케이션이 가능합니다.
User라는 데이터에 대해 CRUD API를 구현하여 간단한 예를 들어 보겠습니다.
- REST API의 경우 다음 4개의 엔드포인트가 필요하며 클라이언트간 데이터 타입은 <-> 서버를 명시적으로 표시할 수 없습니다.
- (GET) /api/v1/사용자
- (포스트) /api/v1/사용자
- (PUT) /api/v1/user/:id
- (삭제) /api/v1/user/:id
- GraphQL의 경우 아래와 같이 하나의 엔드포인트만 사용하여 클라이언트간 데이터 일관성을 유지할 수 있습니다.
<-> 섬기는 사람.- (포스트) /graphql
//body의 내용
//create
mutation{
createUser(input: createUserDto){ // createUserDto == {name: string, email: string}
id
name
email
}
}
#read
query{
getUser{
id
name
email
}
}
#update
mutation{
updateUser(input: updateUserDto){ // updateUserDto == {name: string, email: string}
id
name
email
}
}
#delete
mutation{
deleteUser(id: $id)
}
데이터 효율성
- Rest API를 사용하는 경우 동일한 URL을 사용하면 항상 동일한 정보를 받게 됩니다.
그러나 이 경우 모든 데이터가 필요한 것은 아니며 이 경우 오버페치가 발생합니다. - GraphQL을 사용하면 설정된 쿼리에 따라 정보를 받습니다.
아이디, 이름, 이메일을 요청하지 않고 이름만 요청하면 서버는 응답에 이름만 반환합니다.
따라서 오버페칭을 방지할 수 있습니다.
캐싱
- Rest API는 (GET) 사용 시 캐싱할 수 있습니다.
- GraphQL을 캐싱하기 위해서는 클라이언트나 서버 개발자가 캐싱을 별도로 처리해야 합니다.
앞으로 GraphQL에 대해 좀 더 정리하도록 노력하겠습니다.