ki-sd 님의 블로그
[2026-04-10] Socket 통신과 멀티 쓰레드를 활용한 실시간 다중 채팅 서버 본문
한 달여간 배운 OOP, 컬렉션, I/O 스트림, 예외 처리, 멀티 쓰레드를 총망라하여 실제 동작하는 네트워크 기반 채팅 애플리케이션을 완성했다.
1. TCP/IP 소켓 프로그래밍의 원리
- 클라이언트의 연결 요청을 지정된 포트(Port)에서 끝없이 대기하는 ServerSocket과, 실제 클라이언트와 연결되어 1:1 데이터 스트림 터널을 뚫어주는 Socket의 역할을 완벽히 분리하여 설계했다.
2. 멀티 쓰레드 기반의 서버 아키텍처
- 서버가 한 클라이언트의 메시지 수신(I/O)을 대기하는 동안 멈춰버리면(Blocking), 다른 클라이언트의 접속이나 메시지를 처리할 수 없다.
- 이를 해결하기 위해 새로운 클라이언트가 접속할 때마다 해당 소켓을 담당하는 새로운 쓰레드를 생성하여 할당했다. 각 쓰레드가 독립적으로 동작하므로 다수의 사용자가 동시에 메시지를 주고받는 실시간 비동기 통신이 가능해졌다.
3. 동기화(Synchronization)와 브로드캐스팅(Broadcasting)
- 접속한 모든 클라이언트의 출력 스트림 객체를 컬렉션(예: ArrayList 또는 HashMap)에 담아 중앙 관리했다.
- 한 클라이언트가 보낸 메시지를 리스트에 있는 모든 클라이언트에게 일제히 뿌려주는 브로드캐스팅 로직을 구현했다.
- 이때 여러 쓰레드가 동시에 컬렉션 데이터(공유 자원)에 접근하여 요소를 추가/삭제하면 충돌(ConcurrentModificationException)이 발생하므로, synchronized 키워드를 통해 특정 블록에 한 번에 하나의 쓰레드만 접근할 수 있게 잠금(Lock)을 거는 동기화 처리의 중요성을 깊이 깨달으며 전체 네트워크 시스템 구축을 마무리했다.
'JavaStudy' 카테고리의 다른 글
| [2026-04-09] 내부 클래스, 멀티 쓰레드(Multi-Thread), 그리고 네트워크 기초 (1) | 2026.04.17 |
|---|---|
| [2026-04-08] 스트림(Stream) 심화와 객체 직렬화(Serialization)를 이용한 회원 CRUD (0) | 2026.04.17 |
| [2026-04-07] 자바 I/O의 시작 - File 클래스와 시스템 제어 (0) | 2026.04.17 |
| [2026-04-06] 람다식(Lambda)과 스트림(Stream) API를 통한 함수형 프로그래밍 (0) | 2026.04.17 |
| [2026-04-03] Set과 Map의 논리적 구조와 중복 제어 (0) | 2026.04.17 |
