# Kafka 통합 테스트 결과 보고서

**테스트 일시**: 2025-10-30
**테스트 담당**: Backend Developer
**테스트 환경**: 개발 환경 (Mock 모드)

---

## 1. 테스트 개요

### 테스트 목적
- event-service의 Kafka Producer/Consumer 기능 검증
- Kafka 브로커 연결 상태 확인
- 서비스 간 메시지 통신 흐름 검증

### 테스트 범위
- ✅ Kafka 브로커 연결 테스트
- ✅ event-service Producer 테스트 (이미지 생성 Job 발행)
- ✅ event-service Consumer 테스트 (이미지 생성 Job 수신)
- ⚠️ content-service Consumer 테스트 (미구현으로 인한 제외)

---

## 2. 테스트 환경 설정

### Kafka 브로커 정보
```yaml
Cluster ID: DoD3g79BcWYex6Sc43dqFy
Bootstrap Servers:
  - 20.249.182.13:9095
  - 4.217.131.59:9095
Kafka Version: 3.7.0
```

### event-service 설정
```yaml
spring.kafka:
  bootstrap-servers: 20.249.182.13:9095,4.217.131.59:9095
  producer:
    key-serializer: StringSerializer
    value-serializer: JsonSerializer
  consumer:
    group-id: event-service-consumers
    key-deserializer: StringDeserializer
    value-deserializer: JsonDeserializer
    auto-offset-reset: earliest
    enable-auto-commit: false
  listener:
    ack-mode: manual

app.kafka.topics:
  ai-event-generation-job: ai-event-generation-job
  image-generation-job: image-generation-job
  event-created: event-created
```

### Mock JWT 토큰 생성
```python
# Secret Key
secret = "default-jwt-secret-key-for-development-minimum-32-bytes-required"

# Payload
{
  "sub": "test-user-123",
  "userId": "test-user-123",
  "storeId": "STORE-001",
  "storeName": "테스트 매장",
  "iat": 1761750751,
  "exp": 1761837151
}

# Generated Token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZXN0LXVzZXItMTIzIiwidXNlcklkIjoidGVzdC11c2VyLTEyMyIsInN0b3JlSWQiOiJTVE9SRS0wMDEiLCJzdG9yZU5hbWUiOiJcdWQxNGNcdWMyYTRcdWQyYjggXHViOWU0XHVjN2E1IiwiaWF0IjoxNzYxNzUwNzUxLCJleHAiOjE3NjE4MzcxNTF9.0TC396_Z-Wh45aK23qPvy-u9I8RXrg5OYqdVxqvRI0c
```

---

## 3. 테스트 시나리오 및 결과

### 3.1 Kafka 브로커 연결 테스트

**테스트 절차**:
1. event-service 시작 (포트 8081)
2. Kafka 연결 로그 확인

**테스트 결과**: ✅ **성공**

**로그 확인**:
```log
2025-10-30 00:09:35 - Kafka version: 3.7.0
2025-10-30 00:09:36 - Cluster ID: DoD3g79BcWYex6Sc43dqFy
2025-10-30 00:09:36 - Discovered group coordinator 4.217.131.59:9095
2025-10-30 00:09:37 - Successfully joined group with generation Generation{
  generationId=58,
  memberId='consumer-event-service-consumers-4-1022b047-d310-4743-a743-6bdd0ccfa380',
  protocol='range'
}
2025-10-30 00:09:37 - Successfully synced group
2025-10-30 00:09:37 - Notifying assignor about the new Assignment(
  partitions=[image-generation-job-0]
)
```

**검증 사항**:
- ✅ Kafka 3.7.0 버전 확인
- ✅ 클러스터 ID 확인
- ✅ Consumer Group 가입 성공
- ✅ Partition 할당 성공 (image-generation-job-0)
- ✅ 6개 Consumer 연결 확인

---

### 3.2 이벤트 생성 테스트

**테스트 절차**:
1. Mock JWT 토큰 생성
2. POST `/api/v1/events` API 호출
3. 이벤트 생성 확인

**API 요청**:
```bash
curl -X POST http://localhost:8081/api/v1/events \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -d '{
    "objective": "NEW_CUSTOMER",
    "storeName": "Test Cafe",
    "storeCategory": "CAFE",
    "storeDescription": "A nice coffee shop for testing"
  }'
```

**테스트 결과**: ✅ **성공**

**응답**:
```json
{
  "success": true,
  "data": {
    "eventId": "EVT-str_dev_test_001-20251030001311-70eea424",
    "objective": "NEW_CUSTOMER",
    "status": "DRAFT",
    "createdAt": "2025-10-30T00:13:11"
  }
}
```

**생성된 Event ID**: `EVT-str_dev_test_001-20251030001311-70eea424`

---

### 3.3 Kafka Producer 테스트 (이미지 생성 요청)

**테스트 절차**:
1. POST `/api/v1/events/{eventId}/images` API 호출
2. Kafka 메시지 발행 확인

**API 요청**:
```bash
curl -X POST http://localhost:8081/api/v1/events/EVT-str_dev_test_001-20251030001311-70eea424/images \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Modern cafe promotion event poster with coffee cup",
    "styles": ["MODERN"],
    "platforms": ["INSTAGRAM"]
  }'
```

**테스트 결과**: ✅ **성공**

**응답**:
```json
{
  "success": true,
  "data": {
    "jobId": "JOB-IMG-1761750847428-b88d2f54",
    "eventId": "EVT-str_dev_test_001-20251030001311-70eea424",
    "status": "PENDING",
    "message": "이미지 생성 작업이 시작되었습니다."
  }
}
```

**Kafka Producer 로그**:
```log
2025-10-30 00:14:07 - 이미지 생성 작업 메시지 발행 완료
  jobId: JOB-IMG-1761750847428-b88d2f54

2025-10-30 00:14:07 - 이미지 생성 작업 메시지 발행 성공
  Topic: image-generation-job
  JobId: JOB-IMG-1761750847428-b88d2f54
  EventId: EVT-str_dev_test_001-20251030001311-70eea424
  Offset: 0
```

**발행된 메시지 정보**:
- Topic: `image-generation-job`
- Partition: 0
- Offset: 0
- Key: `JOB-IMG-1761750847428-b88d2f54`
- Status: PENDING

---

### 3.4 Kafka Consumer 테스트 (메시지 수신)

**테스트 절차**:
1. event-service의 ImageJobKafkaConsumer가 메시지 수신 확인
2. 메시지 파싱 및 처리 확인

**테스트 결과**: ✅ **성공**

**Kafka Consumer 로그**:
```log
2025-10-30 00:14:07 - 이미지 생성 작업 메시지 수신
  Partition: 0, Offset: 0

2025-10-30 00:14:07 - 이미지 작업 메시지 파싱 완료
  JobId: JOB-IMG-1761750847428-b88d2f54
  EventId: EVT-str_dev_test_001-20251030001311-70eea424
  Status: PENDING
```

**검증 사항**:
- ✅ 메시지 수신 성공 (Partition 0, Offset 0)
- ✅ JSON 메시지 파싱 성공
- ✅ JobId, EventId, Status 정상 추출
- ✅ Manual Acknowledgment 처리 완료

---

## 4. 발견된 문제점

### ⚠️ content-service Kafka Consumer 미구현

**문제 설명**:
- 논리 아키텍처에서는 content-service가 `image-generation-job` topic을 구독하도록 설계됨
- 실제 구현에서는 content-service에 Kafka Consumer 코드가 없음
- content-service의 `application.yml`에 Kafka 설정이 없음

**현재 메시지 흐름**:
```
Event-Service (Producer) → Kafka Topic → Event-Service (Consumer)
                                          ↓
                                   자신이 발행한 메시지를
                                   자신이 소비하고 있음
```

**설계된 메시지 흐름**:
```
Event-Service → Kafka → Content-Service → 이미지 생성 → Kafka → Event-Service
  (Producer)           (Consumer)                      (Producer)  (Consumer)
```

**영향**:
- content-service는 현재 Redis 기반으로만 Job 관리
- 서비스 간 Kafka 기반 비동기 통신이 불가능
- 이미지 생성 작업이 content-service에 전달되지 않음

**권장 사항**:
1. **옵션 A**: content-service에 Kafka Consumer 구현 추가
2. **옵션 B**: 설계 문서 수정 (Redis 기반 통신으로 변경)
3. **옵션 C**: event-service가 content-service REST API 직접 호출

---

## 5. 테스트 결과 요약

### 성공한 테스트 항목
| 항목 | 결과 | 비고 |
|------|------|------|
| Kafka 브로커 연결 | ✅ 성공 | 클러스터 ID 확인, Consumer Group 가입 |
| Event 생성 | ✅ 성공 | Event ID: EVT-str_dev_test_001-20251030001311-70eea424 |
| Kafka Producer (이미지 생성) | ✅ 성공 | Topic: image-generation-job, Offset: 0 |
| Kafka Consumer (메시지 수신) | ✅ 성공 | 메시지 파싱 및 처리 완료 |
| Manual Acknowledgment | ✅ 성공 | 수동 커밋 처리 완료 |

### 미검증 항목
| 항목 | 상태 | 사유 |
|------|------|------|
| content-service Kafka Consumer | ⚠️ 미구현 | Kafka Consumer 코드 없음 |
| AI Service Kafka Consumer | ⚠️ 미확인 | AI Service 미테스트 |
| Analytics Service Kafka Consumer | ⚠️ 미확인 | Analytics Service 미테스트 |
| 서비스 간 메시지 전달 | ⚠️ 불가 | content-service Consumer 미구현 |

---

## 6. 테스트 데이터

### 생성된 테스트 데이터
```yaml
Mock JWT Token:
  userId: test-user-123
  storeId: STORE-001
  storeName: 테스트 매장

Event:
  eventId: EVT-str_dev_test_001-20251030001311-70eea424
  objective: NEW_CUSTOMER
  storeName: Test Cafe
  storeCategory: CAFE
  status: DRAFT

Image Generation Job:
  jobId: JOB-IMG-1761750847428-b88d2f54
  eventId: EVT-str_dev_test_001-20251030001311-70eea424
  prompt: Modern cafe promotion event poster with coffee cup
  styles: [MODERN]
  platforms: [INSTAGRAM]
  status: PENDING

Kafka Message:
  topic: image-generation-job
  partition: 0
  offset: 0
  key: JOB-IMG-1761750847428-b88d2f54
```

---

## 7. 결론

### 주요 성과
1. **event-service Kafka 통합 검증 완료**
   - Producer: 메시지 발행 성공
   - Consumer: 메시지 수신 및 파싱 성공
   - Kafka 브로커 연결 안정

2. **Manual Acknowledgment 패턴 검증**
   - 메시지 처리 후 수동 커밋 정상 작동
   - 장애 시 메시지 재처리 방지 메커니즘 확인

3. **JSON Serialization/Deserialization 검증**
   - 메시지 직렬화/역직렬화 정상 작동
   - Type Header 사용하지 않는 방식 확인

### 다음 단계
1. content-service Kafka Consumer 구현 여부 결정
2. AI Service Kafka 통합 테스트
3. Analytics Service Kafka 통합 테스트
4. 전체 서비스 간 End-to-End 메시지 흐름 테스트

---

**테스트 담당자**: Backend Developer
**검토자**: System Architect
**승인일**: 2025-10-30
