우리나라는 상대적으로 자바 스프링이 강세인 편이다.
그때문에 노드 백엔드 비중이 상당히 적다.
하지만 최근들어서 노드를 백엔드로 사용하기 시작하고
스타트업의 언어라고 불렸던 네스트가 최근들어서 배민, 토스, 네이버가 사용하기 시작했다.
그렇다면 왜? 자바 기반에서 노드로 넘어오게 되는 것인지
스프링에서 네스트로 넘어오는 것인지
그렇다면 두 개의 차이는 무엇인지 적어보는 챕터다.
자바와 자바스크립트는 같은 형제처럼 보이지만 그게 아니다.
자바스크립트는 무려 10일만에 만들어진 프로그래밍 언어인데(한달만 걸렸더라도...)
그 당시 자바의 인기가 상당히 많았어서, 인기를 좀 같이 가져오고 싶다는 이유로
자바스크립트라는 이름을 붙였다고 한다(저작권의식은 어디에 간거지?)
이러한 사실을 모르는 많은 사람들은 두 개의 언어는 비슷하겠지! 라는 착각을 하는데
실제로는 다른 부분이 상당히 존재해서 어렵다기보다는 헷갈린다. 라고 이야기를 한다.
간단하게 차이를 살펴보자면 아래의 표와 같다.
Java | Node | |
---|---|---|
Thread | Multi | Single |
I/O 타입 | Blocking | Non Blocking |
타입언어 | 정적 | 동적 |
인력풀 | 상상초월 | 아직은 적은 편 |
특징 | 모바일 앱 제작 가능 | 한개의 언어로 웹 제작 가능 |
큰 분류로 나눠보면 이정도가 있을 것 같다!
이것을 조금 더 디테일하게 확인을 해보자.
두 개는 엄밀히 다른 것이기에, 이것의 차이를 알아야한다.
정말 간단한 설명이 진행되기에 자세한 것은 글 하단 참고자료에 넣어놓겠다.
쉽게 확인하는 방법은 바로 작업관리자를 켜보는 것이다.
위의 사진을 보면 명확하게 구분을 할 수 있는데
CPU를 찾다보면 N코어 M스레드라는 말을 볼 수 있는데
한번에 작업을 할 수 있는 단위라고 생각을 하면 된다.
그래서 그래픽작업이나 3D작업같이 수많은 연산이 필요할 경우
상대적으로 코어와 스레드가 많았던 AMD의 제품을 추천해줬던 것이다.
자바는 멀티스레드, 노드는 싱글스레드라고 적혀있었다.
하지만 위에서는 스레드는 한번에 작업을 할 수 있는 단위라고 설명을 했던 것을 생각해본다면
스레드는 무조건 많은게 좋지 않을까? 라는 생각이 들게 된다.
성능적인 편에서는 당연히 많을수록 좋은데 다른 관점에서 생각을 해보자.
노드를 공부하다보면 매번 나오는 이야기 중 하나가 Non-Blocking I/O를 지원한다는 것이다.
그리고 노드는 싱글스레드라는 이야기를 한다.
하지만 정확하게는 노드는 이벤트 루프가 싱글스레드다. 라고 이야기를 해야한다.
왜냐하면 모든 것이 싱글스레드였다면 비동기라는 방식이 작동할 수 없다.
일하는 사람이 한명인데 일을 여러개준다고 한들 할 수 있는게 아니기 때문이다.
아래 노드의 시스템 사진을 한번 보자.
노드의 구조는 V8 엔진과 LIBUV라는 라이브러리가 붙어있는데
LIBUV에서 Non-Blocking I/O와 멀티쓰레드를 지원한다.
현재 작업이 진행되고 있더라도 막지 않고 또 다른 작업을 진행할 수 있다. 라는 의미가
바로 Non-Blocking I/O를 뜻하는 것이고
또 다른 작업을 하기 위하여 LIBUV에서 멀티쓰레드를 지원한다.
작업이 완료된 것을 한개씩 실행을 이벤트루프가 시키기 때문에
노드는 싱글스레드다. 라고 이야기를 하는 것이다.
프로그래밍 언어를 다양하게 나눌 수 있는데, 그 중 한가지가 정적/동적 언어에 관한 것이다.
컴퓨터에게 명령을 시키는 방법은 0과 1로 이루어져있는 어셈블리어를 넘겨주는 것인데
컴파일러
를 통해서 우리가 작성한 코드가 어셈블리어로 변환되고
어셈블러
를 통해서 그것을 해석한 후 실행이 되는 형식으로 되어있다.
여기서 정적 동적언어의 차이는 바로 언제 자료형이 결정되는가?라는 것이다.
자바스크립트는 그 자체가 동적 언어이기 때문에 1+2+"3"=33이라는 신기한 것을 볼 수 있었다.
그래서 이러한 문제를 해결하기 위하여 타입스크립트가 생겨나게 된 것이다.
대표적인 것들로 자바와 노드의 차이를 알아볼 수 있었다.
그렇다면 어떤게 더 좋은 것일까?
상황에 따라서 어떤게 좋은지 결정된다. 라고 이야기를 할 수 있겠다.
사실 해외로 눈을 돌려보면 Node로 만들어진 웹사이트가 압도적으로 많다.
한국은 왜 자바공화국이 되었는가? 라는 주제로 글을 써봐도 좋을 것 같다(....)
아 자바공화국이라는 말은 다른 의미로도 바라볼 수 있는데
그것은 바로 인력풀과 커뮤니티(정보)가 매우 많다는 것이다.
스레드가 남는 것이 낭비가 될 수도 있겠지만 노드를 새롭게 익혀서 구현을 한다는 것과
기존에 엄청 잘하는 개발자를 대리고 스프링을 이용해서 구현을 한다는 것
두 가지의 경우의 수에서 계산을 해보면 당연하게도 후자를 선택하게 될 것이다.
그러다보니 모든 분야에서 스프링을 사용하고 있지 않나 라는 생각이 든다.
왜냐하면 해외의 경우에는 노드가 압도적으로 많다(....)
이제 드디어 원래 쓰고싶었던 스프링과 네스트를 비교할 수 있게 된 것 같다.
왜냐하면 개인적으로 생각하는 것은 스프링과 네스트를 선택하는 차이는
위의 적어놓은 것때문에 발생한다고 생각하기 때문이다.
현재까지 찾기로는 스프링과 네스트의 차이는.....
의존성을 주입해주는 곳이 다르다는 것...?
스프링 : 빈 컨테이너
네스트 : 프로바이더
이 글을 쓰고 싶었던 메인 주제다. 문제는 스프링을 다뤄보지 않았기 때문에....
정말 많은 자료를 보고 그것으로 쓴다는 점이 아쉽다고 할까.
매번 Nest를 설명하는 글에는 이러한 내용이 달려있다.
어? 스프링이랑 코드가 엄청 비슷하네요?
내가 궁금한것은 왜? 비슷하게 됐을까. 라는 의문이다.
사람들은 필요성에 의하여 있던 것을 개선하고, 새로운 것을 만들어내게 되는데
Nest는 Angular에서 상당수를 본따왔다고 한다.
그렇다면 Angular와 Spring의 구조는 비슷한 것인지?까지 알아보는 것은 무리가 있겠지만(....)
Spring과 Nest는 어떤 점이 비슷한지, 차별점이 있는지 적어보고 싶어서 이러한 글을 쓰게 되었다.
빈 컨테이너를 이용한 IoC
스프..링...너......좀...ㅠㅠ
[CS 기초] 정적타입 언어 vs 동적타입 언어
Node.js vs. Spring Boot — Which Should You Choose?
Java Spring vs Node JS
NestJS vs Spring Framework - the comparison
스프링은 결국 엔터프라이즈급이면 다쓰게 되는거같아요~ 압도적인 안정성, 2003년부터 만들어져서 끊임없이 유지보수된 spring 모듈들
JPA 엄청좋고, Test도 Nest에비해선 정~말편해요