안녕하세요! graphql을 공부한 지 한달 정도 된 뉴비입니다. 페이지네이션을 구현하는 ...
# 질문
j
안녕하세요! graphql을 공부한 지 한달 정도 된 뉴비입니다. 페이지네이션을 구현하는 방식 중 하나인 connection 관련해서 질문이 있습니다. root field에 connection을 사용해도 괜찮은걸까요? connection은 ‘그래프 구조에서 _특정 노드_가 다른 노드들과 어떤 관계로 연결되어 있는가’를 의미하는건데 root field에서는 _기준이 될 노드_를 생각할 수 없으니 이 의미를 전혀 담지 못하는 것 같습니다. cursor-based pagination을 구현하는 방식이라는 측면에서 시맨틱한 의미는 신경 쓰지 말고 그냥 connection 방식을 사용해도 될까요?
🤔 1
h
생각하시는 스키마나 쿼리를 적어주시겠어요?
j
예를 들어서 가입된 사용자의 리스트를 얻고 싶다면 다음 쿼리를 쓸 수 있을 텐데 root field에서 connection, edge라는 네이밍이 어색하게 느껴집니다.
Copy code
query {
  usersConnection {
    edges {
      node {
        id
      }
      cursor
    }
    pageInfo {
      startCursor
      endCursor
    }
  }
}
root field에서는 차라리 이런 네이밍이 더 자연스럽게 느껴집니다.
Copy code
query {
  usersWithCursor {
    users {
      id
    }
    cursor
  }
}
오 예시 쿼리를 써보니 생각났는데요, 그래도 root field에서만 connection을 안 쓰는 건 안 좋은 것 같습니다. 그래서 질문을 다른 식으로 하자면 “root field에서 connection의 네이밍을 어떻게 하면 좋을까요?“가 되는 것 같습니다.
t
엇 처음 고민해보는 내용이네요 ㅋㅋ 저는
Copy code
query {
  users(first: 5) {
    edges {
      node {
        id
      }
    }
    pageInfo {
      startCursor
      endCursor
    }
  }
}
이렇게 쓰는거 같아요 ㅎㅎ
cursor-based pagination을 구현하는 방식이라는 측면에서 시맨틱한 의미는 신경 쓰지 말고 그냥 connection 방식을 사용해도 될까요?
어차피 relay 쓰려면
@connection
directive를 쓰긴해서 ㅎㅎ 이름을 바꾸거나 해서 시맨틱한 의미를 바꾼달지 하기는 힘들거같네요. 혹시 클라이언트는 뭐 쓰세요??
j
relay 써보려고 하고 있어요. 그러면 root field 말고 하위에 있는 필드에서도 Connection이라는 postfix를 안 붙이시나요? 이런 식으로요
Copy code
query {
  user {
    friendsConnection {
      friendsEdges {
        node {
          id
        }
      }
      pageInfo {
        startCursor
      }
    }
  }
}
apollo blog에서
${origin}${relationship}Connection
이라는 네이밍 컨밴션을 소개시켜주었는데 의미를 이해하게 되어서 저는 이렇게 쓰려고 했었거든요
t
오오 맞아요 그게 좋긴하죠 ㅎㅎ 저는 connection 네이밍은 크게 의견 없습니다 ㅋㅋ
GitHub API 많이 참고하는듯해요
j
github api 참고해보니까 예시 들어주셨던 것처럼 필드 이름은 `users`와 같이 복수형을 쓰고 type 이름을 `UserConnection`이런 식으로 쓰는 것 같아요 users라는 이름의 필드가 리스트가 아닌 게 조금 마음에 걸려서 다음처럼 스키마와 쿼리를 짜보려고 합니다.
Copy code
type Query {
  userConnection: UserConnection
  user: User
}

type UserConnection {
  userEdges: [UserEdge]
  pageInfo: PageInfo
}

type UserEdge {
  node: User
  cursor: String
}

interface Node {
  id: ID!
}

type User implements Node {
  id: ID!
  friendConnection: UserFriendConnection
}

type UserFriendConnection {
  friendEdges: [UserFriendEdge]
  pageInfo: PageInfo
}

type UserFriendEdge {
  node: User
  cursor: String
}
Copy code
query {
  userConnection {
    userEdges {
      node {
        id
      }
      cursor
    }
    pageInfo {
      startCursor
      endCursor
    }
  }
}
Copy code
query {
  user {
    id
    friendConnection {
      friendEdges {
        node {
          id
        }
        cursor
      }
      pageInfo {
        startCursor
        endCursor
      }
    }
  }
}
root field에 connection postfix가 어색했었는데 애플리케이션이 user라는 관계로 데이터를 가지고 있다고 생각하려구요. 그래프 구조로 생각한다면 아래 그림처럼 가상의 z축을 가정하는 약간의 정신승리를 해봤습니다.😅
👍 1
t
userEdges
이렇게 해도 relay에서
usePaginationFragment
잘 돌아가는지 궁금하네요 ㅋㅋ 저는 항상
edges
필드를 썼었어요.
h
커넥션은 user 라는 데이터보단 User 라는 타입과 연관이 있습니다.
(User)-[friends]->(User)
그래서 보통 복수형이 나오고, 백링크를 많이 쓰는거같아요
j
userEdges
 이렇게 해도 relay에서 
usePaginationFragment
 잘 돌아가는지 궁금하네요 ㅋㅋ 저는 항상 
edges
 필드를 썼었어요.
요부분은 제가 아직 경험이 부족해서 전혀 생각을 못했습니다. 혹시 안된다면 잘 돌아가는 데에 맞추긴 해야겠네요 apollo 블로그에서는 말씀주신 대로 복수형을 써서 설명해주더라구요. 근데 github api는 단수형을 써서 저도 그거를 따라해봤어요ㅎㅎ
t
그나저나 이런 질문 너무 좋네요 ㅋㅋㅋ 덕분에 커뮤니티가 풍성해진거같아요~ 감사합니다
🥰 1