본문 바로가기

자바

[JAVA] 멀티 클라이언트 서버 구현과 스레드 구조

728x90

들어가기 앞서

우선 소켓 통신에 대한 이해가 필요하다.

소켓 통신에 대해 잘 모른다면 아래 글을 읽으면 된다.

https://lold2424.tistory.com/245

 

[JAVA] 소켓 통신의 기본 개념과 구조

Java에서는 네트워크 통신이 가능하도록 java.net 패키지를 통해 TCP/IP 기반 소켓 통신 기능을 제공한다.이번 글에서 TCP 기반의 소켓과 서버소켓을 사용한 1:1 구조를 알아보도록 하겠다.소켓 통신이

lold2424.tistory.com

실제 서비스에서는 다수의 사용자가 동시 접속하기 대문에, 클라이언트마다 별도의 스레드를 생성해 병렬 처리해야한다.

때문에 멀티 클라이언트의 구조에 대해 이해해야만 한다.

멀티 클라이언트 서버란?

기존의 1:1 통신 모델을 확장한 통신을 말한다.

각 클라이언트마다 별도의 연결 세션을 유지하기 위해 일반적으로 TCP 기반으로 구현된다.

TCP 기반으로 구현하면 클라이언트에 대해 스레드를 배정해 1:다수, 다수:다수 구현에 최적화 할 수 있다.

UDP보다 TCP가 패킷 순서 보장, 손실/재전송 처리와 같은 신뢰성 높은 통신을 제공하기에 데이터 순서나 누락 없이 처리해준다.

1:다수

서버 1대 ↔ 다수의 클라이언트 동시 접속

클라이언트마다 개별 스레드 또는 스레드풀로 분리 처리

각자 독립적으로 메시지 송수신 가능

다수:다수

단순히 서버-클라이언트의 다대일이 아니라, 클라이언트들끼리도 메시지를 주고받도록 확장

서버는 모든 클라이언트의 메시지를 받아 다른 클라이언트에 전달하는 허브 역할

멀티 클라이언트 서버 구현 방식

멀티 클라이언트는 여러가지 방식으로 구현할 수 있다.

1. 접속당 1스레드

클라이언트가 연결되면 해당 연결을 처리할 새 스레드를 생성하는 방식이다.

구현이 간단하고 독립적인 처리가 가능하지만, 클라이언트 수가 많아지면 그만큼 사용하는 스레드의 수가 증가해 메모리 소모가 심하다는 단점이 있다.

while (true) {
    Socket client = serverSocket.accept();
    new Thread(() -> {
        // client와 통신 처리
    }).start();
}

2. 스레드풀 기반 구조

미리 정해진 수의 스레드를 풀로 생성하고, 클라이언트 요청이 들어오면 스레드가 큐에서 꺼내서 처리하는 방식이다.

스레드 수를 제한하기 때문에 자원을 효율적으로 사용할 수 있어 안정적이지만 구현이 복잡하다는 단점을 가진다.

ExecutorService pool = Executors.newFixedThreadPool(100);

while (true) {
    Socket client = serverSocket.accept();
    pool.execute(() -> {
        // client와 통신 처리
    });
}

표로 확인하는 서버 구현 방식

항목 접속당 1스레드 스레드풀 기반
구조 요청마다 새로운 스레드 생성 고정된 수의 스레드 재사용
장점 구현이 간단 자원 효율적, 안정적 처리 가능
단점 많은 연결 시 메모리 부담 큐 대기 시간이 발생할 수 있음
사용 예 간단한 채팅 앱, 학습 목적 실전 서비스, 높은 트래픽 서버
728x90