Skip to content

Socket.IO 연결 문제 해결 #63

@Tae4an

Description

@Tae4an

문제 정의

초기 증상: iPhone과 Apple Watch로 실제 테스트 중, Apple Watch 연결은 완벽히 작동하지만 realtime-service Socket.IO 연결이 지속적으로 타임아웃

flutter: ⛔ Socket.IO 연결 타임아웃
flutter: ❌ realtime-service 연결 실패

디버깅 과정

1단계: 로그 분석

  • Kong 로그: WebSocket 연결 성공 (HTTP 101 status) 확인됨
  • realtime-service 로그: Socket.IO 연결 시도가 전혀 나타나지 않음
  • Apple Watch: 완벽하게 작동 (연결, 메시지 송수신 모두 정상)

2단계: 핵심 오류 발견

realtime-service에서 치명적 오류 발견:

"소켓 인증 오류:" "Cannot read properties of undefined (reading 'connect')"

원인: logger.socketLogger.connect() 호출 시 socketLogger 객체가 undefined

3단계: Kong 설정 문제 발견

문제점: Kong에서 별도의 realtime-websocket-routesrealtime-api-routes로 분리되어 있어 Socket.IO 프로토콜 전환 방해

🔧 해결 과정

해결책 1: Logger 오류 수정

문제: logger.js에 socketLogger 객체 누락
해결: logger.js에 socketLogger 메서드 추가

socketLogger: {
  connect: (message) => logger.info(message),
  disconnect: (message) => logger.info(message),
  error: (message) => logger.error(message)
}

해결책 2: Kong 설정 통합 (핵심 해결책)

기존 문제: 별도 WebSocket 서비스로 인한 프로토콜 충돌

# 문제가 있던 기존 설정
realtime-service: (API 전용)
realtime-websocket-service: (WebSocket 전용) ← 문제 원인!

최종 해결: 단일 서비스로 통합

# 최종 해결된 설정
realtime-service:
  url: <http://realtime-service:3001>
  routes:
    - name: realtime-api-routes
      paths:
        - /api/v1/realtime
        - /socket.io  # ← Socket.IO 경로도 동일 서비스에서 처리
      protocols: ["http", "https"]
      request_buffering: false
      response_buffering: false

해결책 3: Kong 재시작으로 설정 적용

docker restart haptitalk-kong
docker restart haptitalk-realtime-service

✅ 최종 결과

성공 확인

외부 테스트 성공:

curl '<https://api.eumgyeol.com/socket.io/?EIO=4&transport=polling&sessionId=test>'
# 응답: {"sid":"xxx","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":20000}

iPhone 앱 연결 성공:

flutter: ✅ realtime-service 연결 성공
flutter: 💡 Socket.IO 연결 시도: <https://api.eumgyeol.com>
flutter: ✅ Socket.IO 연결 성공 (socketId: n4daYR1zTi-D6MyNAAAB)
flutter: ✅ Socket.IO 인증 성공: xotks7524@gmail.com
flutter: ✅ 실시간 분석 서비스 초기화 완료

realtime-service 로그 확인:

[Socket.IO](http://socket.io/) 연결 성공 (socketId: n4daYR1zTi-D6MyNAAAB)
Socket.IO 인증 성공: xotks7524@gmail.com
사용자가 'user-12037cb1-8939-49ec-92e3-b7e6d25513ef' 룸에 참가했습니다

핵심 학습 사항

Socket.IO 동작 원리

  • 정상 흐름: HTTP 폴링으로 시작 → WebSocket으로 업그레이드
  • 문제 원인: Kong의 별도 WebSocket 서비스가 이 업그레이드 과정을 방해

마이크로서비스 아키텍처에서의 교훈

  1. API Gateway 설정의 중요성: 프로토콜 전환이 필요한 서비스는 단일 경로로 처리
  2. 로그 모니터링: 각 서비스 계층별 로그 분석의 중요성
  3. 점진적 디버깅: 외부 → 내부 순으로 단계별 확인

최종 상태

  • iPhone: Socket.IO 연결 및 실시간 통신 완벽 작동
  • Apple Watch: 기존과 동일하게 완벽 작동
  • Kong Gateway: HTTP와 WebSocket을 단일 서비스에서 처리
  • realtime-service: Logger 오류 해결 및 안정적 운영

결론: Kong 설정 통합과 logger 수정으로 Socket.IO 연결 문제 완전 해결!

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions