GraphQL - Graphene: 8(Relay: Nodes)

Jihun Kim·2022년 5월 4일
0

GraphQL

목록 보기
16/16
post-thumbnail

Graphene Node에 대해 공부하기에 앞서 GraphQL에서 사용하는 cursor 개념 자체를 먼저 알아보도록 한다.


Cursor

페이지네이션에는 두 가지 개념이 있다.

  • offset/limit 기반
  • cursor 기반
    - graphQL에서는 각 node의 주소를 cursor라 한다.

Apollographql에서 설명하는 offset/limit 페이지네이션의 문제점


[그림1]


[그림2]

Apollographql 제공


  • offset/limit 페이지네이션을 이용하는 상황에서 사용자가 그림1에서와 같이 page2를 보고 있었을 때 그림2에서와 같이 새로운 record 5개가 추가 되었다고 하자.
    - 그러면 이 때 record 11 ~ 15는 page2로 가게 된다.
  • 이제 page2에 있던 사용자가 다시 page1로 돌아갈 경우 사용자는 record 11 ~ 15는 볼 수 없게 될 것이다.

페이스북과 같이 사용자가 특정 정보를 보았는지/ 아닌지가 중요한 서비스의 경우 위와 같은 상황은 달가운 상황이 아닐 것이다. 이러한 상황을 피하기 위해 페이스북에서 만든 것이 connection/edge/node 개념을 이용한 cursor 기반의 페이지네이션이다.


Connection


Apollographql 제공에서 가져왔다.

  • graph는 node(User, Post)와 edge(Author, Friend)로 이루어져 있으며 edge는 connection이라는 추상 개념으로 확장될 수 있다.
    - 각 node의 주소를 cursor라 한다.
  • Connection은 cursor를 기반으로 한 페이지네이션 디자인 패턴을 말한다.
    - 이 때 페이지는 edge로 연결된 node들의 집합이다.
  • 각 node가 연결된 특징 때문에 이전 혹은 다음 페이지가 존재하는 지의 여부를 쉽게 파악할 수 있다.
  • cursor 기반의 페이지네이션은 node의 주소를 통해 node끼리 edge로 서로 연결되어 있기 때문에 새로운 게시물이 추가 되어도 위의 offset/limit처럼 현재 페이지에 영향을 주지 않는다.


Graphene

Nodes

  • Nodegraphene.relay가 제공하는 interface로, 해당 interface는id 필드만을 포함하고 있다.
  • relay.Node를 interface로 갖는 object는 id를 이용해 Node를 알아내기 위해 get_node 메소드를 가져야 한다.
class Ship(graphene.ObjectType):
    '''A ship in the Star Wars saga'''
    class Meta:
        interfaces = (relay.Node, )

    name = graphene.String(description='The name of the ship.')

    @classmethod
    def get_node(cls, info, id):
        return get_ship(id)
  • 쿼리 했을 때 Ship 타입이 반환하는 id는 스칼라이다.
    - 예를 들어, Ship(id=1) 인스턴스는 Ship:1에 대한 base64 인코딩 값에 해당하는 "U2hpcDox"를 반환할 것이며 이는 node를 id로 쿼리 했을 때 유용하게 사용될 수 있다.
profile
쿄쿄

0개의 댓글