문제 상황
- 앱 초기 실행 시 WebSocket 연결 문제: Google Cloud Run에 배포된 서버가 꺼진 상태에서는 WebSocket connect 이벤트가 동작하지 않음.
- SID 미수신: 앱에서 WebSocket으로 SID를 받아야 하는데, 서버가 꺼져 있으면 이를 받을 수 없어 정상적인 동작이 불가능.
- 사용자 경험 문제: 서버가 꺼진 상태에서 첫 사용자는 어플을 다시 껐다 켜야 SID를 받을 수 있음.
해결 방법
- 앱 초기 진입점에서 서버 상태 확인
- 앱 시작 시 HTTP 요청으로 Google Cloud Run 서버의 /health 엔드포인트에 상태 확인 요청을 보냄.
- 서버가 꺼져 있다면, 이 요청을 통해 서버가 자동으로 시작됨(Google Cloud Run은 첫 요청 시 컨테이너를 활성화).
- Splash Screen 유지
- 서버 상태가 OK 응답을 반환할 때까지 Splash Screen을 유지.
- 서버 준비 완료 후, WebSocket 연결을 시도하여 SID를 받고 다음 화면으로 이동.
- 로직 통합
- HTTP로 서버 활성화 확인 + WebSocket 연결 상태를 통합하여 앱 준비 상태 관리.
- 서버가 준비되기 전에 WebSocket 이벤트가 실패하지 않도록 순서를 조정.
구현 결과
- 앱 실행 시 HTTP로 서버의 /health 엔드포인트 호출.
- 서버 준비 완료 후 WebSocket connect 이벤트 동작.
- WebSocket 연결 성공 시 SID를 정상적으로 수신.
- Splash Screen이 사라지고 로그인 화면으로 이동.
- 테스트 결과 첫 사용자도 정상적으로 동작.
요약 코드
useEffect(() => {
// 서버 활성화 확인 로직
const checkServer = async () => {
for (let attempt = 1; attempt <= 5; attempt++) {
try {
console.log(`Checking server (Attempt ${attempt}/5)`);
const response = await fetch(`${FLASK_SERVER_URL}/health`);
if (response.ok) {
setIsServerReady(true); // 서버 준비 완료
return;
}
} catch (error) {
console.error(`Failed attempt ${attempt}:`, error);
}
if (attempt < 5) await new Promise(resolve => setTimeout(resolve, 2000)); // 재시도 딜레이
}
console.error('Server not available after retries');
};
checkServer();
}, [FLASK_SERVER_URL]);
useEffect(() => {
// 앱 준비 상태 확인
if (isServerReady && isSocketConnected) {
setIsAppReady(true);
}
}, [isServerReady, isSocketConnected]);
최종 결과
- 첫 사용자도 앱 실행 시 Splash Screen에서 서버 상태를 확인한 후 정상 동작.
- WebSocket 연결 및 SID 수신이 안정적으로 이루어짐.
- 앱 초기 로딩 경험이 개선됨.
'플러팅 AI > React-native' 카테고리의 다른 글
| android만 설계해서 빌드완료한 코드 IOS 빌드 전 체크하기 (1) | 2024.12.14 |
|---|---|
| 오늘 작업 내용 정리(Play store Console,헤더추가,크레딧 로직,플러팅멘트 제한로직) (0) | 2024.12.09 |
| 네이티브 스플래시와 커스텀 스플래시를 함께 사용할 때 발생한 문제와 해결 방안 (0) | 2024.12.02 |
| 민감한 API Key를 APK에 포함시키지 않고 Firebase Remote Config로 관리하기 (React Native) (1) | 2024.11.30 |
| React Native에서 AsyncStorage 문제 해결하기: 이미지 썸네일 로딩 실패 현상 (1) | 2024.11.24 |