Socket Client
TCP 소켓 통신을 모바일에서 간편하게 테스트하고 학습할 수 있는 개발자 도구입니다. 현장에서 네트워크 통신을 빠르게 검증해야 할 때 유용하게 활용할 수 있습니다.
프로젝트 소개 및 개발 배경
Socket Client는 안드로이드 기기에서 TCP 및 UDP 소켓 통신을 테스트할 수 있는 개발자 도구입니다. IoT 장비, 서버, 또는 다른 네트워크 장치와의 통신을 현장에서 바로 검증할 수 있어 개발 및 디버깅 시간을 크게 단축시켜 줍니다.
이 앱을 개발하게 된 직접적인 계기는 넥스트페이먼츠에서 FnB 솔루션을 개발하면서였습니다. POS, 키오스크, 테이블 오더 기기 간의 내부망 소켓 통신을 구현해야 했는데, 통신 프로토콜을 테스트하고 디버깅하는 과정이 상당히 번거로웠습니다. 기존에는 PC에서 전용 소프트웨어를 사용해야 했지만, 현장에서 빠르게 테스트하려면 모바일에서 직접 소켓 통신을 확인할 수 있는 도구가 필요했습니다.
또한 소켓 프로그래밍을 학습하는 개발자들에게도 유용한 도구가 될 것이라 생각했습니다. 실제로 TCP와 UDP의 차이점, 연결 수립 과정, 데이터 전송 방식 등을 직접 체험하면서 배울 수 있는 교육용 도구로서의 가치도 고려했습니다.
기술 스택 상세 설명
Socket Client는 안정적인 네트워크 통신과 효율적인 비동기 처리를 위해 검증된 기술 스택을 사용하여 개발되었습니다.
Java Socket API & Kotlin Coroutine: Java의 Socket 및 DatagramSocket API를 Kotlin Coroutine으로 래핑하여 비동기 네트워크 통신을 구현했습니다. withContext(Dispatchers.IO)를 사용하여 네트워크 작업이 메인 스레드를 블로킹하지 않도록 했습니다.
Flow를 활용한 실시간 데이터 스트림: 서버로부터 수신되는 데이터를 Flow로 처리하여 실시간으로 UI에 반영합니다. 연결 상태, 수신 데이터, 에러 메시지 등을 StateFlow와 SharedFlow로 관리하여 UI가 항상 최신 상태를 유지합니다.
Hilt를 통한 의존성 주입: 소켓 연결 관리, 데이터 저장소 등의 컴포넌트를 Hilt로 주입하여 테스트 용이성과 코드 재사용성을 높였습니다. 특히 SocketManager 클래스를 싱글톤으로 관리하여 앱 전체에서 일관된 연결 상태를 유지합니다.
주요 기능
- TCP 클라이언트: TCP 프로토콜을 사용하여 서버에 연결하고 데이터를 송수신합니다. 연결 상태를 실시간으로 모니터링하며, 연결 끊김 시 자동 재연결 옵션을 제공합니다.
- 통신 로그: 송수신된 모든 데이터가 타임스탬프와 함께 기록됩니다. 채팅 기록처럼 스크롤로 확인 가능합니다.
개발 과정의 도전과 해결
소켓 통신 앱을 개발하면서 가장 큰 도전은 안정적인 연결 관리였습니다. 네트워크 환경은 항상 불안정할 수 있으며, 연결 끊김, 타임아웃, 데이터 손실 등 다양한 예외 상황을 처리해야 했습니다.
이를 해결하기 위해 연결 상태를 명확하게 정의하고 상태 머신 패턴을 적용했습니다. Disconnected, Connecting, Connected, Disconnecting 네 가지 상태를 정의하고, 각 상태에서 가능한 전환을 명확히 규정했습니다. 이렇게 함으로써 예상치 못한 연결 끊김이 발생해도 앱이 일관된 동작을 보장합니다.
또 다른 도전은 다양한 데이터 형식을 처리하는 것이었습니다. 특히 바이너리 데이터와 텍스트 데이터를 구분하고, HEX 형식의 데이터를 사람이 읽을 수 있는 형태로 변환하는 기능이 필요했습니다. 이를 위해 데이터 형식을 자동 감지하고 적절한 형식으로 표시하는 로직을 구현했습니다.
백그라운드에서의 연결 유지도 까다로운 부분이었습니다. 안드로이드의 배터리 최적화 정책으로 인해 앱이 백그라운드로 전환되면 소켓 연결이 끊어질 수 있습니다. Foreground Service를 활용하여 사용자가 원하면 백그라운드에서도 연결을 유지할 수 있도록 구현했습니다.
실제 활용 사례
Socket Client는 실제 개발 현장에서 다양하게 활용되고 있습니다:
- 서버 개발: 서버 개발자가 API 테스트 전 소켓 레벨의 통신을 검증하는 데 사용합니다.
- 임베디드 개발: 아두이노, 라즈베리파이 등과의 시리얼-이더넷 브릿지 테스트에 유용합니다.