[나만무] WebSocket 연결이 서버를 먹어치운다 – 리소스 관점에서 본 연결 관리 전략

맹쥐·2025년 7월 6일
5

이번 프로젝트에서 소켓 통신을 맡게 되면서, 한 가지 신경 쓴 게 있었다.
바로 [ 불필요한 소켓 연결을 줄이는 것 ] 이었다.

그런데 팀원 중 한명이
"근데, 소켓 연결 많으면 뭐가 안 좋은데?"라고 물어봤을 때,
"우리 돈이 많이 나가니까...? " 대답을 이렇게밖에 못 했다.

그 말도 틀리진 않았지만, 그 순간
내가 정확히 왜 그런지 설명 못 하네?싶었다.

그래서 이번 기회에 확실히 정리해보고자 한다.


네트워크 트래픽과 리소스, 왜 중요할까?

웹 개발을 하다 보면 종종

  • "네트워크 트래픽이 많다"
  • "리소스 낭비다"
  • "소켓이 너무 많이 연결된다"

근데 이게 정확히 뭘 의미하는지,
왜 줄여야 하는지 헷갈릴 때가 많다.

오늘은 이 두 가지 개념을 알아보자.

  • 네트워크 트래픽(Network Traffic)
  • 네트워크 리소스(Network Resources)

리소스와 트래픽을 '도로'에 비유해보자

서버와 클라이언트를 이어주는 도로가 있다고 생각해보자.

이 도로 위를 달리는 자동차가 바로 네트워크 트래픽, 즉 오고 가는 데이터의 양이다.
도로 자체네트워크 리소스다.

도로 = 리소스 (서버/클라이언트가 데이터를 보내기 위해 확보한 자원)
자동차 = 트래픽 (실제로 오고 간 데이터)

그럼 "리소스 낭비"는 왜 문제일까?

도로를 만들고 유지하려면 비용이 든다.
가드레일, 표지판, 관리 인력, 도로 점검 등 운영 리소스가 필요하다.

그런데 생각해보자.
차는 다니고 있지만, 그 도로가 꼭 필요한 건 아니라면?
그냥 비효율적으로 연결만 유지되고 있는 상태일 수도 있다.
(서버와 클라이언트가 데이터를 주고 받지만 필요하지 않는 데이터라면?)

도로를 계속 유지하느라 비용이 든다.
관리 인력은 분산되고, 예산도 낭비된다.

차가 다니는 만큼 트래픽도 쌓인다.
도로 유지뿐 아니라, 그 위를 달리는 자동차(데이터)가 많아지면
전체 시스템에 부담이 늘어날 수밖에 없다.

이게 바로 리소스 낭비다.
리소스 낭비는 자연스레 트래픽 증가로 이어질 수 있다.


1. 네트워크 트래픽(Network Traffic) 이란?

인터넷을 통해 주고받은 모~든 데이터를 말한다.
웹에서 우리가 어떤 행동을 하든 대부분은 트래픽을 유발한다.

[예시]

  • 브라우저에서 서버로 GET 요청을 보낼 때
  • 서버가 HTML, JSON, 이미지 등을 응답할 때
  • 소켓을 통해 실시간 메시지를 보낼 때
  • 영상 스트리밍을 할 때

우리가 웹에서 무언가를 “요청하고 받는 순간”마다 트래픽이 발생한다.

오고가는 데이터

  • 이미지, JS/CSS 파일
  • JSON 데이터
  • 채팅 메시지
  • 웹소켓/WebRTC 등 실시간 데이터

❗ 트래픽이 많으면 뭐가 문제일까?

1. 데이터 사용량 증가 - 사용자 입장

  • 느리다.
  • 데이터 요금도 올라 갈 수 있다.

2. 서버/인프라 비용 증가 - 서버 입장

  • 돈 나간다 💵 (전송량 기준으로 과금하는 경우가 많기 때문이다.)
  • AWS, Vercel, Netlify는 일정 트래픽 이상이면 추가 요금이 발생한다.

2. 네트워크 리소스(Network Resources)란?

[정의]

"인터넷 통신을 위해 쓰는 서버/클라이언트의 자원"이라고 보면 된다.
트래픽은 오가는 양이고, 리소스는 그걸 보내고 받기 위해 드는 힘이라고 생각하면 쉽다.

어떤 것들이 있을까?

리소스의미
소켓 연결 수서버가 동시에 처리할 수 있는 연결 개수 (제한 있음!)
대역폭1초에 주고받을 수 있는 데이터 양
CPU 시간데이터를 처리하는 데 걸리는 계산 시간
메모리연결을 유지하거나 데이터를 잠깐 저장하는 공간

리소스를 낭비하면 어떤 일이 벌어질까?

예를 들어, 사용자가 채팅 기능을 쓰지 않는데도 소켓을 연결하면?

  • 서버는 그 연결을 유지하느라 메모리와 리소스를 쓴다.
  • 클라이언트도 이벤트 리스너를 붙여놓기 때문에 메모리/CPU가 점점 쌓입니다.
  • 연결이 많아질수록, 서버는 다른 유저를 처리할 여유가 줄어듭니다.
  • 결국엔 전체 시스템이 느려지거나, 에러가 발생할 수도 있어요.

좀 더 자세히 알아보자.
서버와 클라이언트는 도대제 어떤 자원을 쓰는걸까?
소켓 연결이 유지되려면 필요한 자원들을 예시로 들어보자.

서버 쪽 리소스

리소스설명
파일 디스크립터 (FD)소켓 1개마다 서버는 FD 1개를 씁니다 (리눅스 기준 최대치 존재)
메모리연결마다 버퍼, 메시지 큐, 연결 상태 등 메모리 차지
CPU 처리 시간연결 유지, 핑/퐁 처리, 이벤트 전파 등에 CPU 시간 소모
이벤트 루프 처리량연결 수가 많아질수록 I/O 이벤트 처리량도 부담됨
네트워크 스레드 수일부 서버 구조는 연결 수만큼 스레드/컨텍스트 필요 (멀티스레드 서버 등)

클라이언트 쪽 리소스

  • 웹브라우저 메모리
  • 핸들러 등록 수 증가
  • 전력 소모 (모바일에서 특히 중요)

예시로 살펴보자.

A 사용자가 채팅 기능을 쓰지도 않는데 백그라운드에서 소켓이 연결되어 있다면?

[서버]
ping/pong을 일정 주기로 주고받고,
연결 상태를 추적하고 (접속 중인지, 에러인지 등),
심지어 브로드캐스트 메시지를 보내고
메시지가 안 오더라도 “듣고 있는” 상태를 유지해야 해요.

→ 즉, 아무 일도 안 해도, CPU + 메모리 + 연결 슬롯(FD)이 점점 소비된다.


그럼 우리는 어떻게 해야 할까?

개발자 입장에서 할 수 있는 건 생각보다 단순하다.

1. 불필요한 요청/연결을 최소화

  • 예: 채팅을 쓸 때만 소켓 연결, 필요할 때만 fetch

2. 컴포넌트 리렌더링 최적화

  • React.memo, 조건부 렌더링 등 사용

3,. 지속적인 모니터링과 트래픽 분석

  • Chrome DevTools, 서버 로그, APM 툴 활용

마무리

"네트워크 트래픽"과 "리소스"는 그냥 기술적인 용어가 아니다.
성능, 사용자 경험, 그리고 비용에 직접적인 영향을 주는 핵심 개념이다.

  • 성능에 영향을 주고
  • 유저 경험을 떨어뜨리고
  • 실제로 비용도 증가시킵니다.

결국, 우리가 "불필요한 연결을 줄이자"는 건
단순히 돈을 아끼기 위한 게 아니라,
더 빠르고 안정적인 시스템을 만들기 위한 기본 원칙이었다.

성능 최적화를 위해서
지금 이 연결이 꼭 필요한지? 를 늘 생각해보자.

profile
이유민

1개의 댓글

comment-user-thumbnail
2025년 7월 6일

좋은 정보 감사합니다 ^^

답글 달기