Spring vs Nest (자료수집 중 보류...)

·2022년 6월 27일
9

SKILL

목록 보기
7/16
post-thumbnail

우리나라는 상대적으로 자바 스프링이 강세인 편이다.
그때문에 노드 백엔드 비중이 상당히 적다.

하지만 최근들어서 노드를 백엔드로 사용하기 시작하고
스타트업의 언어라고 불렸던 네스트가 최근들어서 배민, 토스, 네이버가 사용하기 시작했다.

그렇다면 왜? 자바 기반에서 노드로 넘어오게 되는 것인지
스프링에서 네스트로 넘어오는 것인지

그렇다면 두 개의 차이는 무엇인지 적어보는 챕터다.

Java와 NodeJS(Javascript)

자바와 자바스크립트는 같은 형제처럼 보이지만 그게 아니다.

자바스크립트는 무려 10일만에 만들어진 프로그래밍 언어인데(한달만 걸렸더라도...)
그 당시 자바의 인기가 상당히 많았어서, 인기를 좀 같이 가져오고 싶다는 이유로
자바스크립트라는 이름을 붙였다고 한다(저작권의식은 어디에 간거지?)

이러한 사실을 모르는 많은 사람들은 두 개의 언어는 비슷하겠지! 라는 착각을 하는데
실제로는 다른 부분이 상당히 존재해서 어렵다기보다는 헷갈린다. 라고 이야기를 한다.

간단하게 차이를 살펴보자면 아래의 표와 같다.

JavaNode
ThreadMultiSingle
I/O 타입BlockingNon Blocking
타입언어정적동적
인력풀상상초월아직은 적은 편
특징모바일 앱 제작 가능한개의 언어로 웹 제작 가능

큰 분류로 나눠보면 이정도가 있을 것 같다!

이것을 조금 더 디테일하게 확인을 해보자.

여기서 잠깐! 프로세스와 스레드란

두 개는 엄밀히 다른 것이기에, 이것의 차이를 알아야한다.
정말 간단한 설명이 진행되기에 자세한 것은 글 하단 참고자료에 넣어놓겠다.

쉽게 확인하는 방법은 바로 작업관리자를 켜보는 것이다.

위의 사진을 보면 명확하게 구분을 할 수 있는데

  • 프로세스란 현재 컴퓨터가 실행되고 있는 프로그램을 이야기한다.
    • 프로세스 이름이라는 세로줄에는 한개 한개의 프로그램이 있는 것을 볼 수 있다.
  • 스레드는 프로그램을 작동시키는 일꾼이라고 볼 수 있다.
    • 스레드라는 세로줄에는 한개 한개의 프로세스마다 각기 다른 수를 확인할 수 있다.

CPU를 찾다보면 N코어 M스레드라는 말을 볼 수 있는데
한번에 작업을 할 수 있는 단위라고 생각을 하면 된다.

그래서 그래픽작업이나 3D작업같이 수많은 연산이 필요할 경우
상대적으로 코어와 스레드가 많았던 AMD의 제품을 추천해줬던 것이다.

멀티 스레드와 싱글 스레드의 차이

자바는 멀티스레드, 노드는 싱글스레드라고 적혀있었다.

하지만 위에서는 스레드는 한번에 작업을 할 수 있는 단위라고 설명을 했던 것을 생각해본다면
스레드는 무조건 많은게 좋지 않을까? 라는 생각이 들게 된다.

성능적인 편에서는 당연히 많을수록 좋은데 다른 관점에서 생각을 해보자.

  • 지금 작업에서는 1개만 필요한데?
    • 즉 많은 작업이 아닐 경우에는 사용하지 않기 때문에 낭비가 될 수 있다는 것이다.
  • 또 스레드는 일꾼이라는 말을 했었는데, 사공이 많으면 배가 산으로 간다는 속담이 있다.
    • 멀티스레드를 구현하여 관리를 하는 것에 대한 어려움이 존재한다.
  • 스레드(일꾼) 한개가 망가지더라도 영향이 없다.
    • 개발자가 한명인 회사에 그 사람이 연차를 쓴다면, 회사가 안굴러갈 것이다.
    • 안정성이라는 것을 보장할 수 있는 것이 멀티 스레드의 큰 장점이다.
  • 한개의 스레드가 힘들어하더라도, 작업은 진행된다.
    • 싱글스레드의 경우에는 과도하게 연산이 많이 필요한 작업이 있다면 뒤의 작업이 멈추게 될 것이다.
    • 하지만 멀티스레드의 경우에는 다른 스레드들이 있기 때문에 작업이 멈추지 않고 계속 진행된다.

Blocking ? Non-Blocking?

노드를 공부하다보면 매번 나오는 이야기 중 하나가 Non-Blocking I/O를 지원한다는 것이다.
그리고 노드는 싱글스레드라는 이야기를 한다.

하지만 정확하게는 노드는 이벤트 루프가 싱글스레드다. 라고 이야기를 해야한다.

왜냐하면 모든 것이 싱글스레드였다면 비동기라는 방식이 작동할 수 없다.
일하는 사람이 한명인데 일을 여러개준다고 한들 할 수 있는게 아니기 때문이다.

아래 노드의 시스템 사진을 한번 보자.

노드의 구조는 V8 엔진과 LIBUV라는 라이브러리가 붙어있는데
LIBUV에서 Non-Blocking I/O와 멀티쓰레드를 지원한다.

현재 작업이 진행되고 있더라도 막지 않고 또 다른 작업을 진행할 수 있다. 라는 의미가
바로 Non-Blocking I/O를 뜻하는 것이고
또 다른 작업을 하기 위하여 LIBUV에멀티쓰레드를 지원한다.

작업이 완료된 것을 한개씩 실행을 이벤트루프가 시키기 때문에
노드는 싱글스레드다. 라고 이야기를 하는 것이다.

정적 언어? 동적 언어?

프로그래밍 언어를 다양하게 나눌 수 있는데, 그 중 한가지가 정적/동적 언어에 관한 것이다.

컴퓨터에게 명령을 시키는 방법은 0과 1로 이루어져있는 어셈블리어를 넘겨주는 것인데

컴파일러 를 통해서 우리가 작성한 코드가 어셈블리어로 변환되고
어셈블러 를 통해서 그것을 해석한 후 실행이 되는 형식으로 되어있다.

여기서 정적 동적언어의 차이는 바로 언제 자료형이 결정되는가?라는 것이다.

  • 정적 언어같은 경우에는 컴파일을 할 때 자료형이 결정된다.
    • 그렇기 때문에 코드에 자료형 선언이 있어야한다.
    • 미리 타입을 지정하기 때문에 타입 에러로 인한 문제를 미리 잡을 수 있어 안정성이 높다.
    • 반대로 타입의 제한으로 코드를 짜는 것이 어려워질 수 있다.
  • 동적 언어같은 경우에는 실행이 되기 직전(런타임)에 자료형이 결정된다.
    • 코드가 실행되기 직전에 결정되기 때문에 타입을 선언하지 않아도 무관하다.
    • 타입을 지정하지 않기 때문에 유연성이 높다.
    • 반대로 타입 에러가 언제 발생할지 모른다는 문제가 있다.

자바스크립트는 그 자체가 동적 언어이기 때문에 1+2+"3"=33이라는 신기한 것을 볼 수 있었다.
그래서 이러한 문제를 해결하기 위하여 타입스크립트가 생겨나게 된 것이다.

그럼 어떤 프로그래밍 언어를 사용해야하는 것일까?

대표적인 것들로 자바와 노드의 차이를 알아볼 수 있었다.
그렇다면 어떤게 더 좋은 것일까?

상황에 따라서 어떤게 좋은지 결정된다. 라고 이야기를 할 수 있겠다.

  • 자바(스프링)를 사용하는 것이 좋을 때
    • 핀테크와 같이 금융정보들이 오가서 안정성이 필요한 서비스
    • 연산이 많이 필요한 서비스
    • 프로젝트 단위가 큰 경우
  • 노드를 사용하는 것이 좋을 때
    • 요청이 많지만 요청의 데이터가 작은 서비스 (I/O가 많음)
    • 실시간 스트리밍이 필요한 서비스
    • MSA로 서비스를 분리하여 붙일 경우(프로젝트가 작음)
    • 확장성을 염두해야하는 경우
    • 빠르게 작업이 필요한 경우

사실 해외로 눈을 돌려보면 Node로 만들어진 웹사이트가 압도적으로 많다.

한국은 왜 자바공화국이 되었는가? 라는 주제로 글을 써봐도 좋을 것 같다(....)
아 자바공화국이라는 말은 다른 의미로도 바라볼 수 있는데

그것은 바로 인력풀과 커뮤니티(정보)가 매우 많다는 것이다.
스레드가 남는 것이 낭비가 될 수도 있겠지만 노드를 새롭게 익혀서 구현을 한다는 것과
기존에 엄청 잘하는 개발자를 대리고 스프링을 이용해서 구현을 한다는 것

두 가지의 경우의 수에서 계산을 해보면 당연하게도 후자를 선택하게 될 것이다.
그러다보니 모든 분야에서 스프링을 사용하고 있지 않나 라는 생각이 든다.

왜냐하면 해외의 경우에는 노드가 압도적으로 많다(....)


이제 드디어 원래 쓰고싶었던 스프링과 네스트를 비교할 수 있게 된 것 같다.

왜냐하면 개인적으로 생각하는 것은 스프링과 네스트를 선택하는 차이는
위의 적어놓은 것때문에 발생한다고 생각하기 때문이다.

현재까지 찾기로는 스프링과 네스트의 차이는.....
의존성을 주입해주는 곳이 다르다는 것...?

스프링 : 빈 컨테이너
네스트 : 프로바이더

Spring과 Nest

이 글을 쓰고 싶었던 메인 주제다. 문제는 스프링을 다뤄보지 않았기 때문에....
정말 많은 자료를 보고 그것으로 쓴다는 점이 아쉽다고 할까.

매번 Nest를 설명하는 글에는 이러한 내용이 달려있다.

어? 스프링이랑 코드가 엄청 비슷하네요?

내가 궁금한것은 왜? 비슷하게 됐을까. 라는 의문이다.

사람들은 필요성에 의하여 있던 것을 개선하고, 새로운 것을 만들어내게 되는데
Nest는 Angular에서 상당수를 본따왔다고 한다.

그렇다면 Angular와 Spring의 구조는 비슷한 것인지?까지 알아보는 것은 무리가 있겠지만(....)

Spring과 Nest는 어떤 점이 비슷한지, 차별점이 있는지 적어보고 싶어서 이러한 글을 쓰게 되었다.

Spring의 특징

빈 컨테이너를 이용한 IoC

스프..링...너......좀...ㅠㅠ

Nest의 특징


참고한 자료 & 보면 좋은 자료

[CS 기초] 정적타입 언어 vs 동적타입 언어
Node.js vs. Spring Boot — Which Should You Choose?
Java Spring vs Node JS
NestJS vs Spring Framework - the comparison

profile
물류 서비스 Backend Software Developer

4개의 댓글

comment-user-thumbnail
2022년 6월 27일

스프링은 결국 엔터프라이즈급이면 다쓰게 되는거같아요~ 압도적인 안정성, 2003년부터 만들어져서 끊임없이 유지보수된 spring 모듈들
JPA 엄청좋고, Test도 Nest에비해선 정~말편해요

1개의 답글
comment-user-thumbnail
2024년 3월 1일

thanks for valuable info
gcp training in hyderabad

답글 달기
comment-user-thumbnail
2024년 8월 7일

글이 너무 흥미진진합니다. Spring 과 Nest.js 의 본질이 갖는 특성들을 나무가 아닌 숲으로서 차근차근 파고 들어가는 형식이 마음에 드는데 아직 완성된 글이 아니라 조금 아쉽네요.. 더 읽어볼 수 있으면 많은 개발자분께 크게 도움이 될 것 같네요. 2년이 지난 지금은 어떠신가요? 후일담이 궁금합니다!

답글 달기