GraphQL과 REST 차이와 GraphQL 정의 방식 정리
2024-09-28

이번에 과제를 하면서 GraphQL을 처음 써보았는데, 사용하기 전 노션에 궁금한 점을 정리했던 것을 정리해서 블로그로 옮깁니다.


  • api를 위한 쿼리 언어이자 쿼리를 수행하기 위한 런타임
  • REST API 방식에서 일반적으로 발견되는 많은 문제를 해결

GraphQL vs REST

  • GET 요청 방식에 차이

    HTTP GET 을 통해 가져올 수 있고, JSON 반환할 수 있는 것은 동일하지만 호출하는 방식에 차이가 있음

    • REST - id로 요청 GET /books/1
    • GraphQL - 객체로 요청 GET /graphql?query={ book(id: "1") { title, author { firstName } } } - Graphql 스키마

    REST에서 리소스의 모양과 크기는 서버에 의해 결정되지만 GraphQL에서 서버는 사용 가능한 리소서를 선언하기만 하고 클라이언트는 필요한 것을 그 때 그 때 요청한다.

  • POST 요청 같은건 Mutation 을 사용함

  • REST에서 각 요청은 하나의 경로 핸들러 함수를 호출하지만 GraphQL에서 하나의 쿼리는 여러 개의 리졸버를 호출하여 여러 리소스가 있는 중첩된 응답을 구성할 수 있음

  • REST 에서는 응답의 모양을 직접 구성하지만 GraphQL에서는 응답의 모양이 GraphQL 실행 라이브러리에 의해 쿼리의 모양과 일치하도록 구축됨

GraphQL 정의 방식

code first

코드를 통해 GraphQL 스키마를 정의하고, 이를 기반으로 GraphQL 타입과 리졸버를 작성하는 방식

개발자가 코드로 타입과 리졸버를 정의하면, 이를 바탕으로 GraphQL 스키마가 자동 생성됨

@ObjectType()
class User {
  @Field(() => ID)
  id: string;

  @Field()
  name: string;
}

@Resolver(() => User)
class UserResolver {
  @Query(() => User, { nullable: true })
  getUser(@Arg('id') id: string): User {
    // 리졸버 로직
  }
}

TypeScript 데코레이터를 통해 타입을 정의하고, 리졸버와 스키마를 동시에 정의하는 것이 일반적임

  • 장점
    • 스키마와 코드가 밀접하게 결합되어 있어 타입 안전성이 높고 코드와 스키마의 동기화가 잘 유지
    • 코드 내에서 타입 정의와 리졸버를 통합하여 작성하므로, 자동완성, 타입 검증이 용이
  • 단점
    • GraphQL 지식이 없는 개발자나 비개발자가 이해하기 어려울 수 있으며, 문서화가 부족할 수 있음
    • GraphQL SDL과 익숙하지 않은 방식이기 때문에, GraphQL 경험이 풍부한 개발자에게는 다소 낯설 수 있음

schema first

스키마 정의 언어(SDL, Schema Definition Language)를 사용하여 GraphQL 스키마를 먼저 정의한 후, 이를 기반으로 리졸버 및 기타 비지니스 로직을 구현하는 방식

서로 다른 플랫폼 간에 스키마 파일을 공유할 수 있는, 언어에 구애받지 않는 방법

Nest는 GraphQL 스키마를 기반으로 클래스 또는 인터페이스를 사용하여 TypeScript 정의를 자동으로 생성하여 중복 보일러플레이트 코드를 작성할 필요성을 줄여준다.

type Query {
  getUser(id: ID!): User
}

type User {
  id: ID!
  name: String!
}
  • 장점
    • 명확한 문서 제공: GraphQL 스키마가 개발 초기부터 명확하게 정의되어 문서처럼 작용함
    • 표준화된 스키마 정의 언어: SDL은 GraphQL 표준의 일부로, GraphQL에 익숙한 사람들에게는 직관적임
  • 단점
    • 스키마와 코드가 분리되기 때문에, 스키마와 리졸버가 분리되어 유지보수 시 상호 동기화가 필요할 수 있음
    • 추가적인 설정 및 코드 생성이 필요할 수 있어 초기 설정이 복잡할 수 있음

출처