1강 개념 중심 ⏱ 약 20분

 

0. 학습 목표

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

더보기

0.1 이번 글에서 다룰 내용

이번 글은 개념 중심 강의입니다.

 

네트워크 프로그래밍이 무엇인지, 서버와 클라이언트가 각각 어떤 역할을 하는지 이해합니다.

(또한 이 과정 전체에서 완성하게 될 채팅 프로그램의 큰 그림을 먼저 확인합니다.

지금 모든 내용을 외울 필요는 없습니다. "앞으로 무엇을 만드는가"를 먼저 파악하는 것이 목표입니다.)

 

이번 강의에서 배우는 서버-클라이언트 구조는 최종 채팅 프로젝트의 가장 기본 뼈대입니다. 이번 강의에서 서버와 클라이언트가 왜 나뉘어져 있는지, 각각 어디서 실행되는지를 이해해야 이후 소켓 코드를 작성할 때 구조가 잡힙니다.

구분 내용
이해할 것 네트워크 프로그래밍의 의미, 서버와 클라이언트 구조와 역할
확인할 것 서버가 먼저 기다리고, 클라이언트가 연결을 요청한다는 기본 흐름

 

0.2 앞으로 학습할 내용 미리보기

파트 배우는 내용 만들어지는 것
Part 1~2 네트워크 입문, 1:1 소켓 통신 터미널 1:1 채팅
Part 3~4 다중 접속, 메시지 프로토콜 여러 명이 접속하는 채팅 서버
Part 5~7 PySide6 GUI, 귓속말, 파일 전송 GUI 채팅 프로그램
Part 8 최종 통합, 안정화, WebSocket 비교 완성된 채팅 앱
Part 9 Docker, AWS EC2 배포 외부에서 접속 가능한 채팅 서버
Part 10 현실 비교, 플랫폼 비교, 다음 로드맵 다음 학습 방향 정리

 

1.3 앞으로 만들 프로젝트 구조 미리보기

최종 프로젝트 구조를 먼저 확인합니다. 지금 이 파일들을 모두 이해할 필요는 없습니다. 서버 프로젝트와 클라이언트 프로젝트가 나뉜다는 점만 먼저 기억하세요. 강의가 진행되면서 아래 파일들을 하나씩 직접 만들어 갑니다.

chat_server/                    ← 서버 프로젝트 (서버 컴퓨터에서 실행)
├── server.py                   # 서버 실행 진입점
├── client_manager.py           # 접속자 목록 관리
├── message_router.py           # 메시지 분기 처리 (전체/귓속말/파일)
├── protocol.py                 # JSON 메시지 타입 정의
└── README.md                   # 서버 실행 방법 문서

chat_client/                    ← 클라이언트 프로젝트 (사용자 컴퓨터에서 실행)
├── main.py                     # 클라이언트 실행 진입점
├── chat_window.py              # PySide6 GUI 화면
├── network_client.py           # 소켓 연결·송수신 처리
├── file_transfer.py            # 파일 전송·수신 처리
├── protocol.py                 # JSON 메시지 타입 정의 (서버와 동일)
├── downloads/
│   └── received_files/         # 수신한 파일 저장 폴더
└── README.md                   # 클라이언트 실행 방법 문서

서버 프로젝트는 접속을 기다리고 메시지를 처리하는 쪽입니다.

클라이언트 프로젝트는 사용자가 직접 실행하고 화면을 통해 메시지를 주고받는 쪽입니다.

Part 1~2에서는 server.py와 main.py만 만들고, 이후 강의가 진행될수록 나머지 파일이 하나씩 추가됩니다.

 

1. 네트워크 프로그래밍 핵심 개념 이해하기

→ 네트워크 프로그래밍이 무엇인지, 서버와 클라이언트가 각각 어떤 역할을 하는지 이해합니다.

더보기

1.1 네트워크 프로그래밍이란?

두 개 이상의 프로그램이 네트워크를 통해 Data 를 주고받도록 만드는 것을 네트워크 프로그래밍이라고 합니다.

네트워크 프로그래밍 = 두 프로그램이 네트워크를 통해 데이터를 주고받도록 코드를 작성하는 것

Data 는 텍스트, 이미지, 파일, 숫자, 상태 정보 등 여러 가지가 될 수 있습니다. 우리가 만들 채팅 프로그램에서는 처음에 텍스트 메시지를 보내고, 나중에는 파일까지 주고받게 됩니다.

 

1.2 서버-클라이언트 구조

네트워크 프로그램은 일반적으로 서버와 클라이언트 구조로 구성됩니다.

서버 프로그램과 클라이언트의 프로그램이 네트워크를 통해 Data 를 주고받도록 만드는 것을 네트워크 프로그래밍이라고 합니다.

구분 역할
서버 기다리는 프로그램. 요청을 받고 처리한다
클라이언트 요청하는 프로그램. 사용자가 직접 실행한다

 

2. 네트워크 프로그래밍 동작 순서 확인하기

→ 서버와 클라이언트가 실제로 어떤 순서로 동작하는지 확인합니다.

더보기

2.1 카페로 비유하기

서버와 클라이언트의 구조화 흐름은 카페에 비유하면 이해하기 쉽습니다. 카페에서 직원이 손님을 기다리고 있고, 손님이 먼저 주문 요청이 있어야 직원이 커피를 만들듯이, 네트워크에서도 클라이언트가 먼저 연결 요청을 보내야 서버가 응답합니다.

 

여기서 확인해야 할 점은 서버는 혼자서 먼저 클라이언트에게 말을 걸지 않습니다. (다만 연결이 만들어진 뒤에는 서버도 클라이언트에게 데이터를 보낼 수 있습니다. 예를 들어 채팅 서버는 한 사용자가 보낸 메시지를 다른 사용자들에게 전달할 수 있습니다.)

구분 카페 비유 프로그래밍에서의 역할
서버 카운터 직원 항상 대기하면서 손님의 주문을 받음
클라이언트 손님 필요한 순간 카운터에 가서 주문함

 

 

2.2 서버와 클라이언트의 동작 순서

1. 서버 먼저 실행   → "나 여기서 기다릴게" (대기 상태)
        ↓
2. 클라이언트 실행  → "서버야, 나 연결할게!" (연결 요청)
        ↓
3. 서버가 수락      → "응, 연결됐어!" (연결 수립)
        ↓
4. 데이터 주고받기  → 메시지, 파일 등 송수신
        ↓
5. 연결 종료        → 어느 쪽이든 먼저 끊을 수 있음

중요한 점은 서버가 먼저 실행되어 있어야 클라이언트가 연결할 수 있다는 것입니다.

 

2.3 서버와 클라이언트를 구분하는 기준

다음 질문으로 서버와 클라이언트를 구분할 수 있습니다.

질문 서버 클라이언트
누가 먼저 실행되는가? 항상 먼저 실행됨 나중에 실행됨
누가 연결을 기다리는가? 항상 대기 중 필요할 때 연결
누가 연결을 요청하는가? 요청하지 않음 직접 요청함
사용자가 직접 실행하는가? 보통 백그라운드에서 실행 사용자가 직접 실행

이 구분이 중요한 이유는 코드 작성 방식이 달라지기 때문입니다. 서버 코드와 클라이언트 코드는 같은 언어를 써도 내부 구조가 다릅니다. 4강과 5강에서 직접 확인하게 됩니다.

 

2.4 실제 서비스의 서버-클라이언트 구조

카카오톡으로 메시지를 보낼 때, 내 휴대폰 앱이 상대방 앱으로 메시지를 바로 보내는 것처럼 보이지만 실제로는 중간에 서버가 있습니다. 

내 휴대폰 앱
↓
카카오톡 서버
↓
상대방 휴대폰 앱

 

일상에서 사용하는 서비스도 대부분 이 구조로 동작합니다.

서비스 내부에서 일어나는 일
카카오톡 메시지 내 앱 → 카카오 서버 → 상대방 앱으로 메시지 데이터 전달
유튜브 영상 재생 내 브라우저 → 유튜브 서버에 영상 데이터 요청 → 받아서 재생
온라인 게임 내 캐릭터 위치 → 게임 서버 → 다른 플레이어 화면에 반영
이메일 수신 메일 서버가 내 클라이언트(앱/웹)에 새 메일 데이터를 전달

이 모든 서비스의 공통점은 "보내는 쪽"과 "받는 쪽"이 항상 존재한다는 것입니다. 이것이 바로 서버-클라이언트 구조입니다.

 

3. 다음 강의로 이어지는 부분

→ 이번 강의 핵심을 정리하고, 2강에서 배울 내용을 예고합니다.

더보기

이번 강의의 핵심을 정리하면 다음과 같습니다.

- 네트워크 프로그래밍은 두 프로그램이 네트워크를 통해 데이터를 주고받도록 만드는 것이다
- 서버는 기다리는 프로그램이다
- 클라이언트는 연결을 요청하는 프로그램이다
- 서버가 먼저 실행되어 있어야 클라이언트가 접속할 수 있다
- 같은 컴퓨터에서도 서버와 클라이언트를 실행해 통신할 수 있다

 

 

이번 강의에서 서버와 클라이언트의 역할을 이해했다면, 다음 2강에서는 클라이언트가 서버를 찾아가기 위해 필요한 다음 개념을 다룹니다.

- IP        — 컴퓨터의 주소
- Port      — 프로그램의 문 번호
- TCP       — 데이터를 안전하게 주고받는 방식
- 127.0.0.1과 localhost의 차이

→ 다음 강의 (2강): IP, 포트, TCP 개념을 배웁니다. 클라이언트가 서버에 연결하려면 "어디에(IP)", "어떤 문으로(Port)" 접속해야 하는지 이해하면 이후 소켓 코드가 훨씬 명확하게 보입니다.