Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자공부일기

1주차 서버와 클라이언트/ 웹 어플리케이션서버와 게임서버 본문

TIL(Today I Learned)

1주차 서버와 클라이언트/ 웹 어플리케이션서버와 게임서버

JavaCPP 2024. 11. 20. 20:59

컴퓨터 세계에서 서버와 클라이언트는 무엇인가?

 

컴퓨터 세계에서 서버는 서비스 제공자, 클라이언트는 서비스요청자라고 말한다.

클라이언트(컴퓨터등 인터넷에 연결된 기기를 쓰는 우리)가 서버(네이버나 쇼핑몰)에 서비스(검색, 내정보 조회)를 

요청하면 서버는 우리에게 요청에 맞는 정보를 제공합니다.

클라이언트와 서버는 네트워크를 통해 서로 데이터를 주고받는 역할을 맡는 두 시스템 또는 프로그램을 뜻합니다.

 

이제 각각 서버는 뭐고 클라이언트라는건 정확히 뭘까?

 

서버 (Server)

정의:

-데이터를 저장하거나, 처리하거나, 클라이언트 요청을 처리하기 위해 서비스를 제공하는 컴퓨터, 프로그램, 또는 시스템입니다.

특징:

-항상 작동하며(보통은), 클라이언트 요청에 응답합니다.

-여러 클라이언트와 동시에 통신할 수 있습니다.

-강력한 하드웨어 성능과 안정적인 네트워크 환경을 갖춘 경우가 많습니다.

역할:

-데이터를 저장하고 관리 (예: 데이터베이스 서버).

-클라이언트 요청 처리 및 정보 제공 (예: 웹 서버).

-연산 작업 수행 (예: 게임 서버).

예시

-웹 서버: 클라이언트가 웹페이지를 요청하면 HTML, CSS, JavaScript를 반환.

-데이터베이스 서버: 데이터를 저장하고 클라이언트가 요청한 데이터를 반환.

-파일 서버: 파일 업로드/다운로드 기능 제공.

 

 

클라이언트 (Client)

정의:

-서버에 요청을 보내고, 서버로부터 받은 데이터를 사용하거나 표시하는 컴퓨터, 프로그램, 또는 시스템입니다.

특징:

-사용자와 직접 상호작용합니다.

-보통 서버에 연결되기 위해 요청(Request)을 보냅니다.

-서버로부터 데이터를 받아 사용자가 이해할 수 있는 형태로 출력합니다.

역할:

-서버에 데이터 요청 (예: 브라우저로 웹페이지 열기).

-서버로 데이터를 전송 (예: 양식 제출).

-서버 응답 데이터를 처리하고 표시 (예: 쇼핑몰의 상품 목록).

예시:

-웹 브라우저: 사용자가 웹사이트 주소를 입력하면 서버에 요청하고 결과를 화면에 표시.

-이메일 클라이언트: 메일 서버에서 이메일을 다운로드하거나 보냄.

-게임 클라이언트: 게임 서버와 통신하며, 사용자 인터페이스를 제공.

 

서버와 클라이언트의 관계

서버와 클라이언트는 요청(Request)과 응답(Response)을 통해 상호작용합니다.

요청-응답 구조

  1. 클라이언트는 서버에 요청을 보냅니다.
    • 예: 사용자가 브라우저에 www.example.com 입력.
  2. 서버는 요청을 처리하고 응답을 보냅니다.
    • 예: 서버가 HTML, CSS, JavaScript 파일을 클라이언트에 반환.
  3. 클라이언트는 응답 데이터를 받아 사용자에게 표시합니다.
    • 예: 브라우저가 웹페이지를 렌더링.

 

우리가 실생활에서 받는 서비스와 굉장히 유사합니다. 음식점에 전화를 겁니다. 전화번호를 입력하죠(인터넷 url입력)

전화를 겁니다(접속) 그리고 음식점에서 여보세요하고 받았음을 알립니다.(접속성공)그럼 저희는 지금 가게가 열려있는지 묻습니다.(데이터 조회 요청) 그럼 음식점에선 오픈여부를 알려주죠.(요청 처리후 응답 데이터 발송) 그럼 저희는 그 정보를 듣습니다(받은 데이터 표시)

 

그렇게 어려운 개념은 아니라고 생각합니다.

 

 

웹 애플리케이션 서버와 게임 서버의 공통점과 차이점

1. 공통점

(1) 클라이언트-서버 모델

  • 공통점:
    두 서버 모두 클라이언트-서버 구조를 기반으로 동작하며, 클라이언트 요청에 응답하는 방식으로 설계됩니다.
    • 웹 애플리케이션 서버: 웹 브라우저나 모바일 앱에서 요청을 받아 처리.
    • 게임 서버: 게임 클라이언트와의 통신을 통해 데이터를 주고받음.

(2) 네트워크 통신

  • 공통점:
    네트워크를 통해 데이터를 교환하며, HTTP, WebSocket 등 다양한 프로토콜을 사용합니다.

(3) 데이터베이스 활용

  • 공통점:
    데이터를 저장하거나 불러오기 위해 데이터베이스와 연동합니다.
    • 예: 사용자 정보, 상태 데이터 저장.

(4) 보안 필요성

  • 공통점:
    데이터 전송 중 기밀성을 유지하고, 인증 및 권한 관리를 통해 보안을 강화합니다.

(5) 확장성 요구

  • 공통점:
    동시 접속 사용자 증가에 대비하기 위해 로드 밸런싱, 캐싱, 수평적 확장을 활용합니다.

 

2. 차이점

구분 웹 애플리케이션 서버 게임 서버
주요 목적 데이터 제공, 비즈니스 로직 실행 실시간 상태 동기화 및 게임 플레이 지원
주요 프로토콜 HTTP/HTTPS TCP/UDP, WebSocket
데이터 처리 방식 요청-응답 기반 (Stateless 방식이 많음) 상태 유지(Stateful) 및 실시간 데이터 처리
지연 시간 요구 ms~초 단위의 지연 허용 낮은 지연 시간(ms 단위)이 필수
주요 기술 스택 Django, Spring Boot, Express.js 등 웹 프레임워크 WebSocket, Photon, Socket.IO 등 실시간 통신 기술
상태 관리 세션/쿠키 또는 토큰을 통해 상태를 관리 게임 상태(State) 및 동기화를 유지해야 함
주요 리소스 요구 CPU 중심 CPU, GPU, 네트워크 대역폭 모두 중요
주요 기능 사용자 인증, 데이터 CRUD, API 제공 플레이어 동기화, 충돌 처리, 물리 엔진 실행
예시 쇼핑몰, 소셜 미디어, 뉴스 웹사이트 MMORPG, FPS, MOBA 같은 멀티플레이어 게임 서버

 

3. 주요 차이점 설명

(1) 통신 방식의 차이

  • 웹 애플리케이션 서버는 주로 HTTP/HTTPS 기반으로 동작하며, 요청-응답 방식으로 작동합니다.
    • 클라이언트의 요청마다 서버가 독립적으로 처리합니다.
    • RESTful API 또는 GraphQL을 활용해 데이터를 주고받습니다.
  • 게임 서버는 주로 TCP/UDP 또는 WebSocket을 통해 실시간 데이터를 처리합니다.
    • 클라이언트와 지속적인 연결이 필요합니다.
    • 게임 상태를 동기화하고 이벤트(예: 공격, 이동)를 처리합니다.

(2) 지연 시간의 중요성

  • 웹 애플리케이션 서버: 일반적으로 사용자 경험에 약간의 지연(ms~초 단위)이 허용됩니다.
  • 게임 서버: 낮은 지연 시간이 필수이며, 실시간 반응성을 보장해야 합니다.

(3) 상태 관리

  • 웹 애플리케이션 서버:
    대부분 무상태(Stateless) 방식이며, 세션/쿠키를 통해 필요한 상태를 관리합니다.
  • 게임 서버:
    상태 유지(Stateful)가 필수이며, 플레이어 위치, 게임 상태, 점수 등을 지속적으로 동기화해야 합니다.

 

4. 요약

  • 공통점: 클라이언트-서버 모델, 데이터베이스 활용, 네트워크 통신, 확장성 요구.
  • 차이점: 통신 방식, 상태 관리, 지연 시간 요구, 주요 기술 스택 및 리소스 사용 방식에서 차이가 있습니다.

 

이제 저희가 만들게될 게임 서버에 대해 더 자세히 알아보겠습니다.

게임 서버에서 중요한 요소들은 실시간 데이터 처리, 저지연 시간, 상태 관리, 그리고 스케일링입니다. 게임 서버는 게임의 특성상 실시간 상호작용과 높은 성능을 요구하기 때문에, 다음과 같은 요소들을 특히 중요하게 다룹니다:

1. 실시간 데이터 처리

  • 게임 서버는 실시간으로 플레이어 간의 상호작용을 처리해야 하므로, 모든 이벤트가 빠르고 정확하게 동기화되어야 합니다. 예를 들어, 다수의 플레이어가 동시에 공격하거나 이동할 때, 서버는 각 플레이어의 상태를 실시간으로 갱신하고 이를 모든 플레이어에게 전송해야 합니다.

2. 저지연 시간 (Low Latency)

  • 게임은 특히 지연 시간(Latency)이 중요한 요소입니다. 서버와 클라이언트 간의 통신이 ms 단위로 이루어져야 하며, 높은 지연 시간은 플레이어의 경험을 크게 저하시킬 수 있습니다.
    • 온라인 게임에서는 물리적 충돌, 캐릭터의 이동, 공격 등의 처리가 빠르게 일어나야 하기 때문에 네트워크 지연(latency)을 최소화해야 합니다.
    • 게임 서버는 UDP 또는 WebSocket을 사용하여 빠르고 지속적인 연결을 유지하고, 필요한 데이터를 실시간으로 전송합니다.

3. 상태 관리 (Stateful)

  • 게임 서버는 상태 관리가 필수적입니다.
    • 각 게임 세션의 상태(플레이어의 위치, 점수, 게임 진행 상황 등)를 계속해서 추적하고 동기화해야 합니다.
    • 서버는 플레이어 상태, 게임 상태 등을 관리하면서 지속적으로 업데이트하고, 서버와 클라이언트 간에 빠르고 정확하게 전송해야 합니다.
    • 상태 동기화를 위한 게임 서버의 효율적 데이터 처리가 매우 중요합니다.

4. 스케일링 (Scalability)

  • 게임 서버는 다수의 동시 접속을 처리해야 하므로 확장성이 필수적입니다.
    • 다수의 플레이어가 동시에 접속할 수 있는 수평적 확장(scale-out) 방식을 사용해 서버의 용량을 확장할 수 있어야 합니다.
    • 로드 밸런싱(요청을 여러 서버에 고르게 분배)을 통해 서버 부하를 분산시켜 서버가 과부하되지 않도록 처리합니다.
    • 서버 클러스터링(여러개의 서버를 하나의 그룹으로 묶어 하나의 시스템처럼 동작)분산 서버 아키텍처( 여러 서버가 서로 다른 역할을 맡아 서버들이 각각 독립적으로 동작하여  네트워크를 통해 협력하며 작업을 처리하는 방식 )가 게임 서버에서 중요한 이유는, 대규모 사용자에게 일관된 게임 경험을 제공하기 위해서입니다.

5. 안정성 및 가용성 (Reliability & Availability)

  • 게임 서버는 높은 가용성(Availability)무중단 서비스가 요구됩니다.
    • 서버 다운타임이나 오류는 플레이어에게 큰 불편을 주기 때문에 백업 서버서버 이중화를 통해 99.9% 이상의 가용성을 유지해야 합니다.
    • 에러 처리자동 복구 시스템도 중요한 요소입니다.

6. 게임 물리 엔진 처리

  • 게임 서버는 물리 엔진을 활용하여, 충돌 처리, 캐릭터 이동, 환경 상호작용 등을 처리해야 합니다.
    • 이러한 물리적 처리 또한 실시간으로 이루어지므로 서버의 처리 성능이 매우 중요합니다.
    • 서버에서 물리적 계산을 처리하고, 그 결과를 클라이언트에 반영하는 방식으로 서버와 클라이언트 간의 협업이 이뤄집니다.

7. 보안

  • 게임 서버는 해킹, 치트(불법적인 조작), DDoS 공격 등 다양한 보안 위협에 대응해야 합니다.
    • 플레이어의 개인정보 보호게임 데이터의 무결성을 보장하는 보안 시스템이 필수적입니다.
    • 또한 속임수 감지 시스템(anti-cheat)을 적용하여 공정한 게임 플레이를 보장합니다.

8. 세션 관리

  • 게임에서의 세션 관리는 중요한 요소입니다. 플레이어가 게임을 시작하고 종료할 때, 세션을 지속적으로 추적하고 복구할 수 있어야 합니다.
    • 예를 들어, 플레이어가 게임을 일시 정지하거나 중단하고 나중에 재접속할 경우, 이전 상태로 복구할 수 있도록 세션을 유지해야 합니다.

9. 사용자 경험(UX)

  • 게임 서버는 플레이어의 경험(UX)을 중시하여, 지속적인 피드백 제공(예: 게임 내 알림, 스코어 업데이트 등)과 시스템 메시지 등을 통해 플레이어에게 실시간으로 정보를 전달해야 합니다.

 

물론 비동기 온라인 게임 서버라는것도 존재합니다.

비동기 온라인 게임 서버는 클라이언트 요청이나 게임 이벤트를 비동기적으로 처리하는 서버입니다. 즉, 요청을 받았을 때 즉시 처리하지 않고, 비동기식 I/O를 사용하여 다른 작업을 처리하면서 대기하는 방식입니다. 게임 내의 다양한 이벤트가 동시에 발생하고, 서버 처리가 여러 작업을 병렬로 처리할 수 있게 해줍니다.

 

비동기 방식의 특징

  1. 병렬 처리
    • 비동기 서버는 여러 요청을 동시에 처리할 수 있습니다. 예를 들어, 하나의 서버가 여러 플레이어의 요청을 동시에 다루며, 서버가 대기하지 않고 다른 작업을 계속 진행할 수 있게 해줍니다.
  2. 효율적인 자원 사용
    • 비동기 방식은 서버가 요청을 기다릴 때 다른 작업을 할 수 있기 때문에 자원(특히 CPU와 메모리)을 더 효율적으로 사용할 수 있습니다. 서버는 블로킹 I/O를 피하고 비동기 I/O를 사용하여 자원 낭비를 최소화합니다.
  3. 저지연 처리
    • 비동기 서버는 요청이 처리되는 동안 다른 작업을 동시에 할 수 있어, 지연 시간을 줄일 수 있습니다. 여러 클라이언트의 요청을 빠르게 처리할 수 있어, 특히 실시간 대전 게임에서 유리합니다.

 

비동기 온라인 게임 서버의 장점

  1. 높은 동시 처리 능력
    • 비동기 방식은 여러 요청을 동시에 처리할 수 있기 때문에, 대규모 플레이어가 동시에 접속하는 게임에서 처리 성능을 크게 향상시킬 수 있습니다.
  2. 리소스 최적화
    • 서버가 클라이언트의 요청을 기다리는 동안 다른 작업을 할 수 있어, 서버 자원을 효율적으로 사용할 수 있습니다. 예를 들어, I/O 작업이 많거나 긴 시간이 걸리는 작업(예: 데이터베이스 쿼리)을 비동기로 처리하면 전체 시스템의 성능이 향상됩니다.
  3. 확장성
    • 비동기 서버는 요청을 큐에 저장하고 처리하는 방식이므로, 서버의 수평적 확장이 용이합니다. 서버에 부하가 증가하면 새로운 서버를 추가하여 부담을 분산할 수 있습니다.
  4. 높은 응답 속도
    • 비동기 서버는 요청을 즉시 처리하지 않고 다른 작업을 병렬로 진행하므로, 응답을 기다리는 동안 서버가 멈추지 않고 다른 작업을 처리할 수 있어 응답 속도가 빨라집니다.

 

비동기 온라인 게임 서버의 단점

  1. 복잡성
    • 비동기 프로그래밍은 콜백 함수프로미스를 사용하는 등, 코드가 복잡해질 수 있습니다. 여러 작업을 동시에 처리하기 위해 코드 구조가 더 복잡해질 수 있고, 디버깅이 어려울 수 있습니다.
  2. 상태 관리 어려움
    • 비동기 처리 방식에서는 여러 작업이 동시에 진행되기 때문에 게임 상태의 일관성 유지가 어려울 수 있습니다. 예를 들어, 플레이어 간의 상호작용, 이벤트 처리 등에서 상태 관리를 정확히 해야 하는데, 비동기식으로 처리되면 이 일관성을 유지하기가 어려워질 수 있습니다.
  3. 처리 지연
    • 비동기 서버는 여러 요청을 병렬로 처리하므로 서버의 응답 시간이 비슷한 요청들 간에 동기식 처리보다 더 예측할 수 없을 수 있습니다. 예를 들어, 비동기 방식에서는 요청을 처리하는 순서가 바뀔 수 있어, 예상보다 응답 속도가 늦어질 수도 있습니다.

 

비동기 게임 서버가 적합한 경우

  • 실시간 다중 사용자 온라인 게임 (MMORPG, FPS 등): 수많은 플레이어가 동시에 참여하는 게임에서는 비동기 서버가 효율적으로 트래픽을 분산하고, 서버 응답 시간을 단축하는 데 유리합니다.
  • 게임 내 실시간 이벤트 처리: 여러 플레이어가 동시에 상호작용하는 게임에서는 각 플레이어의 요청을 비동기적으로 처리하면서, 실시간 처리가 필요한 여러 이벤트를 동시에 다룰 수 있습니다.

 

비동기 게임 서버 구현 예시

  • Node.js: Node.js는 기본적으로 비동기 I/O를 지원하기 때문에, 게임 서버 구현에 자주 사용됩니다. Node.js의 이벤트 루프비동기 처리 모델은 실시간 온라인 게임 서버에 적합합니다.
  • WebSocket을 사용한 실시간 통신: WebSocket은 양방향 통신을 지원하여 클라이언트와 서버 간의 실시간 데이터 전송을 가능하게 합니다. 비동기적으로 클라이언트의 요청을 서버에서 처리하고, 이를 다른 플레이어에게 빠르게 전달할 수 있습니다.

 

소개한 서버들중 본인이 만드려하는 과제에 맞춰 서버구성을 잘 적용해야 합니다.

 

'TIL(Today I Learned)' 카테고리의 다른 글

RDBS, MySQL  (0) 2024.11.22
AWS배포하기 프로세스가 종료되지 않는 문제  (0) 2024.11.21
Node.js 간단한 메모장 만들기  (0) 2024.11.20
Node.js 2일차  (0) 2024.11.19
Node.js 1일차  (0) 2024.11.18