
단순함이 복잡함을 이기는 이유
시스템 설계를 하다 보면, 많은 개발자들이 빠지는 함정이 있어요. 바로 '복잡한 시스템이 더 인상적이고 우수하다'는 착각이죠. 하지만 Netflix의 성공 스토리를 보면, 진실은 정반대라는 걸 알 수 있어요.
Netflix는 2024년 기준 전 세계적으로 2억 8천만 명의 구독자를 보유하고 있으며, 390억 달러의 매출을 기록했어요. 이런 엄청난 규모를 다루면서도 Netflix는 단순하고 효율적인 아키텍처를 유지하고 있답니다.
놀랍게도 Netflix에서 시청되는 콘텐츠의 80% 이상이 개인화된 추천 시스템을 통해 발견된다고 해요. 이런 놀라운 성과의 비밀은 뭘까요?
상태 관리: 시스템 설계의 핵심
왜 상태 관리가 이렇게 어려울까요?
소프트웨어 설계에서 가장 까다로운 부분이 바로 상태(state) 관리예요. 정보를 저장하고 있다면 그것은 상태가 있는(stateful) 컴포넌트이고, 그렇지 않다면 무상태(stateless) 컴포넌트죠.
예를 들어, GitHub의 내부 API 중에는 PDF 파일을 받아서 HTML로 렌더링해주는 서비스가 있어요. 이건 완전한 무상태 서비스의 좋은 예시예요. 반면에 데이터베이스에 쓰기 작업을 하는 모든 것은 상태가 있는 컴포넌트라고 할 수 있어요.
실무에서는 어떻게 적용해야 할까요?
핵심은 한 개의 서비스만 상태를 관리하도록 하고, 나머지 서비스들은 무상태로 유지하는 거예요. 5개의 서비스가 모두 같은 테이블에 쓰기 작업을 하는 대신, 4개의 서비스는 첫 번째 서비스에 API 요청을 보내거나 이벤트를 발생시키도록 하는 게 좋아요.
Netflix의 추천 엔진이 이런 중앙화된 상태 관리를 통해 연간 10억 달러 이상을 절약하고 있다고 해요. 사용자들은 매일 총 1,300시간 이상의 검색 시간을 절약하고 있답니다.
Netflix의 데이터베이스 전략
스키마와 인덱스 설계의 비밀
데이터베이스는 상태를 저장하는 가장 중요한 구성 요소예요. Netflix는 NoSQL 데이터베이스인 Cassandra를 사용해서 사용자 데이터와 영화 메타데이터를 처리하고, 결제와 계정 관련 데이터는 MySQL을 사용하고 있어요.
스키마 설계는 유연해야 하지만, 너무 유연하게 만들면(모든 것을 JSON 컬럼에 넣거나 키-값 테이블을 사용하는 것) 애플리케이션 코드가 복잡해져요.
테이블이 몇 개 행 이상 될 것 같다면 인덱스를 만드세요. 가장 자주 사용하는 쿼리와 일치하도록 인덱스를 만드는 것이 중요해요.
병목 현상 해결 전략
트래픽이 많은 애플리케이션에서는 데이터베이스 접근이 종종 병목 현상을 일으켜요. Netflix의 캐시는 초당 3천만 개의 요청을 처리한다고 해요. 이렇게 많은 요청을 처리하기 위한 몇 가지 해결 방법이 있어요:
- 데이터베이스가 작업을 하도록 하세요. 여러 테이블의 데이터가 필요하다면 JOIN을 사용하고, 메모리에서 조합하지 마세요
- 가능한 많은 읽기 쿼리를 읽기 전용 복제본으로 보내세요
- 쿼리 스파이크(특히 쓰기 쿼리와 트랜잭션)를 조심하세요
마이크로서비스 아키텍처의 힘
Netflix의 진화 과정
Netflix는 2008년 데이터베이스 손상으로 인한 대규모 장애 이후, 8년에 걸쳐 단일체 애플리케이션에서 수백 개의 마이크로서비스로 전환했어요. 이 전환은 Netflix가 현재의 글로벌 스트리밍 강자로 성장할 수 있는 기반이 되었답니다.
Netflix의 마이크로서비스 아키텍처는 사용자 인증, 콘텐츠 카탈로그, 추천 엔진, 결제, 스트리밍 등 각각의 기능을 독립적인 서비스로 운영해요. 각 마이크로서비스는 REST API나 메시지 큐를 통해 서로 통신하죠.
컨테이너 관리 플랫폼 Titus
Netflix는 자체 컨테이너 관리 플랫폼인 Titus를 구축해서, AWS에서 주당 300만 개 이상의 컨테이너를 실행하고 있어요. 이를 통해 스트리밍 백엔드 서비스부터 배치 분석, 머신러닝 작업까지 모든 것을 효율적으로 관리하고 있답니다.
백그라운드 작업과 실시간 처리
사용자 경험 최적화
사용자와 상호작용하는 기능은 몇 백 밀리초 내에 응답해야 해요. 하지만 시간이 오래 걸리는 작업들도 있죠. 이런 경우에는 사용자에게 즉시 유용한 최소한의 작업만 하고, 나머지는 백그라운드에서 처리하는 게 좋아요.
Netflix는 2024년에 콘텐츠 제작에 160억 달러를 투자했고, 2025년에는 180억 달러를 투자할 계획이라고 해요. 이렇게 엄청난 양의 콘텐츠를 처리하면서도 사용자에게는 즉시 스트리밍 서비스를 제공하고 백그라운드에서 데이터 처리를 진행하고 있어요.
Keystone 데이터 파이프라인
Netflix의 Keystone은 실시간 데이터 전송, 처리, 라우팅을 위한 핵심 통합 인프라로, 매일 수조 개의 이벤트를 처리해요. Apache Kafka를 중앙 메시지 버스로 사용하고, 실시간 스트림 처리를 위해 Apache Flink를 활용하고 있답니다.
캐싱 전략: 양날의 검
언제 캐싱을 사용해야 할까요?
같은 비싼(느린) 작업을 여러 사용자가 필요로 할 때 캐싱이 유용해요. 예를 들어, 사용자별 과금을 계산할 때 현재 가격을 API로 조회해야 한다면, 5분마다 한 번씩만 조회하고 그 값을 저장해두는 거죠.
하지만 주의하세요! 캐시는 상태의 한 종류이고, 이상한 데이터가 들어갈 수 있거나 실제 진실과 동기화되지 않을 수 있어요. 캐싱하기 전에 먼저 속도를 개선할 다른 방법을 진지하게 시도해보세요.
Netflix의 추천 시스템은 1,300개의 추천 클러스터를 사용하여 한 번에 3,000개 이상의 타이틀을 필터링한다고 해요. 이런 복잡한 계산 결과를 효율적으로 캐싱하여 사용자 경험을 향상시키고 있어요.
추천 시스템: AI의 마법
개인화된 경험의 비밀
Netflix의 일반적인 TV 프로그램의 성공률이 35%인 반면, Netflix 오리지널 콘텐츠는 93%의 성공률을 보인다고 해요. 이건 단순한 운이 아니라, 데이터와 강력한 추천 알고리즘을 활용해서 적절한 타겟 오디언스에게 콘텐츠를 제공한 결과예요.
Netflix의 개인화 시스템은 2억 5천만 개 이상의 맞춤형 경험을 만들어내고 있어요. Todd Yellin Netflix 제품 혁신 부사장에 따르면, 일반적인 Netflix 회원은 시청할 콘텐츠를 결정하기 전에 평균 40-50개의 타이틀만 살펴본다고 해요.
섬네일까지 개인화
Netflix는 콘텐츠의 아트워크조차 개인화해서 추천에 활용하고 있어요. 사용자가 90초 내에 관심을 보이지 않으면 다른 콘텐츠로 넘어갈 가능성이 높다고 보고, 감정적인 스펙트럼을 전달하는 이미지가 사용자의 관심을 끄는 데 가장 효과적이라고 결론지었어요.
이벤트 시스템과 데이터 흐름
언제 이벤트를 사용할까요?
대부분의 기술 회사들은 Kafka 같은 이벤트 허브를 가지고 있어요. 이것은 백그라운드 작업용 큐와 비슷하지만, "이 작업을 이 매개변수로 실행해"가 아니라 "이런 일이 일어났어"를 큐에 넣는 거예요.
예를 들어, "새 계정이 생성됨" 이벤트를 발생시키면 여러 서비스가 이를 처리해요:
- 환영 이메일 발송 서비스
- 남용 스캔 서비스
- 계정별 인프라 설정 서비스
하지만 이벤트를 과도하게 사용하면 안 돼요. 대부분의 경우 한 서비스가 다른 서비스에 API 요청을 보내는 것이 더 나아요.
장애 대응: 우아한 실패 처리
Chaos Engineering의 힘
Netflix는 Chaos Monkey라는 도구를 사용해서 의도적으로 운영 환경에서 인스턴스를 무작위로 종료시켜요. 이를 통해 시스템이 장애를 우아하게 견딜 수 있는지 확인하는 거죠.
재시도는 만능 해결책이 아니에요. 실패한 요청을 맹목적으로 재시도해서 다른 서비스에 추가 부하를 주지 않도록 주의해야 해요. 가능하다면 "회로 차단기"를 사용하세요.
열림과 닫힘 정책
시스템의 일부가 실패했을 때 어떻게 할지 결정하는 것도 중요해요. 두 가지 옵션이 있어요:
- 열림으로 실패: 요청을 통과시킴
- 닫힘으로 실패: 요청을 차단
율 제한 시스템은 거의 항상 열림으로 실패해야 하지만, 인증은 명백히 항상 닫힘으로 실패해야 하죠.
핫 패스: 중요한 경로에 집중하기
시스템을 설계할 때 사용자가 상호작용할 수 있는 방법이나 데이터가 흐를 수 있는 방법이 많아서 압도될 수 있어요. 이럴 때는 "핫 패스"에 주로 집중하세요. 이는 가장 중요하고 가장 많은 데이터를 처리할 부분이에요.
Netflix에서 시청되는 콘텐츠의 80%가 추천 시스템 기반이라는 것처럼, 추천 엔진이 바로 Netflix의 핫 패스예요. 이 부분의 성능과 안정성이 전체 서비스의 성공을 좌우하죠.
글로벌 콘텐츠 전달: Open Connect CDN
자체 CDN의 힘
Netflix는 자체 콘텐츠 전달 네트워크인 Open Connect를 운영하고 있어요. 이 시스템은 전 세계 ISP 내에 전략적으로 배치된 서버들로 구성되어 있어서, 사용자에게 최적의 신뢰성과 최소한의 지연으로 콘텐츠를 전달할 수 있어요.
Open Connect Appliances(OCA)는 AWS의 캐시 제어 서비스에 정기적으로 학습된 경로, 콘텐츠 가용성, 전반적인 상태를 보고해요. 사용자가 콘텐츠를 요청하면, AWS의 스티어링 서비스가 어떤 OCA에서 파일을 제공할지 결정하죠.
마무리: 단순함이 승리하는 이유
좋은 시스템 설계는 교묘한 트릭에 관한 것이 아니라, 지루하고 잘 테스트된 구성 요소를 올바른 위치에 사용하는 방법을 아는 것이에요.
Netflix가 2억 8천만 명의 구독자라는 엄청난 규모를 처리하면서도 안정적인 서비스를 제공할 수 있는 이유는 복잡한 아키텍처 때문이 아니라, 검증된 원칙들을 일관성 있게 적용했기 때문이에요.
대부분의 상황에서 좋은 시스템 설계는 '아무것도 하지 않는 것'처럼 보일 거예요. 컨퍼런스에서 이야기할 만한 시스템 설계를 할 영역은 매우 적어요. 지루한 시스템 설계야말로 매일 우리가 만나는 진짜 성공의 비결이랍니다.
'IT > 소프트웨어' 카테고리의 다른 글
| 🔥 시니어 개발자가 Cursor 버리고 Claude Code 쓰는 진짜 이유 (5) | 2025.08.14 |
|---|---|
| 🚀 개발자의 최고의 딜레마, 속도 vs 품질... 정답은 8점 코드? (7) | 2025.08.13 |
| AI가 코드를 쏟아내는 시대, 왜 시니어 개발자가 더 중요해졌을까요? (10) | 2025.07.23 |
| 🚀 15분 만에 전문가급 웹사이트를 만드는 비밀 - Bolt.new 완전 정복 가이드 (9) | 2025.07.22 |
| 🚀 15만 달러 빚에서 100억 달러까지: Notion의 놀라운 성공 스토리 (9) | 2025.07.22 |