graphql

8 개의 포스트

Cloudflare 위협 인텔리전 (새 탭에서 열림)

Cloudflare는 복잡한 ETL(추출, 변환, 적재) 파이프라인을 제거하고 SQLite 기반의 샤딩된 아키텍처를 활용하여 차세대 위협 인텔리전스 플랫폼(TIP)을 구축했습니다. 이 플랫폼은 전 세계 네트워크 엣지에서 GraphQL을 직접 실행함으로써 수백만 건의 위협 이벤트를 1초 미만의 지연 시간으로 쿼리하고 시각화할 수 있는 성능을 제공합니다. 이를 통해 보안 팀은 단순히 위협을 관찰하는 수준을 넘어, 위협 행위자와 멀웨어를 실시간으로 연결하고 Cloudflare 네트워크 전체에서 공격을 선제적으로 차단할 수 있는 통합된 방어 체계를 갖추게 되었습니다. ### 위협 인텔리전스 플랫폼의 필요성과 진화 Cloudforce One 팀이 공격자 인프라를 추적하기 위해 내부용으로 개발했던 도구가 이제 모든 사용자를 위한 클라우드 네이티브 위협 인텔리전스 플랫폼으로 발전했습니다. 단순히 데이터를 나열하는 것이 아니라 위협의 전체 생명주기를 매핑하여 공격자와 멀웨어, 케이스, 지표를 하나로 연결합니다. * **데이터의 유용성 확보:** 방대한 텔레메트리 데이터 속에서 실행 가능한 통찰력을 추출하여 보안 운영 센터(SOC)의 의사결정을 지원합니다. * **엣지 기반의 혁신:** Cloudflare Workers 환경을 활용하여 실시간으로 위협 이벤트를 그래프와 다이어그램으로 합성하며, 데이터 수집과 가용성 사이의 지연 시간을 완전히 제거했습니다. ### SIEM의 한계 극복과 지능형 강화 실시간 로그 집계와 알람에 최적화된 기존 SIEM과 달리, TIP는 공격자 패턴을 추적하기 위한 전용 스키마와 장기 보관 기능을 제공하여 보안 생태계를 보완합니다. * **상황 맥락 제공:** 단순한 IP나 해시 값을 넘어 해당 지표의 역사, 관련 위협 행위자, 캠페인 내 역할 및 위험 점수를 즉각적으로 제공하여 분석가의 수동 조사 시간을 단축합니다. * **선순환 피드백 루프:** 분석가가 발견한 새로운 침해 지표(IOC)를 플랫폼에 다시 입력하면 자동화된 방어 기능이 강화되어, 모든 사용자가 실시간으로 업데이트된 인텔리전스의 혜택을 누릴 수 있습니다. ### 병목 현상을 제거한 ETL-less 아키텍처 중앙 집중식 데이터베이스의 성능 한계를 극복하기 위해 SQLite 기반의 Durable Objects를 활용한 분산 샤딩 구조를 채택했습니다. * **고가용성 샤딩:** 위협 이벤트를 수천 개의 논리적 샤드(Durable Objects)로 분산 저장하여 쓰기 병목 현상을 방지하고 고성능 트랜잭션을 보장합니다. * **계층화된 저장소:** 고부하 공격 시 발생하는 데이터 스파이크를 Cloudflare Queues로 처리하며, 장기 데이터는 R2에 저장하고 즉각적인 조회가 필요한 인덱스는 Durable Object 내의 SQLite에 유지합니다. ### 엣지에서의 병렬 쿼리 실행 사용자가 GraphQL 엔드포인트를 통해 검색을 수행하면 플랫폼은 단일 테이블이 아닌 네트워크 전역에 분산된 여러 샤드에 쿼리를 동시에 전송(Fan-out)합니다. * **지연 시간 최소화:** Smart Placement 기술을 통해 쿼리를 처리하는 Worker를 데이터가 보관된 Durable Object와 물리적으로 가까운 곳에 배치하여 응답 속도를 극대화했습니다. * **권한 기반 필터링:** 쿼리 실행 전 사용자 권한과 날짜 기반 샤드 필터링을 거쳐 필요한 데이터만 병렬로 취합함으로써 효율적인 데이터 검색을 실현합니다. 보안 운영의 효율성을 높이기 위해서는 데이터의 양보다 그 데이터가 얼마나 빠르게 실행 가능한 정보로 전환되는지가 중요합니다. Cloudflare의 새로운 TIP는 인텔리전스를 별도의 분리된 데이터셋이 아닌 방어 체계의 일부로 통합함으로써, 보안 팀이 사후 대응 방식에서 벗어나 선제적이고 능동적인 방어 태세를 구축할 수 있도록 돕습니다.

나의 에어비앤비 입 (새 탭에서 열림)

안나 술키나(Anna Sulkina)는 20년 이상의 경력을 가진 엔지니어링 리더로, 하드웨어 진단에서 시작해 프론트엔드와 백엔드를 거쳐 현재 에어비앤비의 인프라 및 클라우드 부문을 이끌고 있습니다. 그녀는 트위터 재직 당시 대규모 분산 시스템의 기술적 한계를 극복하고 조직적 합의를 통해 GraphQL 도입을 성공시킨 경험을 바탕으로, 기술적 역량과 리더십의 조화를 강조합니다. 현재 그녀는 에어비앤비에서 개발자 플랫폼의 전략적 방향성을 설정하고 고성과 팀을 구축하여 비즈니스 가치를 극대화하는 데 전념하고 있습니다. ### 기술적 호기심의 시작과 초기 경력의 도전 * 소련 붕괴 시기 우크라이나에서 성장하며, 컴퓨터 하드웨어를 조립하던 오빠의 영향으로 기술에 대한 호기심을 키웠습니다. * 미국 이주 초기에는 프로그래밍 언어보다 영어 소통에 더 큰 어려움을 겪었으나, 버클리 익스텐션 등을 통해 C++과 Java 지식을 확장하며 전문성을 쌓았습니다. * 첫 직장인 하드웨어 진단 분야를 시작으로 기술 스택의 아래 단계로 점진적으로 내려가며 하드웨어, 프론트엔드, 백엔드를 아우르는 폭넓은 시각을 갖게 되었습니다. ### 리더십으로의 전환과 팀 구축의 즐거움 * 개인 기여자(IC)로서의 역량뿐만 아니라 리더십 잠재력을 인정받아 텔레콤 스타트업과 컴캐스트(Comcast)를 거치며 엔지니어링 매니저로 성장했습니다. * 좋은 리더가 있는 팀과 그렇지 않은 팀의 차이를 직접 목격하며 사람을 코칭하고 고성과 팀을 만드는 과정에서 큰 흥미를 느꼈습니다. * 기술 스택의 깊이가 깊어질수록 리더십의 책임 또한 커지는 궤적을 그리며 인프라 부문의 리더로 자리매김했습니다. ### 트위터에서의 분산 시스템 설계와 기술 혁신 * 약 9년 동안 트위터에 재직하며 'Fail Whale' 시기와 엘런 디제너러스의 셀카 사건 등 대규모 트래픽 장애를 해결하는 핵심적인 역할을 수행했습니다. * **실패를 위한 설계:** 모놀리스 구조에서 마이크로서비스 아키텍처로 전환하며, 복잡한 분산 시스템에서는 실패를 피하는 것이 아니라 '실패를 대비한 설계'가 필수적임을 배웠습니다. * **합의를 통한 혁신:** 해커톤에서 시작된 GraphQL 도입을 위해 전사적인 기술적 합의를 이끌어냈으며, 이는 기존 REST 서비스를 대체하고 제품 개발 속도를 획기적으로 높이는 결과로 이어졌습니다. ### 에어비앤비에서의 전략적 정렬과 플랫폼 고도화 * 평소 여행을 좋아하고 에어비앤비 서비스의 팬이었던 점이 이직의 결정적 계기가 되었으며, 개인적 관심사와 기술적 전문성을 일치시켰습니다. * **개발자 플랫폼 개선:** 파편화되어 있던 개발자 플랫폼 조직의 전략을 명확히 하고, 내부 이해관계자들과의 신뢰를 구축하는 데 집중했습니다. * **조직적 정렬:** "우리는 왜 여기에 모였는가?"와 같은 근본적인 질문에 답하며 리더십 코칭과 팀 간 정렬을 통해 비즈니스 가치를 창출하는 고성과 조직을 재정비했습니다. 안나 술키나의 여정은 복잡한 시스템일수록 기술적 완벽주의보다는 실패를 수용하는 유연한 설계가 중요하다는 점을 시사합니다. 또한, 기술적 혁신은 단순히 뛰어난 코드로 완성되는 것이 아니라, 조직 내의 합의를 이끌어내고 구성원들의 목표를 하나로 정렬하는 리더십을 통해 비로소 실현될 수 있음을 보여줍니다.

디스플레이가 없나요 (새 탭에서 열림)

메타는 XR 기기와 같이 화면이 없거나 접근이 어려운 장치에서 QR 코드 없이도 패스키 인증을 수행할 수 있는 새로운 접근 방식을 도입했습니다. 이 방식은 기존 FIDO 얼라이언스의 표준인 CTAP 하이브리드 프로토콜을 기반으로 하며, 모바일 컴패니언 앱을 보안 메시지 전송 통로로 활용하여 기기 간 근접성 및 신뢰 요구 사항을 충족합니다. 이를 통해 디스플레이 제약이 있는 다양한 IoT 및 웨어러블 기기에서도 안전하고 편리한 무암호 인증 생태계를 구축할 수 있는 길을 열었습니다. ### 화면 없는 장치의 인증 한계 * 기존의 기기 간 패스키 인증은 데스크톱이 표시하는 QR 코드를 스마트폰 카메라로 스캔하여 두 기기를 연결하는 방식에 의존합니다. * 하지만 헤드마운트 디스플레이(HMD)를 사용하는 XR 기기나 스마트 홈 허브, 산업용 센서 등은 QR 코드를 표시할 화면이 없거나 외부 기기가 스캔하기 어려운 위치에 있는 경우가 많습니다. * 단순히 블루투스 근접성만 활용할 경우, 사용자가 올바른 기기에서 올바른 트랜잭션을 승인하고 있다는 시각적 확신을 주기 어려워 보안 및 사용성 측면에서 위험이 존재합니다. ### 컴패니언 앱을 통한 보안 메시지 전송 * 메타는 기기와 동일한 계정으로 로그인된 컴패니언 앱(Meta Horizon 앱)을 활용하여 QR 코드 스캔 과정을 대체합니다. * 인증이 시작되면 기기는 QR 코드에 담길 정보를 포함한 FIDO URL을 생성하고, 이를 인증된 푸시 알림 채널을 통해 사용자의 스마트폰으로 직접 전송합니다. * 사용자는 스마트폰에 뜬 알림을 탭하는 것만으로 즉시 OS 수준의 패스키 인터페이스에 진입할 수 있으며, 알림이 꺼진 경우에도 앱 실행 시 백엔드 쿼리를 통해 대기 중인 인증 요청을 확인할 수 있습니다. ### 하이브리드 패스키 인증의 기술적 프로세스 * **페이로드 생성**: 메타 퀘스트 브라우저는 ECDH 공개 키, 세션별 비밀값, 라우팅 정보 등을 포함한 페이로드를 생성하고 이를 표준 하이브리드 전송 메커니즘인 FIDO URL로 인코딩합니다. * **푸시 전달**: 생성된 FIDO URL은 GraphQL 기반의 구조화된 데이터 형태로 앱에 전달되며, 앱은 이를 시스템 URL 런처를 통해 실행하여 모바일 OS의 패스키 흐름을 호출합니다. * **보안 채널 형성**: URL이 실행되면 모바일 기기는 표준 하이브리드 전송 시퀀스에 따라 BLE 광고를 브로드캐스트하고, 대상 기기와 암호화된 터널을 구축합니다. * **서명 및 완료**: 사용자의 생체 인증(UV)이 성공하면 모바일 기기는 관련 키 자료를 사용해 패스키 응답을 생성하고, 이를 보안 채널을 통해 대상 기기로 전달하여 인증 서버와의 거래를 완료합니다. 메타의 이 새로운 구현은 기존 WebAuthn 표준을 준수하면서도 디스플레이의 제약을 극복한 실용적인 사례입니다. 스마트 홈 기기나 산업용 하드웨어를 설계하는 개발자들은 이와 같은 컴패니언 앱 기반의 하이브리드 흐름을 참조하여, 사용자에게 익숙한 모바일 환경을 활용한 안전한 패스키 도입을 고려해볼 수 있습니다.

넷플릭스 그래프 (새 탭에서 열림)

넷플릭스는 기업 내 복잡한 데이터 생태계를 효율적으로 탐색하기 위해 기존의 구조화된 쿼리 언어(DSL) 방식에서 생성형 AI 기반의 자연어 검색으로 진화하고 있습니다. 대규모 언어 모델(LLM)을 활용하여 사용자의 모호한 질문을 정확한 필터 문구로 변환함으로써 기술적 장벽을 낮추고 업무 효율성을 극대화하는 것이 이번 프로젝트의 핵심입니다. 이를 통해 사용자 의도를 정확히 반영하면서도 기존 시스템의 안정성을 유지하는 신뢰 중심의 검색 플랫폼을 구축하고자 합니다. ## 자연어 검색 도입 배경과 비즈니스 요구사항 * **기존 방식의 한계:** 사용자들은 수백 개의 필드가 포함된 복잡한 UI에서 필터를 수동으로 설정하거나 특정 DSL(Domain Specific Language)을 학습해야 하는 번거로움을 겪었습니다. * **사용자 경험 개선:** 기술적인 구조가 아닌 일상적인 언어(예: "90년대 미국 로봇 영화")로 데이터를 즉시 찾을 수 있게 하여 검색 과정의 마찰을 줄이고자 합니다. * **시스템 보완 전략:** 기존 애플리케이션을 완전히 대체하는 것이 아니라, 자연어를 DSL로 변환하는 기능을 추가하여 기존 검색 인프라에 RAG(검색 증강 생성) 기능을 보강하는 방향을 선택했습니다. ## Text-to-Query 변환의 세 가지 핵심 기준 * **구문적 정확성 (Syntactic):** 생성된 문장이 Graph Search Filter DSL의 문법 규칙을 완벽하게 따라야 하며, 파싱이 가능한 형태여야 합니다. * **의미적 정확성 (Semantic):** 인덱스에 실제로 존재하는 필드만 사용해야 하며, 데이터 타입에 맞는 비교 연산자를 사용하고 '통제된 어휘(Controlled Vocabulary)'의 허용 범위를 준수하여 환각(Hallucination) 현상을 방지해야 합니다. * **화용적 정확성 (Pragmatic):** 기술적으로 완벽한 쿼리일지라도, 그것이 사용자가 실제로 질문한 의도와 목적을 정확하게 담아내야 합니다. ## 컨텍스트 엔지니어링을 통한 성능 최적화 * **메타데이터 활용:** GraphQL 스키마에서 추출한 필드 설명, 타입 정보 등을 LLM의 컨텍스트로 제공하여 모델이 데이터 구조를 이해하도록 돕습니다. * **통제된 어휘(Controlled Vocabulary) 관리:** 국가명이나 장르와 같이 정해진 값의 목록이 있는 경우, 이를 메타데이터에 포함하여 LLM이 유효한 값 내에서만 쿼리를 생성하도록 유도합니다. * **확장성 문제 해결:** 수백 개의 필드와 수천 개의 유효값을 가진 대규모 인덱스의 경우, 모든 정보를 프롬프트에 넣으면 지연 시간이 늘어나고 정확도가 떨어지므로 필요한 정보만 선별하여 제공하는 정교한 컨텍스트 구성 전략을 사용합니다. 넷플릭스의 사례는 복잡한 기업용 데이터 검색 시스템에서 LLM을 직접적인 해답 제공자가 아닌, 검증된 기존 DSL을 생성하는 '번역기'로 활용함으로써 데이터의 정확성과 시스템의 신뢰성을 동시에 확보할 수 있음을 보여줍니다. 전문적인 데이터 탐색이 필요한 도메인일수록 이러한 단계적 AI 통합 접근 방식이 효과적입니다.

LLM 및 @generateMock (새 탭에서 열림)

에어비앤비는 LLM과 제품 컨텍스트를 결합한 `@generateMock` 지시어를 도입하여, 수동으로 작성하던 GraphQL 모의 데이터 생성 과정을 자동화하고 혁신했습니다. 이 시스템은 단순한 랜덤 값 생성을 넘어 쿼리 정의, 스키마 주석, 그리고 디자인 목업 이미지까지 컨텍스트로 활용해 실제 서비스 환경과 매우 흡사한 타입 안정적(Type-safe) 데이터를 생성합니다. 이를 통해 개발자는 백엔드 구현을 기다리지 않고도 고품질의 데모와 테스트를 수행할 수 있으며, 쿼리 변경에 따른 모킹 데이터의 관리 부담을 획기적으로 줄였습니다. ### 기존 모킹 방식의 한계와 도전 과제 * **수동 작업의 비효율성:** 수백 줄에 달하는 GraphQL 쿼리에 대응하는 JSON 데이터를 직접 작성하고 수정하는 과정은 매우 번거롭고 실수에 취약합니다. * **병렬 개발의 병목:** 서버 스키마가 확정된 후에도 실제 API가 구현될 때까지 클라이언트 개발자는 UI 테스트를 진행하기 어려워 임시방편(하드코딩, 로컬 프록시 등)에 의존하게 됩니다. * **데이터의 동기화 문제:** 쿼리나 스키마가 진화함에 따라 수동으로 작성된 모의 데이터는 점차 실제 프로덕션 환경과 괴리가 생기며, 이는 테스트 신뢰도 저하로 이어집니다. ### @generateMock 지시어를 통한 선언적 모킹 * **지시어 기반 워크플로우:** 개발자는 `.graphql` 파일의 연산, 프래그먼트, 또는 특정 필드에 `@generateMock` 지시어를 추가하는 것만으로 모의 데이터를 정의할 수 있습니다. * **주요 파라미터 활용:** * `id`: 여러 버전의 모의 데이터를 생성할 때 식별자로 사용하며, 생성된 헬퍼 함수의 이름에 반영됩니다. * `hints`: "파리, 교토로 가는 여행 일정을 포함해달라"와 같이 LLM에게 구체적인 데이터 생성을 지시하는 자연어 가이드를 제공합니다. * `designURL`: 디자인 도구(Figma 등)의 URL을 입력하면 LLM이 실제 디자인 화면의 텍스트와 레이아웃에 부합하는 데이터를 생성합니다. * **로컬 개발 도구 통합:** 에어비앤비의 코드 생성 도구인 'Niobe'와 결합되어, 코드 생성 시 JSON 데이터와 이를 로딩하는 소스 코드(TypeScript, Swift, Kotlin)가 자동으로 빌드 아티팩트에 포함됩니다. ### LLM을 활용한 컨텍스트 중심의 데이터 생성 * **스키마 최적화 주입:** 전체 스키마를 LLM에 전달하는 대신, 해당 쿼리와 연관된 타입 및 인라인 문서 주석만을 추출하여 컨텍스트 윈도우 내에서 효율적으로 처리합니다. * **디자인 시각 정보 반영:** 내부 API를 통해 `designURL`의 스냅샷 이미지를 생성하고 이를 LLM에 전달함으로써, 실제 UI 디자인에 명시된 이름, 주소 등의 콘텐츠와 일치하는 현실적인 데이터를 얻습니다. * **수동 수정 및 보존:** 생성된 JSON 데이터는 개발자가 직접 수정할 수 있으며, 이후 다시 코드를 생성하더라도 Niobe는 사용자가 직접 수정한 내용을 지우지 않고 보존하는 지능적인 병합 기능을 제공합니다. 이러한 접근 방식은 단순히 더 나은 가짜 데이터를 만드는 것을 넘어, 프론트엔드와 백엔드 간의 의존성을 분리하고 개발 생산성을 극대화하는 데 목적이 있습니다. 대규모 GraphQL 환경을 운영하는 조직이라면 스키마 메타데이터와 LLM을 결합하여 테스트 자동화 수준을 한 단계 높이는 이 모델을 참고할 가치가 있습니다.

스케일링 뮤즈: 넷플릭스가 조단위 데이터에서 데이터 기반 창의적 인사이트를 제공하는 방법 | 넷플릭스 기술 블로그 | 넷플릭스 기술 블로그 (새 탭에서 열림)

넷플릭스의 내부 데이터 분석 플랫폼인 'Muse'는 수조 건 규모의 데이터를 분석하여 홍보용 미디어(아트웍, 영상 클립)의 효과를 측정하고 창작 전략을 지원합니다. 급증하는 데이터 규모와 복잡한 다대다(Many-to-Many) 필터링 요구사항을 해결하기 위해, 넷플릭스는 HyperLogLog(HLL) 스케치와 인메모리 기술인 Hollow를 도입하여 데이터 서빙 레이어를 혁신했습니다. 이를 통해 데이터 정확도를 유지하면서도 수조 행의 데이터를 실시간에 가깝게 처리할 수 있는 고성능 OLAP 환경을 구축했습니다. ### 효율적인 고유 사용자 집계를 위한 HLL 스케치 도입 * **근사치 계산을 통한 성능 최적화:** 고유 사용자 수(Distinct Count)를 계산할 때 발생하는 막대한 리소스 소모를 줄이기 위해 Apache Datasketches의 HLL 기술을 도입했습니다. 약 0.8%~2%의 미세한 오차를 허용하는 대신 집계 속도를 비약적으로 높였습니다. * **단계별 스케치 생성:** Druid 데이터 수집 단계에서 '롤업(Rollup)' 기능을 사용해 데이터를 사전 요약하고, Spark ETL 과정에서는 매일 생성되는 HLL 스케치를 기존 데이터와 병합(hll_union)하여 전체 기간의 통계를 관리합니다. * **데이터 규모 축소:** 수개월에서 수년 치의 데이터를 전수 비교하는 대신, 미리 생성된 스케치만 결합하면 되므로 데이터 처리량과 저장 공간을 획기적으로 절감했습니다. ### Hollow를 활용한 인메모리 사전 집계 및 서빙 * **초저지연 조회 구현:** 모든 쿼리를 Druid에서 처리하는 대신, 자주 사용되는 '전체 기간(All-time)' 집계 데이터는 넷플릭스의 오픈소스 기술인 'Hollow'를 통해 인메모리 방식으로 서빙합니다. * **Spark와 마이크로서비스의 연계:** Spark 작업에서 미리 계산된 HLL 스케치 집계 데이터를 Hollow 데이터셋으로 발행하면, Spring Boot 기반의 마이크로서비스가 이를 메모리에 로드하여 밀리초(ms) 단위의 응답 속도를 제공합니다. * **조인(Join) 병목 해결:** 복잡한 시청자 성향(Audience Affinity) 필터링과 같은 다대다 관계 연산을 메모리 내에서 처리함으로써 기존 아키텍처의 한계를 극복했습니다. ### 데이터 검증 및 아키텍처 현대화 * **신뢰성 보장:** 아키텍처 변경 전후의 데이터 정합성을 확인하기 위해 내부 디버깅 도구를 활용하여 사전/사후 데이터를 정밀하게 비교 검증했습니다. * **기술 스택 고도화:** React 프런트엔드와 GraphQL 레이어, 그리고 gRPC 기반의 Spring Boot 마이크로서비스 구조를 통해 확장성 있는 시스템을 구축했습니다. * **분석 역량 강화:** 이를 통해 단순한 대시보드를 넘어 이상치 감지(Outlier Detection), 미디어 간 성과 비교, 고급 필터링 등 사용자들의 고도화된 분석 요구를 수용할 수 있게 되었습니다. 대규모 OLAP 시스템을 설계할 때 모든 데이터를 실시간으로 전수 계산하기보다는, HLL과 같은 확률적 자료구조와 Hollow 기반의 인메모리 캐싱을 적절히 조합하는 것이 성능 최적화의 핵심입니다. 특히 수조 건 규모의 데이터에서는 완벽한 정확도와 성능 사이의 트레이드오프를 전략적으로 선택하는 것이 시스템의 유연성을 결정짓습니다.

Viaduct, 5년 후: (새 탭에서 열림)

에어비앤비는 자사의 데이터 중심 서비스 메시인 'Viaduct'의 5년간의 운영 성과를 공유하며, 이를 오픈소스로 공개하고 차세대 아키텍처인 'Viaduct Modern'으로의 전환을 발표했습니다. Viaduct는 중앙 집중식 스키마와 서버리스 비즈니스 로직 호스팅, 재진입(Re-entrancy) 구조를 통해 트래픽이 8배 성장하는 과정에서도 운영 효율성과 비용 선형성을 유지해 왔습니다. 이번 개편은 파편화되었던 API를 단순화하고 실행 엔진과 비즈니스 로직 사이의 추상화 경계를 강화하여, 거대해진 코드베이스의 유지보수성과 개발 생산성을 높이는 데 중점을 두었습니다. ### Viaduct의 핵심 설계 원칙 * **중앙 스키마(Central Schema):** 전사의 모든 도메인을 하나의 통합된 그래프로 연결합니다. 개발은 팀별로 분산되어 진행되지만, 사용자는 단일한 접점을 통해 모든 데이터와 기능에 접근할 수 있어 내부 요청의 75%가 Viaduct 내에서 처리됩니다. * **호스팅된 비즈니스 로직(Hosted Business Logic):** GraphQL 서버를 단순한 게이트웨이로 사용하는 대신, 비즈니스 로직을 직접 실행하는 서버리스 플랫폼으로 운영합니다. 이를 통해 개별 마이크로서비스 운영 부담을 줄이고 개발자가 로직에만 집중할 수 있는 환경을 제공합니다. * **재진입성(Re-entrancy):** Viaduct에 호스팅된 로직이 다른 로직을 호출할 때 GraphQL 프래그먼트와 쿼리를 사용하도록 설계되었습니다. 이는 대규모 코드베이스에서 직접적인 코드 의존성을 방지하고 모듈성을 유지하는 핵심 장치입니다. ### Viaduct Modern의 API 단순화 * **Tenant API의 통합:** 과거에는 기능 구현 방식이 복잡하고 파편화되어 있었으나, 이를 '노드 리졸버(Node Resolver)'와 '필드 리졸버(Field Resolver)' 두 가지 메커니즘으로 대폭 통합하여 개발자 경험을 개선했습니다. * **결정 트리 제거:** 구현 방식을 고민해야 했던 복잡한 결정 과정을 없애고, 스키마 자체의 정의에 따라 리졸버 유형이 자연스럽게 결정되도록 설계하여 학습 곡선을 낮췄습니다. ### 테넌트 모듈성과 협업 구조 * **테넌트 모듈(Tenant Module):** 스키마와 구현 코드를 팀별 소유권 단위로 묶어 관리합니다. 팀 간의 직접적인 코드 참조는 지양하고 GraphQL 인터페이스를 통해서만 소통합니다. * **선언적 데이터 의존성:** 예를 들어 '메시징 팀'이 '사용자 팀'의 타입에 새로운 필드를 추가할 때, `@Resolver` 어노테이션에 필요한 데이터 필드(예: 성, 이름)를 선언하기만 하면 됩니다. * **코드 의존성 해소:** 데이터 수요를 선언적으로 명시함으로써, 다른 팀의 내부 로직이나 데이터 소스가 무엇인지 알 필요 없이 독립적으로 기능을 확장할 수 있습니다. ### 프레임워크 계층화 및 유지보수성 * **강력한 추상화 경계:** GraphQL 실행 엔진, 테넌트 API, 애플리케이션 코드 사이의 인터페이스를 명확히 분리했습니다. 과거의 느슨했던 경계를 강화하여 서비스 로직의 중단 없이 엔진 성능을 개선하거나 라이브러리를 업데이트할 수 있는 구조를 갖췄습니다. * **운영 안정성:** 이러한 구조적 개선을 통해 개발자 수와 코드 라인 수가 급격히 증가함에도 불구하고 장애 시간을 절반으로 줄이는 성과를 거두었습니다. Viaduct는 대규모 조직에서 데이터 접근 방식을 통합하고 비즈니스 로직을 효율적으로 관리하려는 팀에게 강력한 모델을 제시합니다. 특히 마이크로서비스의 복잡도를 낮추고 싶은 조직이라면, Viaduct의 재진입 구조와 서버리스 호스팅 개념을 도입하여 개발 민첩성과 시스템 안정성을 동시에 확보하는 방향을 고려해 볼 만합니다.

데이터 지향 서비스 메시를 (새 탭에서 열림)

에어비앤비가 도입한 '바이아덕트(Viaduct)'는 거대해진 마이크로서비스 아키텍처(SOA)의 복잡성을 해결하기 위해 제안된 데이터 지향 서비스 메시입니다. 기존의 서비스 메시가 단순히 서비스 간의 원격 프로시저 호출(RPC)을 라우팅하는 데 집중했다면, 바이아덕트는 GraphQL 스키마를 중심에 두어 데이터 소비자가 하위 서비스의 구조를 몰라도 필요한 데이터를 효율적으로 가져올 수 있게 합니다. 이를 통해 서비스 간 의존성 그래프를 단순화하고 시스템 전반의 모듈성과 데이터 민첩성을 획기적으로 향상시켰습니다. **기존 SOA의 복잡성과 데이터 지향 설계의 필요성** - 마이크로서비스의 수가 수천 개로 늘어나면서 서비스 간 의존 관계가 '스파게티 코드'처럼 얽히는 문제가 발생했습니다. - 현재의 SOA는 1970년대 스타일의 프로시저 지향 설계에 머물러 있어, 각 서비스가 단순한 엔드포인트의 집합으로 취급됩니다. - 에어비앤비는 1980년대 객체 지향 언어들이 데이터를 중심으로 로직을 캡슐화했던 것처럼, SOA도 데이터 중심으로 진화해야 한다고 판단했습니다. **GraphQL 기반의 데이터 지향 서비스 메시, Viaduct** - 바이아덕트는 서비스 메시의 핵심을 데이터 중심의 GraphQL 스키마(Type, Query, Mutation)로 정의합니다. - 데이터 소비자(Consumer)는 특정 서비스의 엔드포인트를 직접 호출하는 대신, 필요한 데이터 필드를 쿼리하기만 하면 됩니다. - 서비스 메시는 어떤 서비스가 특정 데이터 요소를 제공하는지 알고 있으며, 소비자를 대신해 이를 결합(Orchestration)하여 전달함으로써 서비스 간 직접적인 의존성을 제거합니다. **중앙 집중형 스키마를 통한 데이터 민첩성 확보** - 바이아덕트는 단일화된 '중앙 스키마(Central Schema)'를 통해 여러 팀이 협업할 수 있는 구조를 제공합니다. - 데이터베이스 스키마 변경이 여러 계층의 마이크로서비스 API에 수동으로 반영되어야 했던 과거와 달리, 중앙 스키마 업데이트만으로 클라이언트까지 변경 사항을 즉시 전파할 수 있습니다. - 이는 대규모 SOA 환경에서 데이터 구조 변경에 소요되는 수 주간의 조율 과정을 획기적으로 단축합니다. **서버리스 기능을 활용한 서비스 단순화** - 클라이언트 요구에 맞춰 데이터를 가공하는 'BFF(Backend-for-Frontend)'나 상태 없는 변환 서비스들을 서버리스 클라우드 함수로 대체합니다. - 바이아덕트 내에서 '파생 필드(Derived fields)' 계산 로직을 서버리스로 실행함으로써, 복잡한 서비스 계층을 줄이고 그래프 구조를 깔끔하게 유지합니다. - 이를 통해 서비스의 개수와 복잡도를 낮추면서도 클라이언트에게 최적화된 데이터를 제공할 수 있습니다. **기술적 특징 및 관찰 가능성** - 바이아덕트는 `graphql-java`를 기반으로 구축되었으며, 세밀한 필드 선택 기능을 지원합니다. - 시스템 안정성을 위해 서킷 브레이킹(Short-circuiting), 소프트 의존성(Soft dependencies), 요청 내 캐싱(Intra-request cache) 등의 기술을 적용했습니다. - 필드 단위의 데이터 관찰 가능성(Data observability)을 제공하여, 어떤 서비스가 어떤 데이터를 소비하는지 정확하게 파악하고 관리할 수 있습니다. 이처럼 거대해진 마이크로서비스 환경에서 운영 효율을 높이려면, 개별 서비스의 엔드포인트 관리에서 벗어나 데이터 중심의 추상화 계층을 구축하는 것이 중요합니다. 에어비앤비의 사례는 GraphQL을 단순한 API 게이트웨이를 넘어 시스템 전체의 의존성을 관리하는 서비스 메시로 확장함으로써 복잡성을 제어할 수 있음을 보여줍니다.