GraphQL 개요

GraphQL은 클라이언트가 원하는 데이터를 정확히 요청할 수 있도록 설계된 쿼리 언어이자 API를 위한 런타임이이었습니다.

기존 REST API 방식과 달리, 필요하지 않은 데이터는 제외하고 필요한 데이터만 요청할 수 있어 네트워크 사용량을 줄이고 응답 속도를 최적화할 수 있습니다.

예를 들어, 전통적인 REST API에서는 게시글과 작성자 정보를 가져오려면 /posts와 /users 같은 여러 개의 엔드포인트를 호출해야 합니다.

하지만 GraphQL에서는 단일 쿼리로 필요한 데이터만 골라서 받아올 수 있습니다.

마치 음식점에서 '오늘의 정식'을 주문하는 것이 아니라, 메뉴판에서 원하는 요리만 골라서 주문하는 느낌과 비슷합니다.

GraphQL 스키마와 타입 시스템

GraphQL의 핵심 개념 중 하나는 스키마(schema) 입니다.

스키마는 API에서 제공하는 데이터의 구조를 정의하고, 데이터를 요청하거나 수정하는 방식을 규정 합니다.

즉, 클라이언트와 서버 간의 계약서 같은 역할을 합니다.

이를 통해 클라이언트는 API의 구조를 한눈에 이해할 수 있고, 서버는 예측 가능한 응답을 제공할 수 있습니다.

GraphQL 스키마의 주요 구성 요소

  1. 타입 정의 : API에서 제공하는 데이터의 형식을 정의합니다
  2. 쿼리 및 뮤테이션 : 데이터를 조회하거나 수정할 때 사용합니다.
  3. 디렉티브 : 특정 필드나 쿼리에 대한 실행 방식을 제어하는 역할을 합니다.

GraphQL 타입 시스템 소개

GraphQL은 강력한 타입 시스템을 제공하여 데이터의 구조를 명확하게 정의합니다.
이를 통해 API의 신뢰성을 높이고, 클라이언트와 서버 간의 일관성을 유지할 수 있습니다.

GraphQL에서 지원하는 주요 타입은 다음과 같다.

1. 스칼라 타입 (Scalar Types)

스칼라 타입은 GraphQL에서 가장 기본적인 타입으로, 단일 값을 나타냅니다.
즉, 더 이상 나눌 수 없는 기본 데이터 유형입니다.

  • String: 문자열 (예: "Hello, GraphQL!")
  • Int: 정수 (예: 42)
  • Float: 실수 (예: 3.14)
  • Boolean: 참 또는 거짓 (예: true, false)
  • ID: 고유한 식별자 (예: "user-123")

2. 객체 타입 (Object Types)

GraphQL에서 데이터를 표현하는 가장 중요한 타입 입니다.
여러 개의 필드를 포함할 수 있으며, 각각의 필드는 특정 타입을 가집니다.

 type User {
   id: ID!
   name: String!
   email: String!
 }

위 예제에서는 User 타입을 정의했으며, id, name, email 세 개의 필드를 가지고 있습니다.
아이디 뒤에있는 !(느낌표)는 해당 필드가 필수 값임을 의미합니다.

3. 인터페이스 타입 (Interface Types)

인터페이스 타입은 여러 개의 객체 타입이 공통으로 가질 수 있는 필드를 정의하는 데 사용됩니다.
이를 통해 코드의 재사용성을 높일 수 있습니다.

interface Character {
  id: ID!
  name: String!
}

type Hero implements Character {
  id: ID!
  name: String!
  power: String!
}

Character 인터페이스를 정의하고, Hero 타입이 이를 구현하도록 설정했습니다.
즉, Hero 타입은 Character가 가진 모든 필드를 반드시 포함해야 됩니다.

4. 유니온 타입 (Union Types)

유니온 타입은 서로 다른 여러 타입 중 하나일 수 있는 데이터를 표현할 때 사용됩니다.

union SearchResult = User | Post

위 예제에서 SearchResult는 User 타입이거나 Post 타입일 수 있습니다.
즉, 특정 검색 결과가 사용자 정보일 수도 있고, 게시글 정보일 수도 있는 상황을 표현할 때 유용합니다.

5. 열거형 타입 (Enum Types)

열거형 타입은 특정 값들만 가질 수 있는 데이터 타입입니다.
예를 들어, 요일을 나타낼 때 사용할 수 있습니다.

enum Day {
  MONDAY
  TUESDAY
  WEDNESDAY
  THURSDAY
  FRIDAY
  SATURDAY
  SUNDAY
}

열거형 타입을 사용하면 특정 값만 허용하도록 강제할 수 있어 데이터의 일관성을 유지하는 데 도움이 됩니다.

6. 입력 객체 타입 (Input Object Types)

쿼리나 뮤테이션에서 매개변수로 전달할 데이터를 구조적으로 정의할 수 있습니다.

input NewUserInput {
  name: String!
  email: String!
  password: String!
}

이렇게 정의된 NewUserInput 타입을 활용하면, 뮤테이션에서 하나의 매개변수로 여러 개의 값을 전달할 수 있습니다.

GraphQL 스키마 확장

GraphQL은 기존의 스키마를 확장할 수 있는 유연한 구조를 제공합니다.
이를 통해 점진적으로 기능을 추가하거나 기존의 타입을 확장할 수 있습니다.

  • 기존 타입에 필드를 추가할 수 있습니다.
  • 기존 타입을 확장하여 새로운 타입을 생성할 수 있습니다.
extend type User {
  age: Int
  address: String
}

위와 같이 extend 키워드를 사용하면 기존 User 타입에 새로운 필드를 추가할 수 있습니다.

마무리

GraphQL은 REST API의 단점을 보완하고, 클라이언트가 원하는 데이터를 효율적으로 요청할 수 있도록 해줍니다.
이를 가능하게 하는 핵심 요소가 바로 스키마와 타입 시스템 이라는것을 이번 학습을 통해 배웠습니다.

GraphQL을 잘 활용하면 API 설계가 더욱 유연해지고, 불필요한 데이터 전송을 줄일 수 있어 성능 최적화에도 도움이 된다는것을 배웠습니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글