출처
https://codingapple.com/unit/nodejs-2-2-non-blocking/?id=1826
Node.js는 Non-blocking 이라는 장점때문에 사용합니다.
Non-blocking이라는 특성을 예시를 들어 설명해드리겠습니다.
일단 서버를 하나 만들었다고 가정합니다. CGV.com 같은 온라인 영화예매 사이트입니다.
서버는 요청을 처리하는 기계입니다. 이 서버는 그냥 사용자가 '영화 1석 예매해주세요~' 하면 온라인 티켓을 보내주는 사이트라고 보시면 됩니다.
일반 프로그래밍 언어로 만든 서버 vs Node.js 서버 두 경우를 한번 비교해드릴게요.
1. 일반 프로그래밍 언어로 만든 서버
요청 1) 영화 1장 예매좀요
요청 2) 영화 1장 예매좀요
요청 3) 영화 200장 예매좀요
요청 4) 영화 1장 예매좀요
이렇게 4개의 요청이 차례로 들어왔을 경우, 일반 프로그래밍 언어 서버는 위에서부터 차례로 하나씩 처리해줍니다.
그런데 중간에 시간이 오래걸리는 요청이 하나 있죠? 요청 3) 영화 200장 예매라는 요청입니다.
영화 1장 예매가 1초가 걸린다고 가정하면 이 요청은 200초 이상이 걸리는 무거운 작업입니다.
서버는 요청 3에서 200초 동안 열심히 요청을 처리합니다.
처리 순서는 요청 1 - 요청 2 - 요청3 (200초 대기) - 요청 4 이렇게 되겠죠.
요청 4에서 아마 불만이 나오지 않을까요?
요청 4를 한 사람은 얼마 걸리지도 않는 요청인데 200초를 대기해야 합니다. 뭔가 불합리한 느낌도 듭니다.
2. Node.js 로 만든 서버
요청 1) 영화 1장 예매좀요
요청 2) 영화 1장 예매좀요
요청 3) 영화 200장 예매좀요
요청 4) 영화 1장 예매좀요
Node.js 는 이렇게 4개의 요청이 차례대로 들어왔을 경우, 일단 접수부터 모두 받은 후 빨리 완료된 것부터 응답합니다.
누가 먼저 왔는지는 상관없습니다. 빨리 결과가 나오는 순으로 예매 후 결과를 리턴합니다.
아마 처리 순서는 요청 1 - 요청 2 - 요청 4 - 요청 3 이 되겠죠.
요청 4를 했던 사람도 빠르게 영화표를 받아볼 수 있습니다.
Node.js는 그냥 이렇게 완료가 빠른 것부터 처리할 수 있게 설계된 런타임입니다.
왜 그런지 동작 원리가 궁금하신 분들은 유튜브에 Event Loop에 대해 검색해보세요.
Node.js 가 강점을 보이는 분야는
바로 SNS, 채팅서비스 웹서버입니다. SNS같은 플랫폼을 만들 때 가장 중요한건 '한번에 많은 요청을 감당할 수 있냐'입니다.
일반 서버의 경우 1초에 10만개의 요청이 들어오면 바로 처리해주기 위해선
- 똑같은 서버를 몇만대 복사해 만들어 두거나 (Scaling)
- CPU 멀티쓰레딩을 이용하거나
- Node 처럼 Non-blocking 스타일로 코드를 짜거나
합니다.
반면, Node.js 서버의 경우엔 애초에 설계상 한꺼번에 많은 요청을 받을 수 있으니 애초에 서버 덩치를 키울 걱정 자체가 적겠죠.
하지만 처리 속도는 다른 문제입니다.
Node.js 자체가 연산속도가 빠르다고 유명해진게 아니니까요.
(피보나치 수열 계산 이런거 시키면 한참 걸립니다.)
Node.js 로 자주 만드는 것들
1. Node.js 는 위에서 설명한 SNS, 채팅 서비스에 특화된 언어라고 보시면 됩니다.
이런 서비스는 요청 처리에 힘든 수학적 연산을 요구하지 않습니다.
- 글자를 저쪽에 전달해주기
- 가끔은 여러명에게 전달해주기
이게 끝입니다. 채팅 서비스가 이런 요청 말고 더 필요한 요청이 있나요?
그래서 대량, 하지만 처리가 간단한 요청이 들어오는 채팅, SNS 서비스에 Node.js 를 많이 사용합니다.
2. Node.js는 스타트업, 프로토타입 만들기에서도 많이 사용합니다.
빠르게 시범 서비스를 만들고 싶다면 Node.js는 좋은 선택입니다.
- 일반 초보자에게도 쉽고
- 진짜 템플릿 몇 개만 복붙해도 2시간만에 빠르게 서버를 만들 수 있습니다.
- 갑자기 사용자가 터져서 대량의 요청이 들어와도 나름 감당 가능합니다. (서버가 죽진 않음)
- 자바스크립트 문법 만으로, 프론트, 백엔드 전부 가능하다는 장점이 있습니다.
장점만 많이 설명드렸는데 단점도 존재합니다.
단점은 .. 처리속도가 떨어질 수 있다. 수학 연산이나 이미지 처리 같은 라이브러리가 부족할 수 있다. Node.js 가 제공하는 Non-blocking 처리 방식은 다른 언어에서도 비슷하게 구현 가능하다 이런게 있습니다.
추가로 non-blocking I/O 에 대한 chat gpt 답변
Node.js는 싱글 스레드 이벤트 루프(event loop) 기반의 JavaScript 런타임 환경입니다.
Node.js는 주로 서버 사이드 애플리케이션을 개발하는데 사용되며, 이벤트 기반(non-blocking) 및 비동기 I/O 모델을 채택하여 효율적인 작업 처리를 지원합니다.
논블로킹 I/O는 I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행하는 방식을 말합니다. 이는 I/O 작업이 오래 걸리는 경우, 기다리는 동안 CPU가 다른 작업을 수행할 수 있도록 합니다. 논블로킹 I/O를 사용하면 여러 개의 I/O 작업을 동시에 처리하고, 블로킹되는 시간을 최소화하여 전체적인 처리량과 응답 시간을 개선할 수 있습니다.
논블로킹 I/O 를 사용함으로써 Node.js는 단일 스레드로 많은 수의 동시 연결을 처리할 수 있습니다. 이는 확장성과 성능을 향상시키는 데 도움이 됩니다. 따라서 Node.js 는 대규모 실시간 애플리케이션, 웹 서버, 네트워크 애플리케이션 등에 적합한 선택지로 간주됩니다.
논블로킹 I/O 를 사용하는 것은 개발자에게 몇 가지 장단점을 제공합니다. 이 모델은 I/O 직얍적인 작업이 많은 경우에 특히 효과적입니다. 따라서 CPU 집약적인 작업을 수행할 때는 오히려 성능 저하를 가져올 수 있습니다. 따라서 Node.js를 사용할 때는 작업의 특성을 고려하여 적절하게 비동기 및 논블로킹 방식을 적용해야 합니다.
'Backend > Node.js' 카테고리의 다른 글
[Node.js] Node.js 의 정체 (0) | 2023.05.23 |
---|