728x90
반응형
https://toss.im/career/article/secu_server-chapter-2
토스증권 서버 개발자가 많이 듣는 질문 4가지 : 무엇이든 답해드려요
빠르게 성장하는 서비스를 책임지는 토스증권 서버 챕터. 그들의 솔직한 기술 이야기와, 그 안에 숨겨진 엔지니어링 핵심 철학까지! 지금 바로 만나보세요.
toss.im
우연히 위 글을 읽게 되었는데 토스증권 개발자들의 기술적인 고민을 엿볼 수 있는 좋은 아티클이어서 정리해보려 한다!
크게 각 문답별 내용 및 그에 따른 학습 포인트를 정리해보고,
각 문답별 학습 포인트에 대한 내용들은 학습 후에 별도 포스팅으로 올릴 예정이다🙏
Q1. 현재 기술적으로 해결하려는 문제
- 서비스가 빠르게 커짐에 따라 기능간 통합 필요
- 소규모로 각각 운영하던 서버들이 증가라면서 유사한 성격의 서버와 데이터베이스가 흩어지며 구조적 한계가 드러남
- 한 화면에 보여지는 데이터가 각각 흩어져있어서 호출해야하는 api가 많아짐
- 이에 따라 aggregation 코드의 복잡성이 증가하하고 유지보수가 어려워짐
- 중간에 통합레이어를 두는 아키텍처 도입/고려 중
- 장점 : 각기 다른 데이터 소스를 하나의 통일된 인터페이스로 추상화하여 서비스 단에서는 보다 단순하게 데이터를 사용할 수 있다
- 단점 : 통합 레이어 자체가 성능 저하 또는 새로운 장애의 포인트가 될 수 있음
- 만약 통합레이어에 비즈니스 로직이 포함되어 있다면 upstream 서버의 변경이 통합 레이어에도 영향을 줄 수 있어 로직간 의존성과 팀 간의 커뮤니케이션이 중요해짐
- 따라서 앞으로는 이 통합 레이어를 얼마나 효과적으로 설계하고, 잘 관리해 나가는지가 기술적 관점에서 매우 중요한 미션이 될 예정
- 빠르게 변화하고 복잡해지는 서비스 환경에서, 이 통합 계층을 기술적 확장성과 안정성 모두를 만족시킬 수 있는 방향으로 고도화시키는 것이 필요
✏️ 학습 포인트
- 통합 레이어 아키텍처 ⇒ 여러 API 또는 DB를 하나의 일관된 방식으로 추상화하여 복잡도와 중복을 줄이고 유지보수성을 높이기 위한 아키텍처적 접근
| 키워드 | 설명 |
| Backend for Frontend (BFF) | 각 클라이언트(Web, App 등)의 특성에 맞는 API 인터페이스를 제공하기 위한 중간 계층. 통합 레이어와 유사한 목적. |
| API Gateway | 다양한 마이크로서비스 API를 하나의 진입점으로 통합. 인증, 라우팅, 집계 등의 역할 수행. |
| GraphQL | 클라이언트가 필요한 데이터만 요청하고, 여러 소스를 통합해 응답할 수 있는 API 쿼리 언어. 통합 레이어 대안으로 각광. |
| Aggregation Layer / Orchestration Layer | 여러 마이크로서비스나 데이터 소스를 집계하거나 흐름을 제어하는 중간 계층. |
| Federated Architecture | 서로 다른 도메인 서비스들이 하나의 통합 인터페이스(API, GraphQL 등)를 제공하기 위한 분산 설계 방식. |
| Service Composition | 복수의 서비스 호출 결과를 조합하여 하나의 응답으로 만드는 기술. |
| Service Mesh | 서비스 간 통신, 관찰, 제어를 위한 인프라 계층. 통합은 아니지만, 복잡성 관리 측면에서 유사한 문제 해결. |
| Clean Architecture / Hexagonal Architecture | 비즈니스 로직과 외부 시스템(API, DB 등) 간의 의존성을 줄이고 추상화하는 계층화된 아키텍처. 통합 레이어 구현에 적합. |
- API 호출 통합 + 화면 구성 복잡성 해결
- Backend for Frontend
- API Composition
- GraphQL (vs REST)
- API Gateway + Aggregation
- 다른 DB/API 구조 통합 및 추상화
- Data Abstraction Layer
- Service Aggregation Layer
- Anti-Corruption Layer (도메인 주도 설계의 용어, 외부 시스템과 내부 도메인을 분리)
- 성능 문제 및 장애 포인트 관리
- Resilience4j, Hystrix, Circuit Breaker
- Caching in API Gateways
- Distributed Tracing (예: OpenTelemetry)
- 협업 및 의존성 관리
- Domain-Oriented Microservices
- Team Topologies
- Conway's Law
- 학습 방향
- BFF & API Aggregation 아키텍처부터 시작
- GraphQL vs REST의 통합 가능성을 비교
- 도메인 기반 아키텍처(Domain-Oriented Architecture)로 확장
Q2. 대규모 트래픽 처리 방식
- CQRS 아키텍처 도입
- 데이터의 읽기/쓰기 분리를 통해 성능을 높임
- 원본 데이터는 Oracle에서 관리되며, 읽기 전용 뷰는 별도의 DB로 분리하여 트래픽 분산
- 서비스가 성장함에 따라 데이터가 급증하여 단일 인스턴스 기반 구조로는 한계가 명확해짐 → Vitess 도입
- Vitess: MySQL 기반의 샤딩 게이트웨이
- 실시간으로도 안정적인 reshard가 가능하고, OLTP 성격의 대용량 데이터 처리에 매우 적합한 구조
- 현재 토스증권은 Vitess를 기반으로 CQRS 구조를 확장했고, API 응답 속도는 p95 기준 40ms 수준을 유지하며, 실시간 일관성이 필요한 데이터는 대부분 10ms 이내로 업데이트 됨
- read view database를 사용하면 데이터 일관성에 대한 굉장한 관리가 필요 → 원본 database와 실시간 검증기를 거치고, 매일 잔차(소량) batch를 통해 데이터의 오염 확인
- 주기적인 검증 및 추가 잔여 배치를 통해 일관성 유지
✏️ 학습 포인트
| 주제 | 탐색 키워드 |
| Vitess 내부 동작 원리 | Vitess architecture, Vitess resharding, Vitess VReplication |
| CQRS 실무 적용 시 고려사항 | CQRS trade-offs, CQRS with eventual consistency |
| 실시간 데이터 정합성 검증기 구현 | data consistency checker, CDC vs checksum validation |
| 잔차 batch 설계 방식 | residual data validation batch, data reconciliation job |
| p95 latency 기준 | SLA vs p95 vs p99, latency percentile monitoring |
| 읽기/쓰기 분리 아키텍처 사례 | read replica architecture, read/write split |
- 아키텍처 확장성 확보는 구조적 전환(CQRS, 수평 확장)과 운영적 세부 관리(정합성 체크)의 균형이 중요
- 실시간성과 일관성을 동시에 잡기 위한 검증 체계(실시간 + batch)는 고도화된 시스템 운영의 핵심 요소
- 단일 성능 지표(p95, 10ms 등)를 명확히 정하고, 그것을 위한 기술 선택을 실무에 반영하는 방식은 현실적인 성능 목표 설정 및 달성 방법의 좋은 사례
Q3. 안정성을 위한 모니터링 및 트러블 슈팅 방식
- Grafana, Kibana, Flink 등 다양한 오픈소스 활용
- 이를 통해 에러 개수, Thread 고갈, Api 실패율, Kafka Log 증가 등 서비스의 특성에 따른 다양한 이상치 모니터링
- 이상치가 감지되면 Alert 시스템을 통해 서비스 담당자에게 전파
- 최근에 Alert 시스템 개선을 통해 전파 시간을 5분 → 1분으로 단축
- 발생한 에러의 특정 서버, 유저와 같은 동일한 특성을 가지고 있는지도 함께 전송하여 빠른 원인 파악에 도움
- 트러블 슈팅 시 최근 변경 이력 파악 및 영향 가능성을 우선으로 확인
- 이와 동시에 Jaeger, Pinpoint와 같은 트레이싱 도구를 통해 서비스 간 호출 흐름을 분석하여 에러가 최초로 발생한 서비스 식별
- 이후 해당 서비스에 대해 Tcp dump, Thread dump와 같은 프로파일링 도구를 이용해 상세 분석 진행
- 이를 통해 CPU, 메모리와 같은 리소스에 과다 사용, 스레드 고갈, 데드락 등 시스템의 병목 발생 가능 지점을 찾아냄
- 다양한 공통화 도구도 제공 → 공통 메트릭 포맷, 프로파일링 도구, 로그, 트레이싱 등..
✏️ 학습 포인트
| 항목 | 설명 |
| 1. 실시간 모니터링 도구 활용 | Grafana (대시보드), Kibana (로그 분석), Flink (실시간 스트리밍 처리) 등을 활용해 이상치를 탐지함 |
| 2. 모니터링 지표 다양화 | 단순 에러 개수뿐 아니라 - API 실패율 - Thread 고갈 - Kafka lag 등 서비스 특화 지표도 모니터링 |
| 3. Alert 전파 시스템 고도화 | Alert 전파 시간을 5분 → 1분으로 단축+ 관련 context (서버, 유저 등) 포함하여 빠른 원인 분석 가능하게 함 |
| 4. 트러블슈팅 흐름 정형화 | ① 최근 배포/작업 여부 확인② Jaeger, Pinpoint로 호출 추적③ Thread dump, TCP dump로 시스템 병목 분석 |
| 5. 성능 병목 탐지 포인트 | CPU 과다, 메모리 누수, 스레드 고갈, 데드락 등 주요 장애 원인을 탐지 |
| 6. 도구 접근성 및 공통화 | 프로파일링, 트레이싱, 메트릭 수집 도구를 사내 어드민 툴로 누구나 쉽게 접근 가능하게 제공 |
| 7. 메트릭 포맷 표준화 | 서비스 간 공통 메트릭 포맷 정의하여 일관된 모니터링 구조 구성 |
기술 스택 별 학습 포인트
| 도구 | 사용 목적 |
| Grafana | 실시간 대시보드로 지표 시각화 |
| Kibana | 로그 기반 분석 및 검색 |
| Apache Flink | 스트리밍 데이터를 실시간 처리하여 이상 탐지 |
| Jaeger / Pinpoint | 분산 트레이싱 도구로 서비스 간 호출 흐름 분석 |
| Tcpdump / Thread dump | 시스템 레벨의 네트워크, 스레드 상태 정밀 분석 |
| Custom Admin Tool | 내부 공통화된 프로파일링/트레이싱 도구 접근 허브 |
실무 적용 관점
| 주제 | 인사이트 |
| 관측 가능한 시스템 설계 (Observability) | 서비스 지표 + 로그 + 트레이싱 + 시스템 dump를 연계한 종합적 관찰 구조 |
| 문제 탐지부터 해결까지의 속도 최적화 | 탐지 → 알림 → 분석 → 해결 루프의 속도와 정확도 모두 중요 |
| 공통화와 자동화의 중요성 | 도구와 포맷을 통합·표준화함으로써 개인 역량에 의존하지 않는 운영 구조 달성 |
| 컨텍스트 포함된 Alert | Alert 전파 시 에러 발생 지점의 특징(서버, 유저 등)을 포함해야 빠른 대응 가능 |
Q4. 서버 개발자의 인재상
👨💻 새벽마다 모니터링과 트러블슈팅으로 인해 모두가 기피하는 도메인에서 오늘도 묵묵히 팀에 필요한 일을 하는 김토증님. (mission over individual)
☕ 오늘도 커피챗과 함께 동료들에게 피드백을 구합니다. (ask for feedback)
🤷♂️ 김토스님의 피드백을 통해 본인이 요즘 너무 많은 태스크에 치이며 산다는 걸 상기합니다. 나에게 가장 임팩트가 큰 일은 뭘까? (focus on impact)
🤔 매일 새벽에 도는 문제의 배치. 어제도 트러블슈팅하고 모니터링 하느라 새벽잠을 설쳤습니다. 어떻게 하면 재발 방지를 할 수 있지? 근데 이거 꼭 새벽에 돌아야 하나? 어쩌면 굳이 배치일 필요는 있나? (question every assumption)
💡 도메인 문서도 살펴보고, 히스토리도 보고, 예전 담당자도 찾아봅니다. 근본부터 다시 이해하고 구조를 재설계해 봅니다. 지금은 개선할 수 있을 것 같습니다. 동료들과 논의한 결과, 지금은 컨슈머 구조로 바꾸는 게 오히려 더 좋다는 결론에 도달했습니다. (learn proactively)
🙆♂️ 일부 우려를 표하는 동료도 있지만, 할 수 있는 부분부터 해보면 좋을 것 같습니다. 간단하게 만들어서 테스트 환경에서 검증해 봅니다. (execution over perfection) 가설이 잘 동작했고, 동료들의 우려도 해소됐습니다.
🏃♂️ 최대한 빠르게 작업에 몰입합니다. (move with urgency) 동료들은 김토증님이 임팩트에 집중할 수 있도록 다른 업무들을 지원해 줍니다.
🚀 빠르게 만들고 꼼꼼하게 테스트해서 라이브에 릴리즈 합니다. 새벽에 때로는 다섯 명까지도 고통받던 업무가 사라졌습니다. 고객들은 일 1회 바뀌던 것을 실시간으로 볼 수 있게 됐습니다. (aim higher)
😀 자기 전에 커뮤니티에 글이 하나 올라왔습니다. "버핏 님의 새 글이 등록되었습니다. 이거 실시간으로 바뀐 거 보심?" 고객님들의 인정에 오늘도 뿌듯함을 느끼며 하루를 마무리합니다.
이건 토스만의 개발을 향한 순수 광기✨ 가 느껴져서 가져와봤다..
이렇게만 하면 사실상 특정 회사가 아닌 개발자의 참인재상이 아닐까 싶다😅
728x90
반응형
'야미로깅' 카테고리의 다른 글
| 그럼 그냥 살아, 아무도 뭐라 안해 (5) | 2025.08.10 |
|---|---|
| 인프런 판교 퇴근길 밋업 #7 오픈소스 참가 후기 🍀 (2) | 2024.09.13 |
| 개발자의 평생공부 (5) | 2024.07.24 |
| 2023 개발자 회고(인 척하는 나 자신 기강잡기😅) (1) | 2024.01.26 |
| 개발자는 왜 맥을 좋아할까? 🤷♀️🤷 (1) | 2023.07.24 |