• 카테고리

    질문 & 답변
  • 세부 분야

    웹 개발

  • 해결 여부

    미해결

웹소켓 통신과 비동기처리 개념에 관해 질문 드립니다~

23.12.20 12:16 작성 조회수 405

0

안녕하세요~

알차고 담백한 강의 만들어주셔서 감사합니다!

보는 사람까지 코딩이 참 쉽게 느껴지게 만드는 선생님의 코딩 실력이 너무 부럽네요~!

 

강의에서 다루는 내용과 관련된 개념과 조언을 구하고 싶은 부분에 관해 질문 좀 드릴게요.

먼저 개념 관련 질문부터 드릴게요. 강의를 따라가는 데는 전혀 문제가 없었지만 제가 비전공자이다 보니 아래와 같은 웹소켓과 비동기처리에 관한 기본적인 개념이 헷갈리더라고요.

  • 웹소켓으로 통신하면 애초에 병렬 처리가 이루어지는 게 맞나요? 여러 사람이 동시에 이 상황극 서비스를 이용해도 각 이용자와 ChatGPT 간의 대화는 독립적으로 진행되고, 그러니 모델로부터 답변을 받는 데 걸리는 시간도 일반적으로 ChatGPT 이용할 때와 같은 게 맞나요?

  • consumer에서 async def를 사용하는 경우는 해당 메소드 안에서 처리하는 작업 중에 동시 처리가 가능한 작업이 있을 때가 맞나요? 이 강의에서 consumer의 메소드를 def로 구성한 건 메소드 안에서 작업이 순차적으로 진행되기 때문에 굳이 async def를 사용할 필요가 없기 때문인 거죠?

 

이어서 제가 개인적으로 진행하고 있는 프로젝트 관련해서 조언 좀 부탁드릴게요.

개인 프로젝트로 주문봇 서비스를 만드는 중이고, 주문봇 페이지, 커뮤니티 페이지 등으로 구성된 홈페이지를 개발해서 실제 서비스 운영까지 목표로 삼고 있습니다.

  • 궁금한 점은, 가령 주문봇 애플리케이션, 리뷰 어플리케이션, 커뮤니티 어플리케이션 등으로 구성된 장고 프로젝트를 서로 다른 가게에서 독립적으로 사용할 수 있게 하려면 어떻게 해야 하나요? 제가 만들려는 서비스를 기반으로 각 가게에서 자신의 홈페이지를 운영하게 할 수 있는 방법으로는 무엇이 있는지 궁금합니다.

  • 제가 만들려는 서비스를 배포하고 운영하기 위해서 필요한 기술에 대해서도 알고 싶습니다. 장고와 리액트로 서비스를 구현하고 배포와 운영은 클라우드 서비스를 이용해야겠다 정도로만 생각하고 있는데, 필요한 기술 스택에 관한 큰 그림을 좀 더 명확하고 현실적으로 그리고 싶어 질문 드려 봅니다.

     

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요.

동시성(Concurrency)와 병렬성(Parallelism)의 개념이 있습니다. 동시성은 한 명의 요리사가 여러 요리를 한번에 요리하는 상황에 비유할 수 있습니다. 탕수육이 튀겨지는 동안에 짜장면 소스를 만들고 소스가 끓는 동안에 다른 요리 재료를 준비하죠. 한 번에 하나의 작업을 수행하지면 작업간 전환을 빠르게 함으로서 동시에 일어나는 것처럼 보여집니다. 병렬성은 여러 명의 조리사가 동시에 요리를 하는 상황에 비유할 수 있습니다. 각 요리사가 각자의 요리를 할 수도 있고, 한 요리를 나눠서 여러 명이 협력해서 요리를 할 수도 있겠죠.

파이썬에서 async 함수는 asyncio 라이브러리를 통해 동시성을 구현합니다. 이는 프로그램이 여러 작업을 더 효율적으로 처리할 수 있게 해주며, 특히 네트워크 요청이나 파일 입출력과 같은 IO 바운드 작업에서 유용합니다. async 함수는 프로그램이 한 작업이 블로킹 상태일 때 다른 작업으로 빠르게 전환할 수 있게 해주어, 여러 작업을 마치 동시에 실행되는 것처럼 관리할 수 있습니다.

장고를 비롯한 파이썬 웹 서버는 WSGI 방식이나 ASGI 방식으로 구동될 수 있습니다. ASGI 방식의 구동에서는 async 함수를 사용할 수 있습니다.

식당에서 한 명의 요리사가 여러 요리 간의 전환을 빠르게 하면서 동시에 요리하는 것처럼 처리하든, 여러 요리사가 동시에 요리를 하는 상황이든 이는 조리하는 방식일 뿐, 요리를 주문받는 프로세스와는 전혀 별개의 프로세스입니다.

이와 마찬가지로 웹클라이언트가 HTTP프로토콜로 요청을 보내든 WebSocket 프로토콜로 요청을 보내든 (요리를 주문받는 상황), 이는 서버에서 이 요청을 어떻게 처리하는 지와는 별개라는 거죠.

def로 구성한 것은 async 방식이 익숙하지 않으신 분들이 많기 때문에 그렇게 구성한 것일 뿐 입니다. async def로 구성하신 다고 해서 서버 응답 속도가 비약적으로 빨라지진 않습니다. 처리 방식만 바꾼 거죠.

ChatGPT 대화에서 OpenAI 서버로부터 응답을 기다리는 데에 대부분의 시간이 소요됩니다. 이는 OpenAI 서버에서 모든 응답을 다 받고 나서야 API 호출 함수가 반환되기 때문인데요. ChatGPT 서비스를 써보시면 한 글자씩 응답을 받아서 화면에 점진적으로 뿌려지고 있죠. ChatGPT 서비스도 한 글자씩 화면에 뿌리지 않고 한 번에 모아서 전체 응답을 다 받고 나서야 화면에 뿌리면 꽤나 느린 서비스로 느껴질 것입니다. UI를 어떻게 구성하느냐에 따라서 유저가 느끼는 인상이 다르게 되죠.

openai api 호출 시에 stream=True 인자를 지정하시면, openai 에서 응답이 조금씩 완성되는 대로 받아서 웹 클라이언트로 던져줄 수 있습니다. 그럼 ChatGPT 서비스처럼 구성하실 수 있게 되는 거죠. 그러면 서비스가 좀 더 빠르게 동작한다는 인상을 주실 수 있습니다.

--

프로젝트 관련해서 질문을 주신 부분은 질문이 너무 광범위하고 설계하기 나름이라서 어떻게 답변을 드려야할 지 모르겠습니다. 정답이 없거든요. 모든 서비스 개발을 처음부터 모든 것을 고려하고 개발하는 것은 불가능하구요.

"독립적" 이라는 표현도 러프해서 답변 드리기 어렵네요. 각 가게마다 그냥 URL만 할당해줄 수도 있고, 각 가게마다 서버를 분리할 수도 있겠구요. 각 가게마다 도메인을 다르게 줄 수도 있겠구요. 어떤 정책을 쓰느냐에 따라 인프라 비용이 급격하게 증가하고 관리 포인트도 많아집니다. // 네이버 블로그 서비스도 blog.naver.com/아이디 처럼 운영하잖아요. 이렇게 URL만 할당하는 방식으로 접근하셔도 충분합니다.

하나의 장고 프로젝트로 시작해서 개발을 이어나가시보길 추천드리고, 장고 중심으로 개발하시면서 복잡한 UI 처리가 필요한 부분은 선택적으로 리액트를 접목해보시기를 추천드립니다.

서비스 배포에 대해서도 처음부터 너무 고민하지 마시구요. 클라우드 인프라 기술을 반드시 사용해야하는 것도 아닙니다. 클라우드 인프라 기술이 모든 것을 해결해주는 것도 아니구요. 서비스는 리눅스 서버 하나에서 시작하셔도 됩니다. 데이터베이스도 그 서버 하나에 설치하셔서 사용하시면 됩니다. 이 부분도 구성하기 나름이라 어떻게 설명을 더 드려야할지 막막하네요. ㅎㅎ.

리눅슥에 익숙해지기 위해서, 쓰시는 노트북의 윈도우를 날리시고 리눅스를 설치해서 메인 OS로 리눅스를 쓰시는 것도 좋은 방법입니다. 윈도우가 가끔 필요한 상황에서는 리눅스에서 VirtualBox로 윈도우 띄워서 가끔 처리해주구요. :-)


주신 질문에 대해서 하나 하나 설명하자면 책을 하나 써도 모자랄텐데요. 좀 더 디테일하게 질문의 포인트를 찝어서 정리해서 질문주시면 보다 좋은 답변을 드릴 수 있을 듯 합니다.


살펴보시고 댓글 남겨주세요.

화이팅입니다.

ktsfrank님의 프로필

ktsfrank

질문자

2023.12.22

이렇게 답변주시면 시간이 꽤나 들 텐데도 정성스레 답변해 주셔서 너무 감사드립니다~!

쉬운 비유와 설명 덕분에 제가 궁금했던 부분의 핵심에 대한 감을 좀 잡은 듯 합니다. bb

 

말씀하신 것처럼 제가 너무 광범위한 질문을 드렸지만, 선생님이 굵직하게 몇 가지를 구체적으로 언급해주셔서 제가 원하던 큰 그림을 그리고 방향 설정하는 데 실마리를 얻었네요. 프로젝트를 진행하며 생긴 질문들부터 어떻게 코딩 역량을 기르셨는지까지 여쭤보고 싶은 게 너무 많은데, 페북 사랑방 with Django/React에 자주 들리시는 듯하니 거기서 차차 질문 드리겠습니다~

 

비전공자로 혼자 공부하면서 막막할 때가 많기에 이렇게 친절한 답변과 궁금한 게 있으면 물어보시라는 말씀은 너무 감사하고 든든하네요. 감사합니다! :)