소개
•
조명과 음향 장치가 달린 거울 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에 용의하도록 개선할 수 있을 것 같습니다.