🔷 GraphQL6. Federation01. 모놀리식 그래프 문제 — Conway's law @ 그래프

01. 모놀리식 그래프 문제 — Conway’s law @ 그래프

회사가 5명일 때 schema.graphql축복이다 — 모든 타입이 한 곳에 있고 IDE에서 점프할 수 있다. 회사가 500명일 때 같은 schema.graphql저주다 — 한 PR이 머지되려면 10팀의 리뷰가 필요하다.

이 문서는 왜 그렇게 되는지를 Conway’s law의 관점에서 설명한다.


한 줄 답

모놀리식 그래프의 한계는 서버 성능이 아니라 조직의 PR 큐다. 한 파일을 N개 팀이 공유하면 변경의 원자성과 팀의 자율성이 충돌한다. 이 충돌은 코드로는 풀리지 않는다 — 구조가 바뀌어야 한다.


Why — 왜 모놀리식 그래프가 깨지는가

Conway’s law 복습

“Organizations design systems that mirror their communication structure.” — Melvin Conway, 1967

이걸 그래프에 적용하면:

  • 팀이 하나면 — 모놀리식 그래프가 가장 자연스럽다.
  • 팀이 이면 — Order/User/Catalog 같은 기능 경계가 schema 안에 등장한다.
  • 팀이 서른이면 — schema는 모든 팀의 정치적 합의가 된다.

GraphQL 스키마는 프로젝트의 ABI다. ABI를 N팀이 공유하면 변경의 비용이 N에 비례해 기하급수적으로 증가한다.

모놀리식이 깨지는 4가지 실체

1. PR 큐 직렬화 (Deployment coupling)

한 schema 파일을 모두가 수정하면 — 머지 충돌, 리뷰 대기, 배포 게이트가 한 줄로 늘어선다.

A팀: "Order에 새 필드 추가합니다" — PR #1234
B팀: "User에 새 필드 추가합니다" — PR #1235 (충돌!)
C팀: "Catalog에 필드 삭제" — PR #1236 (B팀 영향?)

팀 간 독립 배포가 불가능. 한 팀의 배포가 다른 팀의 머지를 막는다.

2. 소유권 모호성 (Ownership ambiguity)

type User {
  id: ID!
  name: String          # User팀이 소유
  orders: [Order!]!     # Order팀이 소유?? User팀이 소유??
  reviews: [Review!]!   # Review팀이 소유??
}

User 타입은 누구 것인가? 모놀리식에선 답이 없다. 그래서 전사 위원회가 의사결정 권한을 갖게 되고, 위원회는 느리다.

3. 빌드 결합 (Build coupling)

한 팀의 변경이 컴파일 에러를 내면 전체 모노레포 빌드가 깨진다. CI 시간은 조직 크기에 비례해 늘어난다 — 어떤 회사는 30분 빌드를 본다.

4. 도메인 누수 (Domain leakage)

type Order {
  id: ID!
  items: [LineItem!]!
 
  # Order 팀이 알 필요 없는 promotion 로직이 새어들어옴
  appliedPromotions: [Promotion!]!
  loyaltyPoints: Int!
}

다른 팀의 필드를 내 타입에 끼워넣는 일이 일상이 된다 — bounded context가 무너진다.


How — 모놀리식이 견딜 수 있는 규모

Dunbar 임계와 비슷한 패턴

회사 크기모놀리식 그래프?비고
1~5명★★★그냥 monolith 써라. 빠르고 단순.
5~30명★★한 팀 안에서 모듈 분할로 견딘다 (e.g., schema/user.graphql).
30~150명위원회·코드 오너십·디렉토리 분할로 겨우 버틴다.
150명+federation 또는 분리된 그래프가 거의 강제된다.

150명 ≈ Dunbar number. 모든 사람의 변경을 모든 사람이 추적할 수 있는 임계. 그 위로 가면 집단 인지가 깨진다.

모놀리식이 부분적으로 견디는 패턴

  1. Codeowners 분할: 디렉토리별 CODEOWNERS 파일. 하지만 type 간 참조가 있으면 여전히 cross-팀 리뷰가 필요.
  2. Modular schema: schema/order/*.graphql + schema/user/*.graphql파일을 분리. 빌드 타임에 한 파일로 합친다. 하지만 런타임 결합은 여전히 동일.
  3. Backend for Frontend (BFF): 각 클라이언트마다 자기 그래프. 하지만 이건 그래프 자체의 통합을 포기한 셈.

What — 모놀리식 그래프의 4가지 안티패턴 시그널

당신의 회사가 모놀리식 그래프에서 이미 고통받고 있다는 신호다.

시그널증상원인
PR이 1주일 이상 떠 있다머지 대기열 길이 ≥ 5리뷰 권한이 한 팀에 집중
새 필드 추가가 전사 회의가 된다매주 schema 리뷰 미팅의사결정의 위원회화
다른 팀의 변경에 매번 영향받는다CI 깨짐 알림 일평균 ≥ 3빌드 결합
”그 필드 누가 만들었지?” 질문이 일상git blame이 5명을 가리킴소유권 분산

이 중 둘 이상이라면 — Federation을 진지하게 고려할 때다.


What-if — 모놀리식을 고집하면 일어나는 일

Case 1: GitHub의 결정 (2016~)

GitHub은 모놀리식 GraphQL을 공개 API v4로 채택했다. 그들은 외부 클라이언트에는 monolith가 맞다고 판단했다 — 외부인이 내부 팀 경계를 알 필요가 없으니까. 대신 내부 팀의 PR 큐는 GraphQL 인프라 팀이 정책으로 관리한다.

→ 모놀리식이 외부 일관성을 위해선 옳을 때가 있다는 사례.

Case 2: Netflix Studio Edge (2019~)

Netflix는 수십 개 백엔드 서비스Studio 직원 200명에게 노출해야 했다. 처음엔 BFF 한 개를 만들었는데 — BFF 자체가 병목이 됐다. BFF 팀이 모든 변경을 처리해야 했으니까.

→ 그래서 federation으로 전환. 각 백엔드 팀이 자기 subgraph를 직접 소유하게 했다.

Case 3: Airbnb의 반대 결정 (2020s)

Airbnb는 한때 federation을 검토했지만 내부 분석 결과 monolith가 더 빠르다고 결론냈다 — 그들의 조직은 기능별로 강하게 분리되지 않았고, 한 PR이 여러 서비스를 건드리는 경우가 많아서 federation의 팀 독립성 가정이 깨졌다.

→ federation은 조직이 이미 잘 분리됐을 때만 효과를 본다.


Insight — Conway’s law의 역방향

“Reverse Conway Maneuver” — 시스템을 원하는 조직에 맞춰 먼저 설계하면, 조직이 그 모양으로 따라온다. (Forsgren, Accelerate, 2018)

Federation을 도입하면 — 그래프가 팀 경계를 요구한다. 명확한 owner가 없으면 subgraph를 만들 수 없다. 그래서 federation 도입이 조직 정리의 강제력이 되기도 한다.

흥미로운 사실: Apollo가 2019년 federation v1을 발표하면서 가장 강조한 문구는 *“team autonomy”*였다 — 기술 문서인데 조직 용어가 헤드라인이었다.

“왜 facebook 본진은 federation을 안 쓰나?”

Meta는 monolith를 쓴다 (Relay + 거대한 단일 graph). 이유: 그들의 monorepo 문화는 전사 빌드/배포가 같이 가는 것을 전제로 한다. 즉, 조직 자체가 monolith처럼 굴러간다. Conway’s law의 재귀다.


요약 + Mermaid

모놀리식 그래프는 서버가 아니라 조직에서 깨진다. Dunbar 150명 · PR 큐 직렬화 · 소유권 모호성 · 빌드 결합 — 네 가지 증상이 모두 나타나면 federation이 필요하다. 하지만 조직이 강하게 분리되지 않았다면 federation이 오히려 짐이 된다.