• [ 배경 ]
    • 오랜만에 개발 동아리 또는 회사가 아닌 개인 혼자서 토이프로젝트를 진행하고 싶은 욕구가 생겼다.
    • 단순히 개발하고 배포하는게 아닌 사업 & 마케팅을 공부하고 연관지어서 수익을 적게라도 내보고 싶었다.
    • 스파르타 코딩클럽 창이라는 곳에서 사업계획서를 어떻게 쓰면 좋을지에 대해 공부하였고 간략히 사업 계획서를 작성해보았다.
    • python anywhere라는 호스팅 서비스를 통해 채팅서버를 먼저 배포해보았다.

 


  • [ 과정 ]
    • 사업 기획서를 간략히 작성해보았다.

파이썬에서 제공해주는 Channels 라이브러리와 redis를 사용해서 동작하는 채팅 서버를 작성해보았다.
로컬에서는 정상작동을 한다. 로직을 간략히 말해보자면 아래와 같다.


1) Web socket, Redis를 사용하여 채널을 관리

2) Django 자체는 동기식이지만, Channels를 사용하면 연결과 소켓을 비동기 처리

3) 현재 버전인 Channels 2는 python3.5 이상에서만 동작한다.

4) ASGI( Async Server Gateway Interface )프로토콜은 WSGI와 잘 호환되도록 설계 되어있다.

레디스에는 참여자의 채팅방 정보, 참여 유저의 정보가 저장된다.


코드를 간략히 언급해보자면 asgi.py 에서 프로토콜 라우터를 설정하였고

import os

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application

import chat.routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookmark.config.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    # Just HTTP for now. (We can add other protocols later.)
    "websocket": AuthMiddlewareStack(
        URLRouter(
            chat.routing.websocket_urlpatterns
        )
    ),
})

routing.py 파일인 아래에서 ws/chat/<room_name> 이라는 uri 형식에 맞춰
채팅 메세지를 웹소켓을 통해 connection을 맺고 메세지를 송신하였다.

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
]

배포과정 또한 순탄치는 않았다. python anyware의 code 경로, static경로를 설정해주었고
배포서버의 콘솔에 접근하여 git의 코드를 가져와 python 각종 라이브러리들을 설치하는 과정에서 버전 이슈, 모듈 이슈등이 있었다. 해당 이슈들을 수정하였으나 


파이썬 anyware에서는 docker를 따로 지원해주지 않아 redis를 사용하지 못하는 이슈가 있었다..

그리하여, 다음시간에는 aws 또는 네이버 클라우드에 배포하여 해당 문제를 해보려고 한다.

 


  • [ 결과 ]
    • redis에 채널이라는 개념을 두어 pub/sub 하는 내용을 공부하였다.
    • webSocket의 양방향 비동기 통신에 대해 복습하였다.
    • 배포는 항상 어려운걸 몸소 다시 느꼈다. (feat, python anyware)
    • 배포 url: https://junshock5.pythonanywhere.com/bookmark/

  • [ 느낀점 ]
    • 수익을 목표로 하는 개발과 개발 지식을 목표로 하는 개발은 엄연히 다르다.
    • 가격 경쟁력이 좋은 호스팅 업체를 알아봐야겠다.
    • 자동배포의 필요성을 또 느꼈다.

+ Recent posts