본문 바로가기
Apollo GraphQL Prisma

GraphQL

by 정정훈의 아날로그 2021. 6. 18.

GraphQL 이란?

  • SQL 과 마찬가지로 쿼리 언어이다.

 

GraphQL 의 구조 - 뮤테이션 (Mutation) 과 쿼리 (Query)

  • 뮤테이션 (Mutation) : 데이터를 변조할때 사용한다.
  • 쿼리 (Query) : 데이터를 읽을때 사용한다.
  • 일반 쿼리와 오퍼레이션 네임 쿼리가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  human(id: "1000") {
    name
    height
  }
}
 
query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}
cs
  • 오퍼레이션 네임 쿼리를 사용하면 변수에 인자값을 넘겨서 사용할수 있다. 쿼리용 함수라고 생각하면 편하다.

 

GraphQL 의 구조 - 스키마/타입 (schema/type)

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

 

GraphQL 의 구조 - 리졸버 (resolver)

  • 리졸버는 함수이다.
  • gql 은 데이터를 가져오는 구체적인 과정을 직접 구현해야 한다. 그 구체적인 과정을 리졸버가 담당한다.
  • gql 쿼리에서 필드가 스칼라 타입이 아닌 우리가 정의한 타입이라면, 그 필드는 함수를 반환한다.
  • gql 에서 우리가 정의한 타입 (컴퓨티드 필드) 는 리졸버를 가지고 있다.
1
2
3
4
5
6
7
8
9
10
11
12
  Query: {
    paymentsByUser: async (parent, { userId }, context, info) => {
        const limit = await Limit.findOne({ where: { UserId: userId } })
        const payments = await Payment.findAll({ where: { LimitId: limit.id } })
        return payments        
    },  
  },
  Payment: {
    limit: async (payment, args, context, info) => {
      return await Limit.findOne({ where: { id: payment.LimitId } })
    }
  }
cs
  • 첫번째 인자는 parent로 연쇄적 리졸버 호출에서 부모 리졸버가 리턴한 객체입니다. 이 객체를 활용해서 현재 리졸버가 내보낼 값을 조절 할 수 있습니다.
  • 두번째 인자는 args로 쿼리에서 입력으로 넣은 인자이다.
  • 세번째 인자는 context로 모든 리졸버에게 전달이 됩니다. 주로 미들웨어를 통해 입력된 값들이 들어 있습니다. 로그인 정보 혹은 권한과 같이 주요 컨텍스트 관련 정보를 가지고 있습니다.
  • 네번째 인자는 info로 스키마 정보와 더불어 현재 쿼리의 특정 필드 정보를 가지고 있습니다. 잘 사용하지 않는 필드입니다.

 

- 참고

https://tech.kakao.com/2019/08/01/graphql-basic/

 

GraphQL 개념잡기

GraphQL은 페이스북에서 만든 쿼리 언어입니다. GrpahQL은 요즘 개발자들 사이에서 자주 입에 오르내리고 있으나, 2019년 7월 기준으로 얼리스테이지(early-stage)임은 분명합니다. 국내에서 GraphQL API를 O

tech.kakao.com