JavaScript & Node.js
[Spring과 node 비교 (Thread)]
Haksae
2021. 12. 27. 00:46
1. 용어 정리
- 동기(Synchronous)
- 동기는 요청과 동시에 그 결과가 일어나는 뜻이다. 즉 함수를 호출 했을 때 이 함수의 결과를 호출한 쪽에서 처리하면 동기
- 비동기(Asynchronous)
- 비동기는 요청과 그 결과가 동시에 일어나지 않는 뜻이다. 즉 함수를 호출 했을 때 함수의 결과를 호출한쪽에서 처리하지 않을 수도 있다.
- 블로킹(Blocking)
- 블로킹은 자신의 수행결과가 끝날 때까지 제어권을 갖고 있는 것을 의미한다. 즉 연산이 끝날때까지 다른일을 수행하지 않고 대기하는 방식
- 논블로킹(Non-blocking)
- 자신이 호출되었을 때 제어권을 바로 자신을 호출한 쪽으로 넘기며, 자신을 호출한 쪽에서 다른 일을 할 수 있도록 하는 것을 의미합니다. 즉 연산이 끝날 때 까지 대기하는 것이 아니라 다른일을 바로 수행하는 방식
2. Spring(1-4) vs Node.js
- Spring 1-4 : Multi-Thread, 동기방식, blocking
- 노드 등장 이전 스프링은 멀티 쓰레드를 사용하여 다중요청을 동시에 처리하였음
- 한개의 쓰레드가 하나의 요청을 담당하여 응답까지 책임지고 반환하고 요청이 들어오면 바로 결과를 반환해주는 동기 방식을 사용하고 연산이 완료되는 동안 기다리는 블록킹 방식
- 문제점 : 쓰레드가 응답을 기다리면서 블록킹하는 시간이 많아지면 효율적이지 않음
- Node : single-Thread, 비동기 방식, non-blocking
- 싱글 쓰레드를 사용하여 한개의 쓰레드에서 모든 요청을 처리하는 방식
- 기존의 스프링과 달리 요청이 들어오면 바로 결과를 주는 것이 아니라 작업이 완료되는 대로 결과를 넘겨주는 비동기 방식
- 한개의 쓰레드는 작업이 진행되는 동안 멈춰있는 것이 아니라 다른 작업을 수행할 수 있는 non-blocking
- 문제점 : 갑자기 요청이 많아지고 복잡해지면 서버 반응이 느려진다.
3. Spring의 보완 (5 이후)
- Spiring WebFlux
- 스프링의 쓰레드 단점을 보완하고자 스프링 웹플럭스가 spring5부터 도입됨
- 노드의 장점을 가져와서 업그레이드함
- 기존의 멀티 쓰레드 방식을 유지하면서, 각각의 요청에 하나의 쓰레드가 대응되는 것이 아니라 싱글 쓰레드처럼 다수의 요청을 처리하게하게 되는 구조이다.
4. 정리
- 스프링을 사용하면 좋은 경우
- 복잡한 요구 사항이 많은 경우 스프링을 사용하는 것이 유리하다. ex) 실시간 게임, 영상처리
- node를 사용하면 좋은 경우
- 간단한 요구사항이 많은 경우 노드를 사용하는 것이 유리하다. ex) 채팅, crud기반 서비스
참고문서 : https://velog.io/@hyundong_kk/Spring과-node-비교-Thread-중심