1:1 랜덤 화상채팅 앱 Haze의 핵심은 '실시간 매칭' 기능이었습니다.
초기 매칭 로직은 setInterval을 이용해 주기적으로 매칭 대기 풀(Waiting Pool)을 순회하며 조건에 맞는 두 명의 사용자를 찾아 연결하는 간단한 방식이었습니다.
하지만 이 구조는 테스트 과정에서 치명적인 동시성 문제를 드러냈습니다.
아주 짧은 시간차로 두 개의 매칭 로직이 동시에 실행될 경우, 한 명의 사용자가 두 명의 다른 상대와 동시에 매칭되는 '중복 매칭' 버그가 발생했습니다.
이는 서비스의 신뢰도를 떨어뜨리는 심각한 문제였습니다.

이 문제를 해결하기 위해, 명시적인 상태 머신을 도입하여 매칭 과정의 모든 단계를 원자적으로 관리하는 방식으로 로직을 전면 재설계했습니다.
먼저,Socket 객체에 status 프로퍼티를 추가하여 사용자의 상태를 더 세분화했습니다.
| 상태 | 설명 |
|---|---|
| idle | 매칭 대기 중이 아님 |
| waiting | 매칭 대기 풀에서 파트너를 기다리는 중 |
| pending | 파트너를 소개받아 수락/거절을 대기하는 상태 |
| matched | 매칭이 최종 확정되어 화상채팅 중인 상태 |

이처럼 각 필드의 데이터 조회 책임을 명확히 분리함으로써, 코드의 재사용성을 높이고 복잡한 비즈니스 로직을 깔끔하게 관리할 수 있었습니다.
또한, @UseGuards와 @CurrentUser 같은 NestJS의 기능을 활용하여 인증 로직을 선언적으로 처리했습니다.