1. 문제 상황
- 컨트롤러에서 귓속말을 보낼 때 recipientName → recipientId 변환을 위해 UserStateService.getUserIdByName()을 호출.
- 그러나 항상 null이 반환되어 "사용자를 찾을 수 없습니다" 에러 발생.
- 원인: UserStateService 내부의 userMap이 갱신되지 않음.
2. 원인 분석
- UserStateService는 updateActiveUsers(Map<String, Long> users) 메서드를 통해만 갱신됨.
- 하지만 ChatService에서는 /topic/public, /user/queue/whisper, /user/queue/history만 구독하고 있었음.
- 즉, 서버에서 내려주는 유저 목록(/topic/users)을 구독하지 않아 userMap이 비어있음.
3. 해결 방법
- 유저 목록 채널 구독 추가
networkService.subscribe("/topic/users", this::handleUserListMessage); - 유저 목록 핸들러 구현
private void handleUserListMessage(String json) { try { Map<String, Long> users = objectMapper.readValue( json, new TypeReference<Map<String, Long>>() {} ); userStateService.updateActiveUsers(users); // UserStateService 갱신 } catch (Exception e) { e.printStackTrace(); } } - UserStateService 갱신
- updateActiveUsers() 호출 시 activeUsers와 userMap이 최신 상태로 갱신됨.
- 이후 getUserIdByName()이 정상적으로 ID를 반환.
4. 결과
- /topic/users 구독을 추가한 뒤, 서버에서 내려주는 유저 목록이 UserStateService에 반영됨.
- getUserIdByName()이 올바른 ID를 반환하여 귓속말 기능 정상 동작.
- UI에서도 접속자 목록을 갱신할 수 있게 됨.
5. 교훈
- API 명세서를 반드시 확인하자
- 서버가 어떤 경로로 데이터를 내려주는지, 어떤 형식(JSON 구조)인지 정확히 파악해야 함.
- 클라이언트는 그 명세에 맞춰 구독/파싱/갱신 로직을 구현해야 정상적으로 동작.
- 데이터 흐름을 전체적으로 이해하자
- 단순히 함수만 작성하는 게 아니라, 서버 → 네트워크 → 서비스 → 컨트롤러 → 뷰까지 흐름을 따라가야 문제를 빨리 찾을 수 있음.
- 테스트 시나리오를 명확히 하자
- 귓속말 기능처럼 특정 데이터(ID 매핑)에 의존하는 기능은 반드시 실제 서버 응답을 받아 테스트해야 함.
'프로젝트' 카테고리의 다른 글
| 자프실 프로젝트 - 6 controller, 이벤트 흐름 (0) | 2025.12.06 |
|---|---|
| 자바프로젝트-5 클라이언트 시작! ChatService, userService (0) | 2025.12.06 |
| 자바 프로젝트-4 클라이언트 시작! stomp서버 연결하기 (0) | 2025.12.05 |
| 자프실 프로젝트-3 (0) | 2025.11.29 |
| 자프실 프로젝트-1 (0) | 2025.11.29 |