프로젝트 목록으로
개발 시리즈

Socket Server

안드로이드 기기를 서버로 활용하여 통신 환경을 검증하는 서버 사이드 테스트 앱입니다. Socket Client와 함께 사용하면 완벽한 모바일 소켓 테스트 환경을 구축할 수 있습니다.

프로젝트 소개 및 개발 배경

Socket Server는 안드로이드 기기를 TCP 서버로 동작하게 하는 개발자 도구입니다. 클라이언트 앱이나 다른 장치에서 보낸 데이터를 수신하고, 응답을 전송할 수 있어 네트워크 통신의 서버 측면을 테스트하는 데 유용합니다.

Socket Client를 개발한 후, 사용자들로부터 서버 측 테스트 앱에 대한 요청이 많았습니다. 클라이언트만 있으면 테스트할 때 별도의 서버가 필요한데, PC가 없는 상황이나 이동 중에는 테스트하기 어려웠기 때문입니다. 특히 두 대의 안드로이드 기기만으로 완전한 소켓 통신 테스트 환경을 구축할 수 있다는 점이 많은 개발자들에게 매력적으로 다가갔습니다.

또한 넥스트페이먼츠에서 개발했던 FnB 솔루션의 Master-Slave 아키텍처를 구현하면서 서버 역할을 하는 기기의 동작을 테스트해야 했습니다. 이 경험을 바탕으로 실무에서 바로 활용할 수 있는 수준의 서버 기능을 갖춘 앱을 개발하게 되었습니다.

기술 스택 상세 설명

Socket Server는 안정적인 서버 운영을 위해 Android Service와 Coroutine을 핵심으로 사용합니다.

Kotlin ServerSocket Coroutine Flow Hilt MVVM Jetpack Compose

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와 함께 사용할 때 가장 큰 가치를 발휘합니다. 두 앱을 조합하면 다음과 같은 시나리오를 쉽게 테스트할 수 있습니다:

[기기 A: Socket Server] <==== TCP ====> [기기 B: Socket Client]
  • 프로토콜 개발: 새로운 통신 프로토콜을 설계할 때 두 앱을 사용하여 메시지 형식과 응답을 테스트할 수 있습니다.
  • 교육용: 네트워크 프로그래밍 학습 시 클라이언트-서버 모델을 직접 체험해 볼 수 있습니다.
  • 현장 테스트: PC 없이 두 대의 스마트폰만으로 네트워크 통신 테스트 환경을 구축할 수 있습니다.

지금 바로 사용해보세요

Google Play Store에서 무료로 다운로드할 수 있습니다.

Play Store에서 다운로드