본문 바로가기
Programming/GraphQL

[GraphQL] 쿼리(Query)

by Muko 2020. 5. 27.

GraphQL에서의 Query

  • SQL 쿼리는 데이터베이스로 보내는 반면, GraphQL 쿼리는 API로 보낸다. 그래서 GraphQL 데이터는 저장 환경을 가리지 않는다.
  • GraphQL에서는 SELECT 대신 Query를 사용해 데이터 요청을 보낸다.
  • INSERT, UPDATE, DELETE를 사용하는 대신 Mutation 이라는 데이터 타입을 가지고 데이터를 조작한다.
  • GraphQL은 인터넷용 쿼리언어이다. 그래서 소켓 연결로 전달되는 데이터 변경 사항을 감지할 수 있는 Subscription 타입이 존재한다.

문법

Query 작업으로 API에 데이터를 요청할 때는 서버에서 받고 싶은 데이터를 써 넣어야 한다. 이 때 요청 데이터는 필드로 적으며, 서버에서 받아오는 JSON 응답 데이터의 필드와 일치한다.

query {
  allLifts {
    name
    status
  }
}

위와 같이 쿼리를 보내면 allLifts 배열과 각각의 리프트에 대한 name과 status가 들어있다.

쿼리 문서에는 쿼리를 여러 개 추가할 수 있다. 하지만 작업은 한 번에 한 쿼리에 대해서만 이루어지기 때문에 여러 데이터를 한 번에 가져오고 싶을 경우에는 같은 쿼리문 안에 작성하면 된다.

query liftsAndTrails {
  liftCount(status: OPEN)
  allLifts {
    name
    status
  }
  allTrails {
    name
    difficulty
  }
}

쿼리를 요청할 때 중요한 것은 필요한 필드만 요청하는 것이다. 그래서 쿼리문을 작성할 때 필요한 필드를 중괄호로 감싸게 되는데, 이 중괄호로 묶인 블록을 셀렉션 세트라고 부른다.

필터링

쿼리 결과에 대한 필터링 작업을 하고 싶다면 쿼리 인자(query arguments)를 넘기면 된다. 쿼리 필드와 관련있는 키-값 쌍을 인자로 넣을 수 있다.

query closedLisfs {
  allLifts(status: CLOSED) {
    name
    status
  }
}

혹은

query jazzCatStatus {
  List(id: "jazz-cat") {
    name
    status
    night
  }
}

타입과 정의들

  • 쿼리어에서 필드는 스칼라타입과 객체 타입 둘 중 하나에 속하게 된다.

    • 스칼라 타입: 정수, 실수, 문자열, 불리언, 고유식별자(ID)
  • 프래그먼트: 셀렉션 세트의 일종. 여러번 재사용 가능하다.

      query {
        Lift(id: "jazz-cat") {
          name
          status
          capacity
          trailAccess {
            name
            difficulty
          }
        }
        Trail(id: "river-run") {
          name
          difficulty
          accessedByLifts {
            name
            status
            capacity
          }
        }
      }

    여기서 중복되는 부분을 fragment로 따로 작성하면 다음과 같다

      fragment liftInfo on Lift {
        name
        status
        capacity
      }
    
      query {
        Lift(id: "jazz-cat") {
          ...liftInfo
          trailAccess {
            name
            difficulty
          }
        }
        Trail(id: "river-run") {
          name
          difficulty
          accessedByLifts {
            ...liftInfo
          }
        }
      }

    프래그먼트 필드를 다른 셀렉션 세트에 추가하려면 spread 연산자와 비슷하게 사용하면 된다.

  • 유니언 타입: 여러 개의 타입을 묶어서 반환하는게 가능하게끔 하는 타입

      query schedule {
        agenda {
          ...on Workout {
            name
            reps
          }
          ...on StudyGroup {
            name
            subject
            students
          }
        }
      }

    위와 같이 query를 작성하면, agenda 배열에 담겨져 반환할 때 각 배열 요소가 Workout 타입일 경우에는 name과 reps이, StudyGroup 타입일 경우에는 name, subject, students 필드가 담겨져 넘어오게 된다. 위와 같이 작성한 부분을 Fragment로 따로 작성해 높으면 아래와 같이 작성 가능하다.

      fragment workout on Workout {
        name
        reps
      }
      fragment study on StudyGroup {
        name
        subject
        students
      }
      query schedule {
        agenda {
          ...workout
          ...study
        }
      }

댓글0