현인
GraphQL 학습 - 1장 GraphQL 소개 본문
GraphQL을 사용하게 되어 공식문서를 통해 먼저 학습해보려고 한다.
GraphQL은 API를 위한 쿼리 언어이며, 사용자가 데이터에 대해 정의한 타입 시스템을 사용하여 쿼리를 실행하는 서버 측 런타임이다. GraphQL 명세는 2015년에 오픈소스로 공개되었으며, 이후 다양한 프로그래밍 언어로 구현되었다. GraphQL은 특정 데이터베이스나 스토리지 엔진에 종속되지 않으며, 사용자의 기존 코드와 데이터를 기반으로 동작한다.
타입 시스템으로 API를 설명한다
GraphQL 서비스는 타입과 필드를 정의한 다음 각 필드에 필요한 데이터를 제공하는 함수를 작성하여 생성된다. 예를 들어, 로그인한 사용자의 이름을 알려주는 GraphQL 서비스는 다음과 같다.
type Query {
me: User
}
type User {
name: String
}
// Provide data for the `me` field on the `Query` type
function Query_me(query, args, context, info) {
return context.request.auth.user
}
// Provide data for the `name` field on the `User` type
function User_name(user, args, context, info) {
return context.db.getUserFullName(user.id)
}
원하는 것을 정확히 질의한다
GraphQL 서비스가 실행되면 클라이언트로부터 GraphQL 쿼리를 수신하여 검증하고 실행할 수 있다. 서비스는 먼저 쿼리를 확인하여 API에 정의된 타입과 필드만 참조하는지 확인한 다음 제공된 함수를 실행하여 결과를 생성한다.
예를 들어 아래 쿼리에서
{
me {
name
}
}
다음과 같은 결과가 생성될 수 있다.
{
"data": {
"me": {
"name": "Luke Skywalker"
}
}
}
간단한 쿼리만으로도 GraphQL을 강력하게 만드는 핵심 기능 중 일부를 볼 수 있다. 클라이언트는 필요한 데이터 구조를 미러링하는 API에 쿼리를 만들고 단일 요청으로 예상한 형태로 해당 데이터만 수신할 수 있으며, 어떤 기본 데이터 소스가 제공했는지 걱정할 필요 없다.
버전 관리 없이 API를 업데이트
클라이언트 요구 사항은 시간이 지남에 따라 변경되고 GraphQL은 API가 이러한 요구 사항에 대응하여 진화할 수 있도록 하며 다양한 API 버전을 관리하는 오버헤드가 없다. 예를 들어, 새로운 기능에서 더 구체적인 이름 값을 사용할 수 있도록 요구하는 경우 다음과 같이 User 타입을 업데이트 할 수 있다.
type User {
fullName: String
nickname: String
name: String @deprecated(reason: "Use `fullName`.")
}
클라이언트 툴링은 개발자가 새로운 필드를 사용하고 더 이상 사용되지 않는 필드 사용을 제거하도록 장려한다. name 필드는 더 이상 사용되지 않는다고 판단되면 제거할 수 있다. 그동안 GraphQL은 예상대로 데이터를 계속 제공한다.
출처
'기술 학습 > GraphQL' 카테고리의 다른 글
GraphQL 학습 - 6장 스키마 확인(Introspection) (2) | 2024.11.15 |
---|---|
GraphQL 학습 - 5장 실행(Execution) (1) | 2024.11.14 |
GraphQL 학습 - 4장 유효성 검증(Validation) (0) | 2024.11.14 |
GraphQL 학습 - 3장 스키마(Schema) & 타입(Type) (3) | 2024.11.14 |
GraphQL 학습 - 2장 쿼리(Query) & 뮤테이션(Mutation) (1) | 2024.11.14 |