마이크로서비스 아키텍처에서는 수많은 서비스가 서로 통신하면서 요청을 처리한다. 이때 하나의 요청이 여러 서비스에 걸쳐 수행되기 때문에, 문제 발생 시 어디서 실패했는지 파악하기 어렵다.
이를 해결하기 위해 API Gateway는 분산 로깅과 추적 기능을 적극 활용한다.
분산 시스템에서 발생할 수 있는 일반적인 문제 유형
- 지연 시간 증가: 네트워크 지연, 서비스 과부하, 비효율적인 쿼리로 인한 응답 지연
- 서비스 가용성 문제: 서버 장애, 네트워크 오류, 소프트웨어 버그로 인한 서비스 다운
- 잘못된 서비스 통신: API 명세 불일치, 데이터 포맷 오류, 호출 순서 오류 등으로 시스템 오작동
➡️ 이러한 이유로 요청 흐름 추적과 문제 진단이 매우 중요하다.
분산 로깅과 추적이 필요한 이유
- 문제 진단: 요청 경로를 정확히 추적하여, 어느 지점에서 에러가 발생했는지 빠르게 확인
- 성능 병목 분석: 특정 서비스 호출에서 시간이 오래 걸리는 구간 분석
- 서비스 간 종속성 이해: 어떤 서비스들이 어떤 순서로 호출되는지 시각화
- 보안 및 규정 준수: 모든 요청 및 응답을 기록하여 감사(Audit) 용도로 활용
- 운영 효율성 향상: 장애 발생 시 원인 분석 및 복구 시간을 단축
분산 로깅 및 추적 개념
📌 분산 로깅
각 서비스에서 발생한 로그를 수집해 하나의 시스템처럼 분석할 수 있도록 하는 것
📌 분산 추적
하나의 클라이언트 요청이 여러 서비스를 거칠 때, 그 경로와 상태를 추적하여 요청 흐름을 분석하는 것
특히, API Gateway는 모든 요청의 시작 지점이기 때문에, Trace ID를 생성하거나 전달하여 추적의 기준을 세워야 한다.
Spring 생태계에서 분산 추적 방법
Spring에서는 주로 Spring Cloud Sleuth와 Zipkin을 조합하여 분산 추적을 구현한다.

- 클라이언트 요청 수신
- Trace ID / Span ID 생성 또는 전달
- 각 서비스로 요청 전파 시 Trace 정보 함께 전달
- 각 서비스에서 Trace 정보 기반으로 로깅 및 추적 기록
- 수집된 로그 및 추적 정보 통합 분석
| 도구 | 역할 |
| Spring Cloud Sleuth | 요청마다 Trace ID/Span ID를 자동 생성 및 전달 |
| Zipkin | 수집된 추적 데이터를 저장하고 시각화 |
Spring Cloud Seluth
📌 Sleuth란?

- 요청 흐름을 자동 추적할 수 있도록 Trace ID, Span ID를 추가해 주는 라이브러리이다.
- 로깅 시스템과 연동되어 Trace ID, Span ID를 자동으로 남겨준다.
📌 Trace ID와 Span ID 개념

| 용어 | 설명 |
| Trace ID | 하나의 클라이언트 요청 전체를 식별하는 고유 ID |
| Span ID | 요청 처리 중 하나의 작업 단위를 식별하는 ID (서비스 호출, DB 쿼리 등) |
Trace 관계 예시
(Trace ID: A)
├── (Span ID: A.1) Gateway 진입
├── (Span ID: A.2) UserService 호출
└── (Span ID: A.3) OrderService 호출
Sleuth 적용 방법
1️⃣ 의존성 추가
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2️⃣ 기본 설정
- 특별한 설정 없이 기본적으로 작동한다.
3️⃣ 로그 출력 예시
[TraceId=123e4567, SpanId=abc123] GET /users
Zipkin
📌 Zipkin이란?
Zipkin은 분산 추적 시스템으로, 각 서비스에서 수집한 추적 데이터를 시각화해준다.
Zipkin 아키텍처 구성요소

| 컴포넌트 | 역할 |
| Collector | 서비스로부터 추적 데이터를 수집 |
| Storage | 수집된 데이터를 저장 (MySQL, Elasticsearch 등 지원) |
| API | 추적 데이터 조회용 REST API 제공 |
| UI | 시각적 분석 화면 제공 (Trace 타임라인 보기 가능) |
Sleuth + Zipkin통합
Spring Boot에서 Sleuth와 Zipkin은 쉽게 통합할 수 있다.
설정 방법
spring:
sleuth:
sampler:
probability: 1.0 # 모든 요청 샘플링
zipkin:
base-url: http://localhost:9411
enabled: true
💡 Sleuth가 생성한 Trace ID, Span ID를 Zipkin이 수집하고 저장하여 UI로 분석할 수 있게 된다.
예시: Gateway와 User Service 간 추적 흐름
- 클라이언트 -> API Gateway로 요청 전송
- API Gateway
- Trace ID 생성
- Span ID 생성
- 요청에 Trace/Span ID 삽입
- User Service
- Gateway가 전달한 Trace ID/Span ID를 사용해 로깅
- 새로운 하위 Span 생성 가능
- Zipkin 서버
- 모든 추적 데이터 수집 및 저장
- 웹 UI로 트랜잭션 흐름 시각화
📢 Zipkin에서 "Trace Timeline"을 확인하면 서비스 간 호출 흐름을 한눈에 볼 수 있다.
Sleuth와 Zipkin으로 해결할 수 있는 문제
| 문제 | 해결 방법 |
| 요청 흐름을 파악하기 어려움 | Trace ID를 통해 요청 흐름을 추적 |
| 성능 병목 구간 파악 불가 | Zipkin의 타임라인 분석으로 느린 구간 식별 |
| 에러 원인 추적 불편 | Trace ID를 통해 에러 발생 위치 정확히 추적 |
| 응답 시간 모니터링 어려움 | 서비스별 응답시간 측정 및 분석 가능 |
'아키텍처 & 설계(Architecture & Design) > MSA' 카테고리의 다른 글
| 분산 트랜잭션의 한계와 SAGA 패턴 (0) | 2025.11.07 |
|---|---|
| [API Gateway] BFF 패턴 (0) | 2025.05.22 |
| [API Gateway] 로깅과 모니터링의 중요성 (0) | 2025.04.16 |
| [API Gateway] API Gateway에서의 트래픽 제어 (0) | 2025.04.08 |
| [API Gateway] API Gateway에서 인증과 인가 처리 방법 (0) | 2025.04.02 |