회사에서 일일 업무를 끝낸 와중에 남은 시간을 뭐할까 고민하다 CS의 기본인 네트워크를 가볍게 복습하는 의미로 cloude 서버에서 동작 가능한 Command-Line Interface(CUI: 터미널) 기반의 간단한 채팅 프로그램을 개발하자 마음먹었다!
개발 전에 가장 먼저 고민한 질문은
“python 언어를 사용할 것인가? node js 기반으로 채팅 프로그램을 구현할 것인가?”
결론적으로 python 기반의 채팅 프로그램을 개발하기로 마음 먹었다. 거창한 이유는 아니지만 2가지 정도의 이유로 python을 선택했다.
💡 1. 직접 socket 프로그래밍을 할 수 있는가?
💡 2. Mulit Thread를 이용한 채팅 프로그램인가?
물론 실시간 채팅이라는 특성에서 node js도 훌륭한 방안이지만 node js는 단일 thread 기반의 런타임 환경으로 multi thread 프로그래밍과는 거리가 멀고 python과 같이 저수준의 socket 프로그래밍에는 제약이 있다고 판단해 python 선택!!
먼저 직접 코드를 짜기 전에 본 채팅 프로그램에서 어떤 기능이 필요한지 간략하게 아래와 같이 정리했다.
Python을 사용해 터미널 인터페이스를 이용한 채팅 프로그램을 계발할 예정이다. 채팅 프로그램을 구현하기 위해서는 아래와 같은 바탕 지식이 필요하다
1, 2, 3의 지식은 내가 어느 정도는 가지고 있다고 판단했지만 thread를 직접 구현해서 프로그래밍 해본 기억은 가물가물해 thread 공부가 먼저 필요하다고 생각했다.
→ 먼저 thread 기법을 적용하지 않은 채팅 프로그램을 구현 후 thread 모듈을 적용하자고 결정!
먼저 구현한 코드를 먼저 보기 앞서 지금까지 계속 서버,서버 클라이언트, 클라이언트라고 언급했는데 server가 뭔지? client가 뭔지? 채팅 프로그램의 server-client 구조에 대해서 짚고 넘어가자!
위키백과에서는 server-client model을 아래와 같이 정의했다.
클라이언트 서버 모델(client–server model)은 서비스 요청자인 클라이언트와 서비스 자원의 제공자인 서버 간에 작업을 분리해주는 분산 애플리케이션 구조이자 네트워크 아키텍처를 나타낸다.
음… 쉽게 말해서 서버는 사용자, 즉 클라이언트 측으로 서비스를 제공하는 컴퓨터를 의미하는데 서버는 사용자 간의 채팅 서비스도 포함된다.
클라이언트는 서버와 반대로 서비스를 요청하는 사용자를 의미한다.
서비스를 요청하면 보통 클라이언트끼리 직접적으로 연결되지 않고 서버에서 요청을 처리한 후에 각 클라이언트에게 알맞은 서비스를 제공하는 것이 보편적이다
💡 여러 클라이언트가 서버에 요청할 수 있으므로 서버 개발자는 항상 이를 고려해 서버의 부하를 최대한 줄일 수 있는 방향으로 개발해야 한다.소켓을 이용한 server-client 구조는 아래의 그림과 같다.
💡 채팅 프로그램에서 서버는 각 클라이언트 마다 할당된 소켓을 잘 관리하는 것이 핵심이라고 볼 수 있다!!