GraphQL 이란?(1)

이재홍·2022년 12월 30일
0
post-thumbnail

GraphQL 이란? - (1)

페이스북에서 만든 API 를 위한 쿼리 언어 라고 할 수 있다.
그렇다면, 같은 쿼리 언어인 SQL (Structed Query Language) 비교해볼 수 있는데 둘은 목적에서부터 다르다.

GraphQL웹 클라이언트가 데이터를 서버로부터 효율적으로 가져오는 것이 목적인 쿼리 언어이고,
SQL데이터베이스 시스템에 저장된 데이터를 효율적으로 가져오는 것이 목적인 쿼리 언어라는 차이점이 있다.

sql의 문장(statement)은 주로 백앤드 시스템에서 작성하고 호출 하는 반면,
gql의 문장은 주로 클라이언트 시스템에서 작성하고 호출 한다.

GraphQL의 구조

SQL 예시

SELECT plot_id, species_id, sex, weight, ROUND(weight / 1000.0, 2) FROM surveys;

GQL 예시

{
  hero {
    name
    friends {
      name
    }
  }
}

쿼리/뮤테이션(query/mutation)


GraphQL 쿼리문(좌측)과 응답 데이터 형식(우측)

쿼리와 뮤테이션 그리고 응답 내용의 구조는 상당히 직관적이고, 요청하는 쿼리문의 구조와 응답 내용의 구조는 거의 일치한다.

gql에서는 굳이 쿼리(query)뮤테이션(mutation)을 나누는데 내부적으로 들어가면 사실상 이 둘은 별 차이가 없어보인다.
쿼리는 데이터를 읽는데(R) 사용하고, 뮤테이션은 데이터를 변조(CUD) 하는데 사용한다는 개념 적인 규약을 정해 놓은 것 뿐임 (CRUD)

오퍼레이션 네임 쿼리

{
  human(id: "1000") {
    name
    height
  }
}

query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

일반적인 경우 클라이언트에서 정적인 쿼리문을 작성하지는 않을 것이다.
주로 정보를 불러올때 id 값이나, 다른 인자 값을 가지고 데이터를 불러 오게 될것이다,

gql에는 쿼리에 변수라는 개념이 있는데, 이 개념은 이러한 용처를 위해 존재 하는것
gql을 구현한 클라이언트에서는 이 변수에 프로그래밍으로 값을 할당 할 수 있는 함수 인터페이스가 존재

react apollo client의 경우에는 variables 라는 파라메터에 원하는 값을 넣어주면 된다!

오퍼레이션 함수의 편리성

query getStudentInfomation($studentId: ID){
  personalInfo(studentId: $studentId) {
    name
    address1
    address2
    major
  }
  classInfo(year: 2018, studentId: $studentId) {
    classCode
    className
    teacher {
      name
      major
    }
    classRoom {
      id
      maintainer {
        name
      }
    }
  }

오퍼레이션 네임 쿼리는 매우 편리, 굳이 비유하자면 쿼리용 함수 이다.
데이터베이스 에서의 프로시져(procedure) 개념과 유사하다고 생각하면 된다고 한다.

차이: 데이터베이스의 프로시져는 DBA 혹은 백앤드프로그래머가 작성하고 관리 하였지만, gql 오퍼레이션 네임 쿼리는 클라이언트 프로그래머가 작성하고 관리 합니다.

이 개념 덕분에 REST API를 호출할때와 다르게, 한번의 인터넷 네트워크 왕복으로 여러분이 원하는 모든 데이터를 가져 올 수 있다.

gql이 제공하는 추가 기능 덕분에 백엔드 프로그래머와 프론트엔드 프로그래머의 협업 방식 에도 영향을 준다.
이전 협업 방식(REST API)에서는 프론트앤드 프로그래머는 백앤드 프로그래머가 작성하여 전달하는 API의 request / response의 형식에 의존하게 되지만, gql을 사용한 방식에 서는 이러한 의존도가 많이 사라진다.

다만 여전히 데이터 schema에 대한 협업 의존성은 존재

오브젝트 타입과 필드

type Character {
name: String!
appearsIn: [Episode!]!
}

오브젝트 타입 : Character
필드 : name, appearsIn
스칼라 타입 : String, ID, Int 등
느낌표(!) : 필수 값을 의미(non-nullable)
대괄호([, ]) : 배열을 의미(array)

REST API 와 비교

REST API는 URL, METHOD등을 조합하기 때문에 다양한 Endpoint가 존재한다.
반면, gql은 단 하나의 Endpoint가 존재하는데, gql API에서는 불러오는 데이터의 종류를 쿼리 조합을 통해서 결정하게 된다.

쿼리 조합을 통해서 결정이게 무슨 뜻이냐?
REST API에서는 각 Endpoint마다 데이터베이스 SQL 쿼리가 달라지는 반면, gql API는 gql 스키마의 타입마다 데이터베이스 SQL 쿼리가 달라진다.


HTTP와 gql의 기술 스택 비교


REST API와 GraphQL API의 사용

위 그림처럼, gql API를 사용하면 여러번 네트워크 호출을 할 필요 없이, 한번의 네트워크 호출로 처리 할 수 있다.


정리

그래프 큐엘은 페이스북에서 만든 새로운 쿼리 언어다.
데이터 주고 받기가 가능하며
그래프+쿼리 언어라고 보면된다.
즉, API에 접목 시킬 수 있는 쿼리 언어이다.


그래프큐엘 docs
GraphQL이 무엇인가?
그래프큐엘 개념

0개의 댓글