kt-event-marketing/develop/dev/test-backend.md
2025-10-27 14:42:03 +09:00

8.3 KiB
Raw Blame History

백엔드 테스트 결과서

테스트 개요

  • 테스트 일시: 2025-10-27 13:46
  • 대상 서비스: analytics-service
  • 서버 포트: 8086
  • 테스트 환경: 로컬 개발 환경

1. 서버 상태 확인

1.1 Health Check

요청:

curl -X GET "http://localhost:8086/actuator/health"

응답:

{
  "status": "UP",
  "components": {
    "db": {
      "status": "UP",
      "details": {
        "database": "PostgreSQL",
        "validationQuery": "isValid()"
      }
    },
    "redis": {
      "status": "UP",
      "details": {
        "version": "7.2.3"
      }
    },
    "diskSpace": {"status": "UP"},
    "livenessState": {"status": "UP"},
    "readinessState": {"status": "UP"}
  }
}

결과: 성공 - 서버 정상 작동, DB 및 Redis 연결 정상


2. API 테스트 결과

2.1 성과 대시보드 조회 API

엔드포인트: GET /api/v1/events/{eventId}/analytics

테스트 케이스:

curl -X GET "http://localhost:8086/api/v1/events/evt_2025012301/analytics"

응답:

{
  "success": false,
  "errorCode": "EVENT_001",
  "message": "이벤트를 찾을 수 없습니다",
  "timestamp": "2025-10-27T13:46:50.7331807"
}

결과: 실패 - EventStats 데이터 미생성

  • 원인: Kafka Consumer 미작동으로 EventCreated 이벤트 미처리
  • 근본 원인: Kafka 브로커 연결 실패

2.2 시간대별 참여 추이 API

엔드포인트: GET /api/v1/events/{eventId}/analytics/timeline

테스트 케이스:

curl -X GET "http://localhost:8086/api/v1/events/evt_2025012301/analytics/timeline?interval=daily"

응답:

{
  "success": true,
  "data": {
    "eventId": "evt_2025012301",
    "interval": "daily",
    "dataPoints": [
      {
        "timestamp": "2024-09-24T00:00:00",
        "participants": 36,
        "views": 108,
        "engagement": 36,
        "conversions": 24,
        "cumulativeParticipants": 36
      }
      // ... 150개 데이터 포인트
    ],
    "trends": {
      "overallTrend": "stable",
      "growthRate": 11.1,
      "projectedParticipants": 944,
      "peakPeriod": "2024-09-24"
    },
    "peakTimes": [
      {
        "timestamp": "2024-09-24T00:00:00",
        "metric": "participants",
        "value": 40,
        "description": "최대 참여자 수"
      },
      {
        "timestamp": "2024-09-27T00:00:00",
        "metric": "views",
        "value": 200,
        "description": "최대 조회수"
      }
    ]
  }
}

결과: 성공 - TimelineData 정상 조회

  • 데이터 포인트: 150개 (30일 × 5개 채널)
  • 기간: 2024-09-24 ~ 2024-10-23
  • 트렌드 분석: 정상 작동
  • Peak Time 분석: 정상 작동

2.3 채널별 성과 분석 API

엔드포인트: GET /api/v1/events/{eventId}/analytics/channels

테스트 케이스:

curl -X GET "http://localhost:8086/api/v1/events/evt_2025012301/analytics/channels"

응답:

{
  "success": true,
  "data": {
    "eventId": "evt_2025012301",
    "channels": [],
    "comparison": null,
    "lastUpdatedAt": "2025-10-27T13:46:55.9759532"
  }
}

결과: ⚠️ 부분 성공 - 응답은 정상이나 데이터 비어있음

  • 원인: ChannelStats 데이터 미생성
  • 근본 원인: Kafka Consumer 미작동으로 DistributionCompleted 이벤트 미처리

2.4 투자 대비 수익률 분석 API

엔드포인트: GET /api/v1/events/{eventId}/analytics/roi

테스트 케이스:

curl -X GET "http://localhost:8086/api/v1/events/evt_2025012301/analytics/roi"

응답:

{
  "success": false,
  "errorCode": "EVENT_001",
  "message": "이벤트를 찾을 수 없습니다",
  "timestamp": "2025-10-27T13:46:58.6552438"
}

결과: 실패 - EventStats 데이터 미생성

  • 원인: Kafka Consumer 미작동으로 EventCreated 이벤트 미처리

3. 문제 분석

3.1 Kafka 연결 실패

로그 확인:

2025-10-27 13:46:46 [kafka-producer-network-thread] INFO o.apache.kafka.clients.NetworkClient -
  [Producer clientId=analytics-service-producer-1] Node 101 disconnected.
2025-10-27 13:46:56 [kafka-producer-network-thread] INFO o.apache.kafka.clients.NetworkClient -
  [Producer clientId=analytics-service-producer-1] Node 100 disconnected.

문제점:

  1. Kafka 브로커(20.249.182.13:9095, 4.217.131.59:9095)에 연결 실패
  2. SampleDataLoader가 이벤트를 발행했지만 브로커에 도달하지 못함
  3. Kafka Consumer가 이벤트를 수신하지 못함

3.2 Consumer 설정 확인

파일: EventCreatedConsumer.java:23

@ConditionalOnProperty(name = "spring.kafka.enabled", havingValue = "true", matchIfMissing = false)

설정:

  • application.yml: spring.kafka.enabled: ${KAFKA_ENABLED:false}
  • 실행 프로파일: KAFKA_ENABLED=true

Consumer 토픽:

  • sample.event.created - EventCreatedConsumer
  • sample.distribution.completed - DistributionCompletedConsumer
  • sample.participant.registered - ParticipantRegisteredConsumer

3.3 데이터 생성 흐름

정상 흐름:

SampleDataLoader (시작 시)
  ↓ Kafka 이벤트 발행
  ├─ EventCreated (3개) → EventCreatedConsumer → EventStats 생성
  ├─ DistributionCompleted (3개) → DistributionCompletedConsumer → ChannelStats 생성
  ├─ ParticipantRegistered (180개) → ParticipantRegisteredConsumer → ChannelStats 업데이트
  └─ TimelineData 직접 생성 (90개)

실제 흐름:

SampleDataLoader (시작 시)
  ↓ Kafka 이벤트 발행 시도
  ├─ EventCreated → Kafka 연결 실패 → EventStats 미생성 ❌
  ├─ DistributionCompleted → Kafka 연결 실패 → ChannelStats 미생성 ❌
  ├─ ParticipantRegistered → Kafka 연결 실패 → 처리 안됨 ❌
  └─ TimelineData 직접 생성 (90개) ✅

4. 테스트 결과 요약

API 엔드포인트 상태 비고
Health Check /actuator/health 성공 DB, Redis 연결 정상
성과 대시보드 /api/v1/events/{eventId}/analytics 실패 EventStats 미생성
시간대별 추이 /api/v1/events/{eventId}/analytics/timeline 성공 150개 데이터 정상 조회
채널별 분석 /api/v1/events/{eventId}/analytics/channels ⚠️ 부분 빈 배열 반환
ROI 분석 /api/v1/events/{eventId}/analytics/roi 실패 EventStats 미생성

성공률: 1/4 (25%)

  • 완전 성공: Timeline API
  • 부분 성공: Channel API (응답 정상, 데이터 없음)
  • 실패: Dashboard API, ROI API

5. 개선 사항

5.1 즉시 조치 필요

  1. Kafka 브로커 연결 확인

    • 브로커 상태 확인: 20.249.182.13:9095, 4.217.131.59:9095
    • 네트워크 방화벽 규칙 확인
    • Kubernetes Service 확인: kubectl get svc -n kafka
  2. Kafka Consumer autoStartup 확인

    @KafkaListener(
        topics = "sample.event.created",
        groupId = "analytics-service",
        autoStartup = "true"  // 추가 확인
    )
    

5.2 대안 방안

Kafka 없이 테스트하는 방법:

  1. SampleDataLoader 수정하여 Kafka 없이 직접 Repository에 데이터 생성
  2. 또는 KAFKA_ENABLED=false 설정하고 REST API로 데이터 직접 등록

5.3 장기 개선

  1. Resilience 향상

    • Kafka 연결 실패 시 Retry 메커니즘 추가
    • Circuit Breaker 패턴 적용 (Resilience4j 이미 설정됨)
  2. 모니터링 강화

    • Kafka Consumer Lag 모니터링
    • 이벤트 처리 실패 알림
  3. 테스트 환경 구성

    • 로컬 테스트용 Embedded Kafka 설정
    • Docker Compose로 Kafka 로컬 환경 구성

6. 결론

6.1 현재 상태

  • 기본 기능: 정상 작동 (서버, DB, Redis 연결)
  • API 응답: 구조적으로 정상 (에러 처리 적절)
  • Timeline API: 완전 정상 작동
  • Kafka 의존 API: Kafka 연결 문제로 데이터 부재

6.2 권고 사항

  1. 단기: Kafka 브로커 연결 문제 해결 후 재테스트
  2. 중기: Kafka 없이도 테스트 가능한 대안 구현
  3. 장기: 이벤트 기반 아키텍처 안정성 개선

6.3 다음 단계

  1. Kafka 브로커 상태 확인 및 연결 복구
  2. Consumer 활성화 확인 및 이벤트 재처리
  3. 전체 API 재테스트 및 결과 검증