사이드 프로젝트에서 Node JS를 선택한 이유
MSA로 사이드 프로젝트를 계획하면서 하나의 언어만 사용하기보다 다양한 언어와 환경을 구축해 보는 것이 재미있을 것 같아서 새로운 Micro Service에는 Node JS를 사용하기로 결정했다.
Node를 선택한 이유
빠른 개발 속도와 쉬운 난이도
아래는 Get 요청을 통해 Hello World를 반환하는 Node와 Spring 코드에 대한 비교이다.
딱 보기에도 Node JS는 매우 간결하다.
개인적으로 Spring의 경우 코드의 양이 많아졌을 때 Node 보다 구조화가 잘 되어있기 때문에 읽을 때는 더 편하다고 생각하지만, 다양한 설정이 필요하고, 코드의 양이 Node 보다 많기 때문에 개발 속도는 Node가 더 빠를 것으로 보인다.
더불어 Spring은 워낙 규모가 크다보니 기능도 많고 알아야 할 지식이 많은 반면, Node는 상대적으로 공부할 내용이 적기 때문에 학습 곡선이 낮아 스프링을 할 수 있는 개발자라면 언제든 Node를 시작할 수 있다고 생각한다.
// Node JS
app.get('/', (req, res) => {
res.send('Hello world');
});
// Spring
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "Hello world";
}
}
프론트엔드까지 1+1
Node JS는 js와 동일한 문법을 가지니, 프론트엔드 문법까지 자연스럽게 익힐 수 있고, 본인이 프론트 코드를 작성하지 않더라도, 프론트엔드 개발자와의 소통에서도 분명 도움이 될 것이다.
많은 레퍼런스
언어 점유율만 봐도 Node JS는 매우 많은 레퍼런스와 커뮤니티를 가지고 있어서 개발할 때 도움을 받을 수 있다.
I/O와 실시간, 동시성 처리에 적합
Node는 싱글 스레드 이벤트 루프 기반의 비동기 처리가 장점이다.
모든 요청을 이벤트 루프(싱글스레드)로 받아서 해당 요청을 처리하는 동안 다음 요청을 처리하는 방식으로 CPU가 쉬지않고 일해서 속도를 높이는 방법이다.
Spring의 경우 각 요청에 대한 스레드를 할당해서 동시에 병렬적으로 요청을 처리한다는 점에서 차이가 있다.
결론
Node는 I/O 처리 속도가 매우 빠르다는 장점이 있지만, 싱글 스레드이기 때문에 하나의 작업에 너무 오랜 시간이 소요된다면 오히려 성능이 떨어지게된다.
따라서 높은 CPU 처리량을 요구하는 경우 Spring이 적합하고, Node는 더 낮은 스펙의 서버에서도 잘 동작한다.
이런 이유로 Micro Service 개발에 Node를 많이 사용하는 것 같다.
또한 Node는 이벤트 루프가 싱글 스레드인 것이지 멀티스레드 병렬처리가 불가능한 것이 아니다. 다만 Spring에 비해 복잡하다.