35.5강. P5~P7 통합 점검

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/ ← 향후 클라이언트 수신용
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.py와 main.py는 모두 protocol.py를 가져다 씁니다. 실행 위치가 다르면 ModuleNotFoundError가 납니다. 서버 쪽과 클라이언트 쪽 각각의 폴더에 protocol.py가 있는지 확인합니다.
from protocol import send_message, recv_message
✔ 확인 기준: python chat_server/server.py 실행 시 ModuleNotFoundError 없이 서버가 접속 대기 상태가 되면 완료. 실패하면 protocol.py가 server.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강): 지금까지 기능별로 나누어 작성한 코드를 최종 프로젝트 형태로 정리합니다. 불필요한 임시 코드를 제거하고, 파일 구조와 실행 흐름을 정돈해 완성된 채팅 프로그램의 기반을 만듭니다.