Search

IoT 기기와의 실시간 상호작용 서버 개발 (KIRA)

회사
JSolution
참여 포지션
SpringBoot 백엔드 개발자
진행기간
2022.11 ~

소개

조명과 음향 장치가 달린 거울 IoT 장치를 컨트롤하는 솔루션입니다.
안드로이드 앱, 백엔드, 거울 IoT 기기, 사람 감지 IoT 기기, OAuth용 웹으로 구성되었습니다.

시연 영상

사용 기술

Kotin, SpringBoot, Websocket, MariaDB

진행 업무

기기 동기화 로직 비동기로 전환

아키텍처를 설계할 때 기기 데이터를 수정하는 API가 호출될 때 기기 동기화를 하는 로직이 사용되어야 하나, 동기로 할 경우 의존성이 집약되는 문제가 있습니다.
Spring의 Application Event와 Event Listener로 Event Driven 아키텍처를 구성하였습니다.
기기 데이터가 변동되는 곳에서 동기화 이벤트를 publish하고, listener가 이벤트를 수신하면 동기화하도록 개발하였습니다.
이로써, 의존관계가 보다 깔끔하게 구성되어 이후 유지보수할 때 전반적으로 이해하기 쉬운 코드가 되었습니다.

다중 기기 연동 기능 구현

거울 기기 두 개 이상이 번갈아 가면서 소리 혹은 빛이 나오는 기능을 구현해야 했습니다.
기기가 소리 혹은 빛을 출력하는 한 사이클이 끝날 때마다 서버에 알리고, 정해진 사이클 횟수에 도달하면 기존 기기는 정지 이벤트를, 다음 차례의 기기엔 동작 이벤트를 전송합니다.
기기는 동작 이벤트 수신 시 배정된 역할(소리 혹은 빛)에 따라 출력하고, 정지 이벤트 수신 시 모든 기능을 멈춥니다.
위 로직으로 기능 구현 완료했습니다.

사운드 파일 재인코딩 구현

거울 기기에 사운드 파일 업로드시 기기에서 재생이 안 되는 이슈가 발생했습니다.
사운드 채널이 모노여야하고, 고음질에 경우 재생이 원활하게 되지 않는 등 기기의 성능적 제약이 많았습니다.
ffmpeg을 이용해서 bit rate와 sample rate, 코덱을 지정하여 재인코딩한 사운드를 업로드하도록 변경했습니다.
사운드 업로드 API는 위 로직을 사용함으로써 높은 리소스 자원이 필요했기에 메인 API 서버와 분리하여 별도의 컨테이너로 구성하고, 사용량에 따라 컨테이너의 개수를 조정하였습니다.
이로써 대부분의 사운드 파일을 재생할 수 있게 되었습니다.

구글 홈 배포

iOS와 음성제어 등 다양한 플랫폼에서 기기 컨트롤이 가능했으면 좋겠다는 요구사항이 들어왔습니다.
최소한의 변경 사항으로 최대한 많은 플랫폼에 대응할 수 있는 구금 홈 배포를 채택했습니다.
등록 방식 중 ‘Works with Google Home’을 사용했습니다.
OAuth용 웹을 추가로 구성하고, 서버와 함께 OAuth Server를 구성했습니다.
기존 기기 동기화 기능에 구글 웹훅 로직을 추가하였습니다.
구글홈에서 기기를 컨트롤하는 기능은 기존 앱과 동일하게 API를 사용하였습니다.
구글 측과 기능 테스트 절차도 완료했고, 서류 절차만 완료되면 이후 구글 홈 배포에 반영될 예정입니다.

회고

다중 기기 연동 기능에서 정해진 동작을 마친 기기가 정지 이벤트 수신 딜레이로 인한 추가 동작이 발생합니다.
기기가 동작을 끝나는 조건을 기기에서도 가져서 정지 이벤트 수신 전에 동작이 멈추도록 보강해야 할 것 같습니다.
현재 구조는 웹소켓에 대한 별도의 어댑터가 없어 하나의 컨테이너만 구동 가능합니다.
웹소켓용 어댑터를 Redis로 구성하여 scale-out에 용의하도록 개선할 수 있을 것 같습니다.