문제 정의
초기 증상: 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-routes와 realtime-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' 룸에 참가했습니다
핵심 학습 사항
- 정상 흐름: HTTP 폴링으로 시작 → WebSocket으로 업그레이드
- 문제 원인: Kong의 별도 WebSocket 서비스가 이 업그레이드 과정을 방해
마이크로서비스 아키텍처에서의 교훈
- API Gateway 설정의 중요성: 프로토콜 전환이 필요한 서비스는 단일 경로로 처리
- 로그 모니터링: 각 서비스 계층별 로그 분석의 중요성
- 점진적 디버깅: 외부 → 내부 순으로 단계별 확인
최종 상태
- ✅ iPhone: Socket.IO 연결 및 실시간 통신 완벽 작동
- ✅ Apple Watch: 기존과 동일하게 완벽 작동
- ✅ Kong Gateway: HTTP와 WebSocket을 단일 서비스에서 처리
- ✅ realtime-service: Logger 오류 해결 및 안정적 운영
결론: Kong 설정 통합과 logger 수정으로 Socket.IO 연결 문제 완전 해결!
문제 정의
초기 증상: iPhone과 Apple Watch로 실제 테스트 중, Apple Watch 연결은 완벽히 작동하지만 realtime-service Socket.IO 연결이 지속적으로 타임아웃
디버깅 과정
1단계: 로그 분석
2단계: 핵심 오류 발견
realtime-service에서 치명적 오류 발견:
원인:
logger.socketLogger.connect()호출 시socketLogger객체가 undefined3단계: Kong 설정 문제 발견
문제점: Kong에서 별도의
realtime-websocket-routes와realtime-api-routes로 분리되어 있어 Socket.IO 프로토콜 전환 방해🔧 해결 과정
해결책 1: Logger 오류 수정
문제: logger.js에 socketLogger 객체 누락
해결: logger.js에 socketLogger 메서드 추가
해결책 2: Kong 설정 통합 (핵심 해결책)
기존 문제: 별도 WebSocket 서비스로 인한 프로토콜 충돌
최종 해결: 단일 서비스로 통합
해결책 3: Kong 재시작으로 설정 적용
✅ 최종 결과
성공 확인
외부 테스트 성공:
iPhone 앱 연결 성공:
realtime-service 로그 확인:
핵심 학습 사항
Socket.IO 동작 원리
마이크로서비스 아키텍처에서의 교훈
최종 상태
결론: Kong 설정 통합과 logger 수정으로 Socket.IO 연결 문제 완전 해결!