서버 애플리케이션 플랫폼의 큰 두 축은 Spring Boot와 Node.js이다.
Node.js
-특징
Node js는 Non-blocking I/O를 처리하는데 최적화된 플랫폼이다.
Non-blocking I/O는 다른 작업이 처리되는 걸 기다리는 도중에 다른 작업을 하는 것을 말하며 짧은 시간에 여러 작업을 처리할 수 있어 효율적이다.
다른 언어에서도 이런 형태로 구현은 가능하지만 코드가 너무 지저분해지고 구현이 어려운 단점이 있었는데 Node js에서는 비동기식 함수를 통해 코드 상에서 이 작업을 구현하기 간편하게 만들어줬다.
실제로 최근에 만든 사이드프로젝트에서 Non-blocking I/O를 구현하는게 정말 간편했다. 그리고 내부적으로는 하나의 Thread를 이용해서 구현했기 때문에 메모리를 크게 잡아 먹지도 않아 효율적이다. 똑같은 애플리케이션을 돌려도 다른 프레임워크보다 Node.js가 소모하는 메모리의 크기가 적다.
-단점
JavaScript 언어를 사용한다는 점이다.
JavaScript가 배우기는 참 쉬워서 적은 시간을 투자하고 금방 숙달을 할 수 있으나 프로젝트 규모가 커지면 커질수록 Type Safe 하지 못하는 점이 한계점으로 작용한다.
언어가 Type Safe 하지 못하면 내가 짠 코드가 별것도 아닌 에러로 런타임에 죽을 수도 있다.
대부분 이 에러는 Java나 C언어 를 사용했다면 빌드 중에 발생하는 컴파일 에러 종류인데 JavaScript는 빌드하는 과정이 없기 때문에 실행 전에 잡아 주질 못한다.
또한 SingleThread이다.
구현하고 서버 실행까지 매우 빠르다고 좋아 할지 모르나 이 사이에 컴파일 오류는 없을 지 꼼꼼히 봐야한다.
그리고 Type Safe하지 못해서 IDE에서 자동 완성이 잘 되지 않는다.
프로젝트가 커지면 커질수록 리팩토링을 하거나 기존 코드를 써먹어서 확장해야 할 때 자동완성 기능이 핵심인데 JavaScript를 쓰면 자동완성이 잘 안돼서 큰 애를 먹게 된다.
프론트엔드 프레임워크 React에서는 TypeScript를 도입해서 어느정도 보완하고 있는데 Node.js에서도 TypeScript를 도입하는 시도가 있다고 들었는데 어느 정도 진행됐는지 모르겠다.
Spring Boot
-특징
Java로 만든 서버 애플리케이션이다.
Java를 개발해본 사람들은 쉽게 Spring Boot에 적응 할 수 있다.
역사가 오래 됐기 때문에 개발하는데 필요한 왠만한 라이브러리는 모두 Spring Boot에 다 있다.
안드로이드 개발자가 사용한 자바 라이브러리들은 모두 Spring에서도 찾을 수 있다고 볼 수 있고 추가로 서버 개발자들이 어려움을 겪는 데이터베이스 관리도 스프링부트에서는 JPA라는 라이브러리를 통해 간소화 해둬서 손쉽게 다룰 수 있다.
그리고 Java이기 때문에 TypeSafe 하다.
리팩토링하거나 확장 할 때 IDE를 이용해서 수정할 점을 빠르게 체크 할 수 있는데 프로젝트 규모가 커지고 안정성이 중요해지는 시점부터는 큰 장점으로 다가온다.
내부적으로는 Multi Threading을 지원하는 구조로 짜여있어서 길고 반복적인 업무를 처리할 때 효율적이다. 많은 양의 컴퓨팅이 필요한 경우 잘 써먹으면 좋다.
-단점
한번 써보신 분들은 알겠지만 Spring Boot는 러닝 커브가 존재한다.
Node.js는 처음 배우는 사람도 하루만에 서버 구동하고 api도 하나 만들 수 있는데 Spring Boot를 공부하면 Service, Controller, Repository 에 대해서 알아야하고 각 컴포넌트는 어떤식으로 채워야하는지 공부가 필요해 해야 할 게 많다.
Spring Boot에서는 좋은 구조를 유도하기 위해 이런 형태의 디자인을 권장하는데 초심자한테는 러닝 커브가 좀 있다.
그리고 boilerplate 코드가 많다. 스프링에서 권장하는 구조랑 라이브러리들을 사용하려면 이런 저런 코드를 만들어야 하는데 처음에는 어려우나 숙달되면 귀찮아진다.
그래도 안쓰는 것 보다 낫긴 하지만. 내부적으로는 메모리를 좀 많이 쓴다.
Multi thread 환경이기 때문에 여러개의 Thread를 띄우다 보니까 어쩔 수 없이 생긴 문제인 것 같다.
비교
언제 어떤기술을 사용하는게 유리할까?
Cpu Intensive
cpu intensive한 작업이 많은 경우 Node.js가 불리(모든 req를 main thread로 처리하는데, cpu-intensive작업의 경우 딥러닝, 데이터분석, 머신러닝 등 main thread를 잠깐 멈추게 함)
io 작업이 아니라 cpu를 많이 사용하도록 작성된 함수가 있는데 어떤 요청이 들어와서 이 함수를 사용한다고 가정해보자. 해당 코드는 libuv에 있는 스레드풀로 던겨저서 요청을 비동기방식으로 처리하지 않고 이벤트 루프 자체에서 blocking 당하고 작업이 끝날때 까지 다른 요청들은 계속해서 쌓이게 되면서 성능이 저하된다.
Concurency
채팅 서비스의 경우 동시에 엄청난 클라이언트 요청이 발생할 수 있다.
일반적인 채팅서비스에는 단순하게 텍스트 메시지만 주고 받는데 여기서 Node.js를 사용하게 되면 유리하다.
Object DB의 API서버
mongoDB와 같은 JSON기반 DB를 사용하는 경우 Java를 선택하면 JSON데이터를 읽어오고 쓸때 JSON변환과정이 생기게 된다.
Nodejs를 사용하면 JSON을 별도의 변환없이 바로 사용할수 있어 훨씬 유리하다.
Node.js가 조흔 상황
- 다중처리를 동시에 처리하도록 요구된다.
- 많은 I/O작업을 수행한다.
- 단순한 CPU작업만을 진행한다.
이같은 전제사항은 오늘날 전형적인 웹 애플리케이션의 특징이다. 따라서 Node.js가 spring에 비해 성능상 우위라고 거론되는 이유는 Node.js가 이러한 '전형적인' 웹 애플리케이션의 요구사항과 잘 어우러지기 때문이라고 할 수 있다.
(반대로 만하면 I/O작업이 많지 않고 강도 높은 CPU연산이 요구된다면 한개의 Thread를 사용하는 Node.js는 급격한 성능 저하가 야기된다.)
출처:
https://winteri-i.tistory.com/48
https://velog.io/@syi9595/nodejsexpress-vs-springboot
https://selfish-developer.com/entry/Nodejs-vs-Spring-Boot