Socket Server
안드로이드 기기를 서버로 활용하여 통신 환경을 검증하는 서버 사이드 테스트 앱입니다. Socket Client와 함께 사용하면 완벽한 모바일 소켓 테스트 환경을 구축할 수 있습니다.
프로젝트 소개 및 개발 배경
Socket Server는 안드로이드 기기를 TCP 서버로 동작하게 하는 개발자 도구입니다. 클라이언트 앱이나 다른 장치에서 보낸 데이터를 수신하고, 응답을 전송할 수 있어 네트워크 통신의 서버 측면을 테스트하는 데 유용합니다.
Socket Client를 개발한 후, 사용자들로부터 서버 측 테스트 앱에 대한 요청이 많았습니다. 클라이언트만 있으면 테스트할 때 별도의 서버가 필요한데, PC가 없는 상황이나 이동 중에는 테스트하기 어려웠기 때문입니다. 특히 두 대의 안드로이드 기기만으로 완전한 소켓 통신 테스트 환경을 구축할 수 있다는 점이 많은 개발자들에게 매력적으로 다가갔습니다.
또한 넥스트페이먼츠에서 개발했던 FnB 솔루션의 Master-Slave 아키텍처를 구현하면서 서버 역할을 하는 기기의 동작을 테스트해야 했습니다. 이 경험을 바탕으로 실무에서 바로 활용할 수 있는 수준의 서버 기능을 갖춘 앱을 개발하게 되었습니다.
기술 스택 상세 설명
Socket Server는 안정적인 서버 운영을 위해 Android Service와 Coroutine을 핵심으로 사용합니다.
ServerSocket & Coroutine: Java의 ServerSocket API를 Coroutine으로 래핑하여 비동기적으로 클라이언트 연결을 수락합니다. 각 클라이언트 연결은 별도의 코루틴에서 처리되어 다중 클라이언트 접속을 효율적으로 관리합니다.
Flow를 활용한 이벤트 스트림: 클라이언트 연결/해제 이벤트, 수신 데이터, 에러 발생 등 모든 이벤트를 Flow로 스트리밍합니다. UI에서는 collectAsState를 통해 실시간으로 서버 상태를 반영합니다.
다중 클라이언트 관리: ConcurrentHashMap을 사용하여 연결된 클라이언트들을 관리합니다. 각 클라이언트에 고유 ID를 부여하여 특정 클라이언트에만 응답을 보내거나, 모든 클라이언트에 브로드캐스트하는 기능을 제공합니다.
주요 기능
- TCP 서버: 지정된 포트에서 TCP 연결을 수락하고 다중 클라이언트와 동시에 통신할 수 있습니다. 각 클라이언트와의 연결 상태를 개별적으로 관리합니다.
- 클라이언트 관리: 현재 연결된 모든 클라이언트 목록을 확인하고, 개별 클라이언트의 연결을 종료하거나 메시지를 전송할 수 있습니다.
- 브로드캐스트: 연결된 모든 클라이언트에 동시에 메시지를 전송하는 브로드캐스트 기능을 제공합니다.
- 네트워크 정보: 기기의 IP 주소, 활성 네트워크 인터페이스 등을 표시하여 클라이언트에서 연결할 주소를 쉽게 확인할 수 있습니다.
개발 과정의 도전과 해결
서버 앱을 개발하면서 가장 큰 도전은 Android의 생명주기와 백그라운드 제한 정책이었습니다. Android는 배터리 절약을 위해 백그라운드 앱의 활동을 제한하는데, 서버는 지속적으로 연결을 수락해야 하므로 이를 우회해야 했습니다.
다중 클라이언트 처리도 까다로운 부분이었습니다. 각 클라이언트 연결은 별도의 스레드/코루틴에서 처리되어야 하며, 공유 자원에 대한 동시 접근 문제를 해결해야 했습니다. ConcurrentHashMap과 Mutex를 사용하여 스레드 안전성을 보장하고, 각 클라이언트 코루틴이 취소될 때 연결이 제대로 정리되도록 구현했습니다.
네트워크 권한과 방화벽도 고려해야 할 사항이었습니다. 일부 네트워크 환경에서는 특정 포트가 막혀 있을 수 있어, 사용자가 포트를 자유롭게 변경할 수 있도록 했습니다. 또한 포트 충돌 감지 기능을 추가하여 이미 사용 중인 포트를 선택했을 때 적절한 안내를 제공합니다.
Socket Client와의 시너지
Socket Server는 Socket Client와 함께 사용할 때 가장 큰 가치를 발휘합니다. 두 앱을 조합하면 다음과 같은 시나리오를 쉽게 테스트할 수 있습니다:
- 프로토콜 개발: 새로운 통신 프로토콜을 설계할 때 두 앱을 사용하여 메시지 형식과 응답을 테스트할 수 있습니다.
- 교육용: 네트워크 프로그래밍 학습 시 클라이언트-서버 모델을 직접 체험해 볼 수 있습니다.
- 현장 테스트: PC 없이 두 대의 스마트폰만으로 네트워크 통신 테스트 환경을 구축할 수 있습니다.