Status | Authors | Coach | DRIs | Owning Stage | Created |
---|---|---|---|---|---|
proposed | - |
이 문서는 진행 중인 작업이며 Cells 디자인의 매우 초기 상태를 나타냅니다. 중요한 측면들이 문서화되지 않았지만, 향후 추가할 예정입니다. 이것은 Cells의 하나의 가능한 아키텍처이며, 이 접근 방식을 구현하기 전에 대안과 대조할 것을 의도합니다. 만약 이 접근 방식을 선택하지 않기로 결정하더라도, 이 문서는 유지될 것이며, 선택하지 않은 이유를 문서화할 수 있도록 유지할 것입니다.
Cells: GraphQL
GitLab은 효율적인 데이터 쿼리 작업을 수행하기 위해 GraphQL을 광범위하게 사용합니다. 그러나 GraphQL은 직접 라우팅될 수 없는 특성을 가지고 있습니다. GitLab이 사용하는 방식은 /api/graphql
엔드포인트를 호출하며, 요청 본문의 쿼리 또는 뮤테이션만이 데이터에 액세스할 수 있는 위치를 정의할 수 있습니다.
1. 정의
2. 데이터 흐름
3. 제안
Cells 아키텍처에서 GraphQL을 구현하는 데는 적어도 두 가지 주요 방법이 있습니다.
3.1. 엔드포인트별로 라우팅 가능한 GraphQL
/api/graphql
을 /api/organization/<organization>/graphql
로 변경합니다.
- 이로 인해 API URI가 변경되어 기존의
/api/graphql
엔드포인트 사용이 불가능해집니다.
3.2. 본문별로 라우팅 가능한 GraphQL
라우터의 일부로 GraphQL 본문을 구문 분석하여 project
와 같은 라우팅 가능한 엔티티를 찾습니다.
- 이로 인해 여전히 GraphQL 쿼리가 특정 셀의 컨텍스트에서만 실행되도록 하고 데이터 Merge이 불가능하게 합니다.
# 좋은 예
{
project(fullPath:"gitlab-org/gitlab") {
id
description
}
}
# Merge Request는 라우팅 가능하지 않기 때문에 나쁜 예
{
mergeRequest(id: 1111) {
iid
description
}
}
3.3. GraphQL 프록시 Merge
라우터의 일부로 본문을 구문 분석하고 많은 셀 간에서 결과를 Merge할 수 있는 GraphQL 프록시를 구현합니다.
- 이로 인해 페이지네이션을 실현하기 어려워질 수 있으며, 결과가 모든 셀을 통해 Merge되는 많은 쿼리를 실행한다고 가정할 수 있습니다.
{
project(fullPath:"gitlab-org/gitlab"){
id, description
}
group(fullPath:"gitlab-com") {
id, description
}
}