1. Spring와 Node.js
Spring은 Java를 이용하는 프레임워크이고, Node.js는 Javascript 런타임이다. 둘 다 서버 개발을 할 수 있다.
2. 차이점
2-1. Spring
⭕ 장점
- 크기와 부하의 측면에서 경량이다.
- Spring이 안정적이라는 말을 많이 한다. 그 이유는 레퍼런스가 많아 이슈를 쉽게 해결할 수 있고, 자유성이 낮다는 점에서 안정적이라고 생각한다.
- 스프링은 2002년 로드 존슨이 최초로 개발하였기에 Spring을 다루는 개발자가 많아 인력 문제도 없다.
- 많은 개발자들이 오랫동안 사용하고 유지해왔기 때문에 알려진 버그와 보안 문제는 많이 잡혀있어서 안정성이 우수하다.
- 정형화된 패턴이 있다.
- IOC/ DI로 느슨한 결합도를 유지한다.
- 자유도는 낮지만 안정적이다.
❌ 단점
- 설정이 복잡한 편이다.
2-2. node.js
⭕ 장점
- V8 엔진을 기반으로 한 성능이 뛰어나다.
- 싱글스레드, 비동기 IO 처리에 기반한 빠른 속도를 가진다.
- 파일 I/O나 네트워크 처리를 이벤트 드리븐 방식으로 처리하기 때문에 빠른 처리가 가능하다.
- CPU의 대기시간을 최소화 할 수 있다.
- CPU 부하가 적고, 많은 커넥션을 동시에 처리해야 하는 구조에 적합하다.
- 자바스크립트를 이용해서 개발할 수 있기 때문에 프론트엔드 개발자의 진입장벽이 낮다.
- 기존 Java 서버에 비해 생산성이 훨씬 높다.
❌ 단점
- 싱글스레드 모델이기 때문에 하나의 작업에 시간이 오래걸리면 시스템 전체의 성능이 급격하게 떨어진다.
- 에러가 발생할 경우 프로세스 자체가 죽어버리므로 주의해야한다.(watch dog 등으로 처리 가능)
- 멀티코어 활용을 위해서 cluster 모듈을 이용해야 하고, 세션을 공유할 경우 부가적인 작업이 필요하다.
- 비동기 제어가 까다롭다.
3. 주요특징
Spring MVC의 다중요청 처리
Spring MVC는 Thread를 여러개 두어 (Multi-Thread) 다중요청을 동시에 처리합니다. 각 요청마다 별개의 Thread가 해당 요청을 응답까지 책임지는 구조입니다.
마치 식당에서 여러명의 웨이터(server)가 여러 손님(client)들의 요청을 하나씩 분담하는 구조입니다. 이러한 방식에서 많은 웨이터를 두면 손쉽게(?) 많은 손님들의 요청을 동시에 처리할 수 있습니다. 다만, 일반적인 식당에서는 웨이터가 손님을 직접적으로 대응하는 시간보다 주방(kitchen)에서 음식을 조리하는 시간이 더 오래 걸리기 마련입니다. 주방에서 조리하는 시간에 웨이터들은 음식이 나오기만을 하염없이 기다린다면 식당 주인 입장에서 자원의 낭비가 수반되는 방식입니다.
Spring MVC의 Multi-Thread방식에서 I/O 작업이 수반된다면 위의 예제와 같은 자원의 낭비가 발생됩니다. Thread가 수행하는 요청과 응답에 대한 일처리에 비하여, I/O 작업은 훨씬 긴 작업시간을 가지고 있고 이러한 시간동안 Thread들이 블로킹되기 때문입니다. Thread의 갯수가 증가될때마다 컨텍스트 스위칭이 빈번하게 일어나게 될 것이고 이로 인한 성능 저하도 야기 될 수 있습니다.
Node.js의 다중요청 처리
반면에 Node.js는 단 한개의 Thread로 (Single-Thread) 모든 요청을 처리합니다.
한개의 Thread만으로도 Spring MVC의 처리속도와 비견될 수 있는 이유는 Node.js가 완전한 비동기-논블러킹 방식의 I/O 작업을 수용하기 때문입니다. 상대적으로 긴 시간이 소요되는 I/O작업을 기다리지 않고 client의 요청과 응답만을 담당하기 때문에 더 적은 자원으로도 높은 성능을 기대할 수 있습니다. (사실 Single-Thread 방식은 Node.js의 특징이라기 보다는 Javascript의 특징이라고 보는게 맞습니다.)
+ 추가적으로 단 한개의 Thread만이 운용되기 때문에 기존 Multi-Thread 방식의 동기화 문제에서 완전히 자유롭습니다. 이로 인한 개발편의성의 이점도 얻을 수 있습니다.
그래서 Node.js가 Spring MVC보다 성능상 유리할까?
Node.js가 Spring MVC보다 성능상 우위에 있다라고 말하기 위해서 몇가지 전제사항이 있습니다.
1. 다중처리를 동시에 처리하도록 요구된다.
2. 많은 I/O 작업을 수행한다.
3. 단순한 CPU 작업만을 진행한다.
이같은 전제사항은 오늘날의 '전형적인' 웹 애플리케이션의 특징입니다. Node.js가 다른 웹프레임워크에 비해서 성능상 우위에 있다고 쉽게 거론되는 이유는 Node.js가 이러한 '전형적인' 웹 애플리케이션의 요구사항과 잘 어우러지기 때문입니다.
하지만 이러한 범주에서 벗어난 웹 애플리케이션이라면 반드시 Node.js가 정답이 될 수 없습니다. I/O작업이 많지 않고 강도높은 CPU 연산이 요구된다면 한개의 Thread를 사용하는 Node.js는 급격한 성능 저하가 야기됩니다.
Spring WebFlux의 등장
(Java 진영은 언제나 그래왔듯이 정답을 찾을 것입니다.)
Spring WebFlux는 Spring 5에서 도입되었습니다. Spring WebFlux는 Node.js와 유사하게 완전한 비동기-논블러킹 방식의 I/O 작업이 가능하고, 이를 제어하기 위한 Event Loop를 두었습니다. 다른 점이라면 Spring WebFlux는 Single-Thread 기반이 아닌 Multi-Thread 방식입니다. 다만 Spring MVC처럼 각 요청에 하나의 Thread가 대응 되지 않고 다수의 요청을 처리하는 구조입니다.
Java진영에서도 비동기-논블러킹 방식의 장점을 취하기 위해서 Node.js를 고려하지 않고 Spring 만으로도 개발이 가능하게 된 것입니다.
'Programming > MERN' 카테고리의 다른 글
HTML 정리 (0) | 2020.12.22 |
---|---|
! 인증 체크하기 ! (0) | 2020.11.10 |
🌺 회원가입 페이지 만들기 🌺 (0) | 2020.11.09 |
👨👩👧👦 로그인 페이지 만들기 👨👩👧👧 (0) | 2020.11.03 |
CSS Framework / Redux 개념 및 설정 (0) | 2020.11.02 |