- 여러 클라이언트 접속 구조2026년 06월 23일
- 소쩍소쩍이
- 작성자
- 2026.06.23.:29
다중 클라이언트 처리 구조
지금까지는 accept() 이후 서버가 바로 while True 반복문에 들어가 클라이언트와 메시지를 주고받았다.
이 구조에서는 클라이언트 A와 대화하는 동안 다시 accept()로 돌아오지 않기 때문에 다른 클라이언트는 계속 대기해야 한다.
항목 현재 구조 앞으로 만들 구조 접속 가능 인원 1명 여러 명 처리 방식 순차 처리 동시 처리 클라이언트 목록 없음 clients 리스트 스레드 사용 없음 클라이언트마다 1개 전체 채팅 구현 어려움 가능 핵심
기존 구조는 한 명의 클라이언트와 대화하는 동안 다른 클라이언트를 받을 수 없다.
여러 명을 동시에 처리하려면 접속자 목록과 스레드 구조가 필요하다.접속자를 기억하는 구조 - clients 리스트
여러 명을 처리하려면 먼저 접속한 클라이언트들을 기억해야 한다. 가장 단순한 방법은 clients 리스트를 사용하는 것이다.
다만 목록만 만든다고 해서 동시 처리가 되는 것은 아니다. 각 클라이언트를 동시에 처리하려면 별도의 처리 흐름이 추가로 필요하다.
독립적인 처리 흐름 - 스레드
스레드는 하나의 프로그램 안에서 여러 작업 흐름을 만들 수 있게 해 주는 방법이다.
스레드를 사용하면 클라이언트마다 독립적인 처리 흐름을 만들 수 있다.
서버 메인 흐름은 새 접속을 받는 일에만 집중하고, 각 클라이언트의 메시지 처리는 해당 클라이언트 전용 스레드에 맡기는 구조이다.
clients 목록과 스레드의 역할 구분
clients 목록은 접속한 클라이언트를 기억하는 역할이고, 스레드는 각 클라이언트를 독립적으로 처리하는 역할이다.
구분 clients 목록 스레드 역할 접속한 클라이언트를 기억 각 클라이언트를 독립적으로 처리 없으면 누가 접속해 있는지 알 수 없음 한 번에 하나의 클라이언트만 처리 가능 이후 쓰임 브로드캐스팅 시 전체 목록 순회 각 클라이언트 전담 메시지 처리 정리하면
clients 목록은 기억하는 역할,
스레드는 처리하는 역할이다.카페 카운터로 비유하기
기존 구조는 직원 한 명이 손님 A의 주문을 받고, 음료를 만들고, 건네준 뒤에야 손님 B를 상대하는 카운터와 비슷하다.
이 경우 B와 C는 A의 처리가 끝날 때까지 기다려야 한다.
앞으로 만들 구조는 손님이 접속할 때마다 전용 직원, 즉 스레드를 배정받는 카페와 비슷하다. A, B, C 각각에게 전용 직원이 붙기 때문에 동시에 서비스를 받을 수 있다.
카페 비유 카페에서의 역할 서버에서의 역할 카운터 관리자 새 손님을 계속 맞이함 서버 메인 흐름 — 새 클라이언트 접속을 계속 받음 손님 전용 직원 특정 손님 주문만 전담 클라이언트 처리 스레드 — 특정 클라이언트 메시지를 처리 손님 대기표 목록 현재 카페에 있는 손님을 기억 clients 리스트 — 현재 접속한 클라이언트 목록 손님이 자리 떠남 대기표 목록에서 제거 클라이언트 연결 종료 → 목록에서 제거 실제 서비스에서의 예
실제 서비스에서도 여러 사용자의 요청을 동시에 처리하기 위해 비슷한 구조를 사용한다.
서비스 내부에서 일어나는 일 카카오톡 서버 수백만 명이 동시에 접속해도 각자의 메시지를 독립적인 처리 흐름으로 분리해 처리 온라인 게임 서버 플레이어마다 독립적인 처리 흐름으로 위치·상태를 관리하고 다른 플레이어에게 전달 웹 서버 (Nginx 등) 방문자 요청이 들어올 때마다 독립 처리 흐름을 할당해 동시에 응답 의사코드로 흐름 비교하기
현재 구조
# 현재 구조 의사코드 서버_소켓_생성() 주소_묶기() 접속_대기() 클라이언트_A = 접속_받기() # accept() 한 번 — 이 아래로 내려오지 않음 while True: # A와의 대화 반복문에 갇힘 A의_메시지_받기() 서버_답장_보내기()현재는 accept()가 반복문 밖에 있어 A와 대화를 시작한 뒤로 다시 accept()로 돌아오지 않는다.
B가 접속하려 해도 서버 코드가 recv()를 기다리는 중이라 B의 접속 신호를 받아줄 위치가 없다.
다중 접속 서버 구조
# 다중 접속 서버 의사코드 clients = [] # 접속자 목록 서버_소켓_생성() 주소_묶기() 접속_대기() while True: # accept()가 반복됨 새_클라이언트 = 접속_받기() # 계속 새 접속을 받음 clients에_추가(새_클라이언트) 새_클라이언트_전용_처리_흐름_시작(새_클라이언트) # 스레드로 분리서버의 while True는 이제 특정 클라이언트의 메시지 처리에 묶이지 않는다. 새 접속을 계속 받는 역할만 하고, 클라이언트 처리는 전용 스레드 함수로 넘어간다.
클라이언트 송수신 처리
# 클라이언트 전용 처리 흐름 (스레드 함수) def 클라이언트_처리(client_socket): while True: 메시지_받기() 필요한_대상에게_전달하기()이렇게 역할이 분리된다.
서버 메인 흐름 → 새 접속을 받는 역할
각 클라이언트 처리 흐름 → 메시지를 주고받는 역할① 새 클라이언트 접속 받기 (accept())
↓
② 접속한 클라이언트를 목록(clients)에 추가하기
↓
③ 그 클라이언트 전용 처리 흐름(스레드) 시작하기
↓
④ 다시 ①로 돌아가 다음 접속 기다리기정리
기존 서버 구조는 한 명의 클라이언트와 대화하는 동안 다른 클라이언트를 받을 수 없었다.
여러 클라이언트를 처리하려면 접속자를 기억하는 clients 리스트와, 각 클라이언트를 독립적으로 처리할 스레드가 필요하다.
서버 메인 흐름은 accept()로 새 접속을 계속 받고, 각 클라이언트의 메시지 처리는 전용 스레드가 담당하는 구조로 바꾸면 다중 접속 서버를 만들 수 있다.'Server - Client' 카테고리의 다른 글
스레드로 클라이언트 처리 (0) 2026.06.23 스레드 개념과 기초 사용법 (0) 2026.06.23 1:1 터미널 채팅 완성하기 (0) 2026.06.22 반복 송수신과 종료 처리 (0) 2026.06.22 클라이언트 만들기 (0) 2026.06.22 다음글이전글이전 글이 없습니다.댓글