
오늘 Flutter Seoul과 Flutter Incheon에서 주관하는 Future<Flutter> 컨퍼런스에 참여하기위해 인천 송도 컨벤시아를 방문했다. 컨퍼런스의 세션은 총 10개로 구성되어있었고, 모두 알찬 내용들로 구성되어있어 7시간이 넘는 시간동안 지루함을 느낄 틈이 없었다.
모든 세션을 포스트에 담기는 어려우니, 몇 가지 세션에서 내가 얻은 인사이트를 공유해보고자 한다. (얻은 인사이트는 추후 심도깊게 공부하여, 개별 포스트를 작성할 예정이다.)
해당 세션에서는 WebRTC 기술을 사용해 화상통화를 구현한 경험을 공유했다. 이야기에 앞서 WebRTC란 무엇일까?
WebRTC란 Web Real-Time Communication의 약자로, 웹 브라우저간 중간자 없이 실시간 미디어 스트리밍을 하기위한 표준 규격이다.
같은 공유기를 사용하는 것이 아닌 경우 P2P(Peer to Peer) 통신으로 클라이언트를 연결시켜야하는데 사이에 방화벽이 있거나, NAT환경에 있는 경우에는 P2P 통신이 불가하다. 이 때 STUN, TURN 서버를 사용해 사용자 기기의 외부 IP를 얻어오고, 시그널링하는 것으로 P2P 연결을 할 수 있다. 추가로 해당 프로젝트 개발 시 Flutter에서 WebSocket을 사용해 실시간으로 시그널링을 했다는 말씀도 들었다.
마무리를 하시며 화상통화가 연결되기 전 통화가 종료될 경우, 수신자쪽에 Push 알림을 전송해 통화 알람 및 진동이 울리지 않도록 처리했다는 예시와 함께 전혀 관련이 없어보이던 지식들이 연결되는 경험을 했다고 말씀하셨다.
이런 경험들이 개발자로 일하며 가장 짜릿한 경험이 아닐까라는 생각이들었다. (부럽다)
관련 키워드: RTCPeerConnection, ICE, TURN, STUN, MDN
개발자의 짜릿한 경험을 이야기했으면 가장 저릿한 경험도 같이 이야기해봐야하지 않을까?
주제만 봐도 가슴이 무거워지는 내용이다. 해당 세션에서는 개발환경에서는 재현이 안되고, 고객의 기기에서만 재현되는 문제를 겪은 사례와 재현 경로 확보 및 재발 방지를 한 경험을 공유해주셨다.
앱을 실행하자마자 꺼진다는 이슈를 보고 받은 뒤, 배포 시점의 커밋으로 돌아가 빌드 및 실행을 진행했다. 하지만 앱은 어떠한 문제도 없이 정상 동작하였으며, Firebase Crashtics, Datadog등에도 보고된 문제가 없었다.
모든 이슈는 iOS에서 보고되었고, 이에 Xcode에서 Console창을 열어 로그를 확인한 결과, 충돌이 발생하는 것을 확인했다.
충돌이 발생하지 않도록 해결 후 재배포를 진행했다.
하지만 이는 이슈와 관련되지 않은 별개의 이슈라, 결론적으로 이슈 해결은 되지 않았다.
장애 발생 고객들의 마지막 접속 기록을 활용해 특정 OS 버전의 문제인 것을 인지, 해당 버전의 기기에서 이슈를 재현해 크래시 로그를 확보했다.
로그를 분석해 Native에서 발생한 초기화 문제인 것을 확인하고 해당 초기화 기능의 의존성 제거 및 핫픽스 배포를 진행했다.
급한 불이 꺼진 후 다시 원점으로 돌아가 문제를 해결 후 재배포를 진행했다.
이 같은 경험을 하면서 초기화 단계 Native에서 발생한 이슈는 Flutter Engine이 정상적으로 초기화되기 이전 시점이기에 Flutter에서 작성한 모니터링 도구에 기록되지 않으니, 생각해보아야한다고 말씀해주셨다.
발표를 마무리하시며 이전에 Arm cpu 아키텍처의 공부가 crash log를 분석하는데 도움이 되었다고 하셨으며, 이를 통해 cs지식이 평소에는 도움이 되지 않는 것 같지만, 긴급한 상황에서 문제 해결 능력을 높히는데 큰 도움이 된다는 몸소 느낀 귀중한 경험을 공유해주셨다.
세션들에서 공통적으로 FFI를 사용해 다른 언어의 라이브러리를 사용한 경험을 많이 공유해주셨다. 아직까지 Flutter에서 기본적으로 지원하는 라이브러리가 부족한 것일까? 라는 생각이 들어 아쉽긴 하다. 어떻게 보면 아직 발전 가능성이 많은 프레임워크가 아닌가!라는 긍정적인 생각을 가져야겠다.
다음에도 이러한 컨퍼런스가 있으면 참여할 의향이 강하게 드는 하루였다. 그 자리에서 모든 것을 이해하지 못하더라도 새롭게 얻고 가는 인사이트의 가치가 매우 크게 느껴졌기 때문이다. 다시 한번 컨퍼런스를 주관해주신 Flutter Seoul과 Flutter Incheon 관계자 분들께 감사를 느끼며 포스트를 마무리하겠다.