요약
역할
- Python, Asyncio, Aiohttp, Redis, jQuery, Docker를 이용하여 실시간 채팅 앱을 개발
- Aiohttp와 WebSocket을 이용하여 실시간 채팅 구현
- Redis Pub/Sub 기능을 활용하여 메세지 브로드캐스트 구현
- Docker compose를 통해 Python과 Redis를 빌드
성과
시기
어려움 및 해결책
- 실시간 채팅을 구현하기 위해 WebSocket과 SSE(Server Sent Events) 방식 중 WebSocket을 선택했습니다. Django Channels를 사용하여 WebSocket 채팅 서버를 만들어 봤기 때문입니다. Django Channels를 사용했을 때는 내부 라이브러리를 이용하여 간편하게 메시지를 broadcast 할 수 있었지만, Aiohttp는 그런 모듈이 없기 때문에 직접 구현해야 했습니다. 요구사항에 Redis를 사용하라는 말이 있었지만 처음에는 왜 Redis를 사용해야 하는지 이해하지 못했습니다. WebSocket만을 이용해도 충분히 요구사항을 구현할 수 있는 것 같다고 CTO님에게 질문했습니다. 싱글 프로세스일 경우 aiohttp.WebApplication object의 dictionary에 상태를 저장하면 상태 관리를 할 수 있지만, 멀티 프로세스일 경우 WebApplication object는 프로세스끼리 공유할 수 없기 때문에 전역 상태를 관리할 수 없다는 답변을 주셨습니다. 따라서 전역 상태를 관리할 수 있는 저장소가 따로 존재해야 합니다. 이 저장소를 Redis로 사용하는 것입니다.
- Redis를 통해 메시지를 broadcast 하기 위해 Redis Pub/Sub을 이용했습니다. Pub/Sub은 메시지를 저장하지 않고 그대로 전달하는 플랫폼 역할을 합니다. 메시지를 따로 저장하는 요구사항이 없었으므로 Redis Pub/Sub을 이용했습니다. 또한, Redis Pub/Sub 과정을 asyncio.create_task()를 통해 task로 등록하여 event loop에 의해 동작하도록 했습니다.
코드 리뷰
CTO님과 사수님에게 제작한 웹 채팅 앱에 대해 발표하고 코드 리뷰를 받았습니다. 코드 동작은 요구 사항에 맞게 잘 되었는데 함수의 책임 분리, Error raise의 타입, async with context에 대해서 코멘트를 남겨주셨습니다. 따라서 다음과 같이 코드를 수정했습니다.