35.5강 점검 중심 ⏱ 약 20분

 

0. 학습 목표

→ 이번 글에서 무엇을 이해하고, 무엇을 확인할지 먼저 정리합니다.

더보기

0.1 이번 글에서 다룰 내용

이번 강의는 점검 중심 강의입니다.

 

35강까지 P5~P7 파트를 거치며 GUI 채팅 프로그램의 주요 기능을 모두 구현했습니다.

새 기능을 추가하기보다, 지금까지 만든 기능들이 서로 충돌 없이 함께 동작하는지 확인합니다. 각 기능을 따로 테스트할 때는 됐는데, 함께 실행하면 문제가 생기는 경우가 있습니다. 이번 강의에서 그 부분을 미리 찾아 정리합니다.

PySide6 GUI 창 실행
서버 접속과 연결 종료
실시간 메시지 수신
사용자 목록 동기화
상대 선택 UI
귓속말 전송
귓속말 오류 처리
파일 선택
파일 전송 진행률 표시
서버의 파일 수신과 저장
구분 내용
이해할 것 GUI 기능들이 하나의 채팅 프로그램 안에서 어떻게 연결되는지
만들 것 새 기능이 아니라 안정적으로 실행되는 통합 상태
확인할 것 채팅, 귓속말, 파일 송수신, 종료 처리가 함께 정상 동작하는지

 

0.2 이번 체크포인트에서 점검할 구조

chat_server/
├── protocol.py       ← 점검
└── server.py         ← 점검

chat_client/
├── protocol.py       ← 점검
├── client.py
├── main.py           ← 점검
└── downloads/
    └── received_files/   ← 파일 저장 결과 확인
파일 역할
protocol.py JSON 메시지 송수신, 구분자 처리
server.py 다중 접속, 사용자 목록, 귓속말, 파일 저장 처리
main.py GUI 화면, 채팅 송수신, 귓속말, 파일 선택과 진행률 표시
received_files/ 서버가 수신한 파일을 저장하는 폴더

 

0.3 📦 Part 7 구현

part7_final.zip
├── README.md                     ← 프로토콜 변경 주의 + 35.5강 체크리스트 포함
├── chat_server/
│   ├── protocol.py               ← 33강 완성본 (길이 헤더 + send_file)
│   ├── server.py                 ← 34강 완성본 (파일 수신 핸들러 포함)
│   └── received_files/           ← 서버 수신 파일 저장 폴더
└── chat_client/
    ├── protocol.py               ← 서버와 동일
    ├── main.py                   ← 35강 완성본 (파일 선택·진행률 UI)
    └── downloads/received_files/ ← 향후 클라이언트 수신용
part7_final.zip
0.01MB

 

1. 현재까지 만든 기능 확인하기

→ P5~P7에서 만든 기능이 어떻게 연결되는지 정리하고 점검 기준을 확인합니다.

더보기

1.1 P5~P7 기능 흐름 정리

파트 주요 내용 관련 파일
P5 PySide6 GUI 채팅 GUI 창, 서버 접속, 메시지 송수신, 종료 처리 main.py
P6 사용자 목록과 귓속말 사용자 목록 동기화, 상대 선택, 귓속말 전송과 오류 처리 server.py, main.py
P7 파일 송수신 파일 메타데이터, 조각 전송, 수신 저장, 진행률 표시 server.py, main.py, received_files/

 

1.2 최종 점검 기준

이번 강의가 끝났을 때 다음 질문에 모두 "예"라고 답할 수 있어야 합니다.

서버가 오류 없이 실행되는가?
GUI 클라이언트 2개 이상이 접속되는가?
사용자 목록이 접속과 종료에 따라 갱신되는가?
전체 채팅이 서로에게 전달되는가?
상대를 선택하고 귓속말을 보낼 수 있는가?
귓속말 오류 상황이 GUI에 표시되는가?
파일 선택 창이 열리는가?
파일 전송 진행률이 표시되는가?
서버의 received_files/ 폴더에 파일이 저장되는가?
exit 입력 또는 창 닫기 시 접속자 목록에서 제거되는가?

 

2. 프로젝트 구조 점검하기

→ 핵심 파일이 올바른 위치에 있는지, 저장 폴더 설정이 맞는지 확인합니다.

더보기

2.1 파일 위치 점검하기

server.pymain.py는 모두 protocol.py를 가져다 씁니다. 실행 위치가 다르면 ModuleNotFoundError가 납니다. 서버 쪽과 클라이언트 쪽 각각의 폴더에 protocol.py가 있는지 확인합니다.

from protocol import send_message, recv_message

✔ 확인 기준: python chat_server/server.py 실행 시 ModuleNotFoundError 없이 서버가 접속 대기 상태가 되면 완료. 실패하면 protocol.pyserver.py와 같은 폴더에 있는지, 현재 터미널 위치가 프로젝트 루트인지 확인하세요.

 

2.2 서버 저장 폴더 점검하기

파일 수신 저장 폴더는 received_files/로 통일합니다. 34강에서 추가한 다음 두 줄이 server.py에 있는지 확인합니다.

RECEIVE_DIR = "received_files"

os.makedirs(RECEIVE_DIR, exist_ok=True)

서버를 실행한 뒤 파일을 한 번 전송해 보면 received_files/ 폴더가 자동으로 생깁니다. 폴더가 생기지 않는다면 handle_file_info() 안에서 os.makedirs()가 호출되는지 확인합니다.

 

3. 실행 순서 점검하기

→ 서버를 먼저 실행하고 GUI 클라이언트 여러 개를 접속해 기본 흐름을 확인합니다.

더보기

터미널 세 개를 열어 서버 하나, GUI 클라이언트 두 개를 실행합니다. 서버가 반드시 먼저 실행되어 있어야 클라이언트가 접속할 수 있습니다.

# 터미널 1 — 서버 먼저 실행
python chat_server/server.py
# 터미널 2 — 첫 번째 GUI 클라이언트
python chat_client/main.py
# 터미널 3 — 두 번째 GUI 클라이언트
python chat_client/main.py

각 GUI 창에서 서버 접속 버튼을 누릅니다. 서버 터미널에 접속자 수가 증가하면 정상입니다.

현재 접속자 수: 1
현재 접속자 수: 2

✔ 확인 기준: GUI 사용자 목록에 접속자 주소가 2개 이상 표시되면 완료. 실패하면 서버가 먼저 실행 중인지, 포트 5000이 사용 가능한지 확인하세요.

 

4. 기능별 테스트하기

→ GUI 접속 상태, 사용자 목록, 전체 채팅, 귓속말, 파일 전송을 순서대로 확인합니다.

더보기

4.1 GUI 접속 상태와 사용자 목록 테스트

테스트 동작 성공 기준
서버 접속 전 GUI 실행 입력창·보내기·귓속말·파일 버튼 비활성화
서버 접속 서버 접속 클릭 상태 표시가 서버에 연결됨으로 변경
연결 종료 exit 입력 또는 창 닫기 상태 표시가 서버에 연결되지 않음으로 변경

GUI 클라이언트 2개가 접속된 상태에서 오른쪽 사용자 목록에 주소가 2개 보여야 합니다. 한 클라이언트를 종료하면 나머지 GUI의 사용자 목록에서 해당 주소가 사라져야 합니다.

✔ 확인 기준: 접속 시 목록 증가, 종료 시 목록 감소가 되면 완료. 실패하면 서버에서 broadcast_user_list()를 접속과 종료 후 모두 호출하는지 확인하세요.

 

4.2 전체 채팅과 귓속말 테스트

첫 번째 GUI에서 메시지를 보내면 두 번째 GUI에도 표시되어야 합니다.

보낸 쪽: 나: 안녕하세요 GUI 1입니다
받는 쪽: ('127.0.0.1', 52344): 안녕하세요 GUI 1입니다

귓속말은 선택한 대상에게만 전달되어야 합니다. 귓속말 오류 상황별 기대 결과는 다음과 같습니다.

상황 기대 결과
상대를 선택하지 않음 [오류] 귓속말 상대를 먼저 선택하세요.
빈 메시지로 귓속말 시도 [오류] 귓속말 내용을 입력하세요.
자기 자신 선택 [오류] 자기 자신에게는 귓속말을 보낼 수 없습니다.
상대가 퇴장함 [오류] 선택한 사용자가 더 이상 접속 중이 아닙니다.

 

4.3 파일 전송 테스트

GUI에서 파일 선택 버튼을 눌러 작은 이미지나 텍스트 파일을 선택합니다. 35강에서 만든 진행률 바와 상태 라벨이 다음 순서로 바뀌어야 합니다.

선택한 파일: sample.png
파일 상태: 전송 준비
파일 상태: 전송 중    ← 진행률 바 0 → 100
파일 상태: 전송 완료
[시스템] 파일 전송 완료: sample.png

서버 터미널에는 34강에서 만든 수신 로그가 출력되고, 전송이 끝나면 received_files/ 폴더에 파일이 생깁니다.

파일 수신 시작: sample.png, 크기: 204800 bytes
파일 조각 저장: sample.png (4096/204800 bytes)
...
파일 저장 완료: received_files/sample.png
received_files/
└── sample.png

✔ 확인 기준: received_files/ 안에 파일이 생기고, 저장된 파일을 열었을 때 원본과 같은 내용이 보이면 완료. 실패하면 서버에 handle_file_info(), handle_file_chunk(), handle_file_end()가 메시지 분기에 연결되어 있는지 확인하세요.

 

5. 자주 발생하는 오류 해결하기

→ 통합 점검 시 자주 만나는 오류를 정리합니다.

더보기
오류 상황 원인과 해결 방법
ModuleNotFoundError: protocol protocol.py가 없거나 실행 위치가 다릅니다. 서버·클라이언트 각 폴더에 protocol.py가 있는지, 터미널 위치가 프로젝트 루트인지 확인합니다.
ConnectionRefusedError 서버가 실행되지 않았습니다. python chat_server/server.py를 먼저 실행합니다.
Address already in use 이전 서버가 포트 5000을 점유 중입니다. 기존 서버 터미널을 종료하고 다시 실행합니다.
GUI가 잠시 멈춘다 수신 루프나 큰 파일 전송이 GUI 메인 스레드를 오래 점유합니다. 수신은 스레드로 실행하고, 작은 파일로 먼저 테스트합니다.
사용자 목록이 갱신되지 않는다 서버의 broadcast_user_list(), GUI의 update_user_list()를 접속·종료 시 모두 호출하는지 확인합니다.
귓속말이 전체에게 보인다 broadcast()로 전송했습니다. 대상 소켓에만 보내는 send_whisper()로 교체합니다.
파일 버튼이 항상 비활성화됨 set_connected_state()에서 file_button.setEnabled(connected)를 호출하는지 확인합니다.
저장된 파일이 열리지 않는다 base64.b64decode()"wb" 바이너리 쓰기 모드가 올바른지 확인합니다.
ZeroDivisionError 빈 파일 전송 중 0으로 나누었습니다. if file_size > 0: 조건을 추가합니다.

기능이 따로는 되는데 함께 실행하면 안 되는 경우에는 순서를 나누어 확인합니다. 서버 접속 → 사용자 목록 → 전체 채팅 → 귓속말 → 파일 전송 → 파일 전송 후 다시 채팅 순으로 한 단계씩 좁혀 갑니다.

 

6. 체크리스트로 마무리하기

→ P5~P7 통합 점검 체크리스트를 확인하고 최종 성공 기준을 정리합니다.

더보기
점검 항목 완료
protocol.py, server.py가 서버 폴더에 함께 있다
protocol.py, main.py가 클라이언트 폴더에 함께 있다
서버가 python chat_server/server.py로 실행된다
GUI가 python chat_client/main.py로 실행된다
GUI 클라이언트 2개 이상이 서버에 접속된다
접속 시 사용자 목록이 증가한다
종료 시 사용자 목록이 감소한다
전체 채팅 메시지가 다른 GUI에 표시된다
상대 선택 라벨이 정상적으로 바뀐다
귓속말이 선택한 대상에게만 전달된다
귓속말 오류 메시지가 GUI에 표시된다
파일 선택 버튼이 동작한다
파일 전송 진행률이 100까지 올라간다
서버의 received_files/ 폴더에 파일이 저장된다
exit 입력 또는 창 닫기 시 서버 접속자 수가 줄어든다

모든 항목을 확인했다면 P5~P7 기능이 안정적으로 통합된 상태입니다. 막히는 항목이 있다면 해당 기능을 만든 강의(P5: 21~26강, P6: 27~30강, P7: 31~35강)로 돌아가 코드를 다시 확인합니다.

 

7. 다음 파트로 이어지는 부분

→ 이번 체크포인트 결과를 확인하고 36강에서 진행할 최종 정리를 예고합니다.

더보기

이번 체크포인트까지 오면 GUI 채팅 프로그램은 주요 기능을 대부분 갖춘 상태입니다. 현재 기능은 다음과 같습니다.

- GUI 서버 접속
- 실시간 메시지 수신
- 전체 채팅
- 사용자 목록 동기화
- 상대 선택
- 귓속말 및 귓속말 오류 처리
- 파일 선택
- 파일 전송 진행률 표시
- 파일 수신 저장

36강에서는 이 기능들을 최종 프로젝트 형태로 정리합니다. 강의를 진행하면서 기능을 하나씩 추가해 코드가 다소 길어졌으므로, 다음 작업을 순서대로 진행합니다.

- 파일 구조 정리
- 기능별 코드 위치 확인
- 불필요한 임시 코드 제거
- 최종 실행 흐름 정리
- README 작성 전 준비

→ 다음 강의 (36강): 지금까지 기능별로 나누어 작성한 코드를 최종 프로젝트 형태로 정리합니다. 불필요한 임시 코드를 제거하고, 파일 구조와 실행 흐름을 정돈해 완성된 채팅 프로그램의 기반을 만듭니다.