본문 바로가기

Back End/Server

[Node.js vs Spring] Node.js vs Spring의 차이

Node.js vs Spring 차이점


개요

  프로젝트 진행에 앞서 목표에 맞는 언어를 선택하기 위해 백엔드 개발에 많이 언급되는 Node.js와 Spring의 차이점에 대하여 알아본다.

 

목차

 

소개

 Node.js란? 

 

Node.js의 정의

  Node.js 는 Google Chrome의 V8 Javascript 엔진으로 빌드된 Javascript 런타임이다. 풀어서 설명하자면 C++로 작성된 Google의 고성능 오픈소스 V8 Javascript 엔진을 사용하여 Javascript로 만든 프로그램을 실행시켜주는 환경이라고 할 수 있다. 정리하자면 Node.js는 언어가 아닌, Javascript 언어가 실행될 수 있도록 해주는 환경이다.

 

 

Node.js 등장 이전 vs 이후

Node.js 이전
  • 이 전의 Javascript는 스크립트 언어이기 때문에, 특정 웹 브라우저(익스플로어, 크롬, 사파리) 안에서만 동작하였다. 
  • 즉, Javascript는 독립적으로 사용될 수 없었다.
  • Server-Client로 동작하는 웹사이트/앱에서 이 전에는 Javascript로 웹에서 표시되는 Client만 구현이 가능하였다.
Node.js 이후
  • Node.js의 등장으로 Javascript 런타임 환경이 만들어져, 웹 브라우저에서 독립되어 터미널등에서 Javascript를 실행 시킬 수 있게 되었다.
  • 즉, 웹 브라우저와 무관한 Javascript만으로 이루어진 독립적인 프로그램을 만들 수 있게 되었다.
  • Server-Client로 동작하는 웹사이트/앱에서 Server 부분에서도 Javascript를 사용할 수 있게 되었다.

 

Node.js의 특징

  1. 싱글 쓰레드(Single Thread)
    • 하나의 프로그램에서 하나의 코드만 실행된다. 따라서 하나의 힙 영역과 하나의 콜 스택을 가진다.
    • 쓰레드가 I/O Request를 받으면, 다른 처리로 요청을 보내두고 다른 작업을 처리한다. 그 후 요청하였던 작업이 끝나면 해당 이벤트를 받아 Response 하여준다.
    • 즉, 동시에 여러 Request가 오더라도, 해당 I/O를 기다리지 않아도 되기 때문에 서버의 부하가 줄어들게 된다.
    • 또한 싱글 쓰레드를 사용하기 때문에 멀티 쓰레드에 비해 메모리 절약적인 측면에서 효율적이다.
    • 이 때 이벤트 루프가 싱글 스레드로 처리하는 것이고, 내부적인 아키텍쳐를 살펴보면 C++로 작성된 libuv에 쓰레드 풀이 존재하고 있다. 즉 Node.js는 I/O Request시 쓰레드 풀에 요청을 던지는 것이다.
  2. 이벤트 루프(Event Loop) 기반
    • libuv라는 이벤트 기반(Event-Driven), 논 블로킹(Non-Blocking) I/O 모델을 구현한 라이브러리를 사용한다.
    • 이벤트 기반은 이벤트가 발생할 때 지정해둔 작업을 수행하는 방식으로, 이벤트가 발생하면 Node.js는 지정해둔 콜백함수를 실행하고, 이벤트가 끝나면 Node.js는 다음 이벤트 발생시 까지 기다린다.
    • 이 때 이벤트 루프(Event Loop)가 여러 이벤트가 발생 시, 콜백함수의 호출 순서를 판단하고 이벤트가 종료될 때까지 작업을 반복한다.
  3. 논 블로킹(Non-Blocking) I/O
    • Node.js는 논 블로킹 I/O의 특성을 활용하여 오래 걸리는 작업을 효율적으로 처리한다.
    • 블로킹은 특정 작업이 수행되는 동안 특정 작업이 제한되는 것인데 Node.js는 비동기 방식을 통하여 블로킹이 되지 않게끔 한다.
    • 이 때 비동기란 어떠한 작업이 끝날때 까지 기다리지 않고 다른 작업을 동시에 진행 함을 의미한다.
    • 즉, Node.js는 함수 호출이 발생시, 요청을 쌓아두어 동시에 처리하고 요청이 완료된 순서대로 처리한다. 

  Node.js는 싱글스레드의 이벤트 루프 기반의 논 블로킹 I/O를 모델로 함으로, I/O 요청이 많은 서버에 효율적이다. 하지만 싱글스레드를 사용하기 때문에, CPU 연산이 많거나 복잡한 프로그램에는 적합하지 못하게 된다. 즉 채팅 혹은 특정 값의 변화와 같은 많은 양의 작은 데이터를 주고 받는 프로그램에 Node.js는 효율적이다.

 

 Spring란? 

 

Spring의 정의

  Spring이란 오픈소스 기반의 Java 웹 애플리케이션을 개발 할 수 있는 Framework 이다. 즉, Java의 기술들을 더 쉽게 사용 가능하도 Java에서 자주 사용하는 기능들의 집합이라고 할 수 있다.

 

Spring Boot의 정의

  Spring Boot는 위의 Spring을 더 쉽게 사용하여 상용화 가능한 애플리케이션을 만들수 있도록 돕는 도구이다. Spring은 초기에 세팅해야 할 것이 많아, 초보자들에게 진입장벽이 높고 할애되는 시간이 많은데, 이러한 문제를 해결하고자 등장한 Framework가 Spring Boot이다.

 

Spring의 특징

  • Spring은 "경량 컨테이너"로서 Java 객체와 라이브러리등을 직접 관리해주며, WAS(ex 톰캣)이 내장되어 있어 애플리케이션을 구동할 수 있도록 한다.
  • Java 객체의 생성 및 소멸과 같은 생명주기(Life Cycle)을 관리하고, 필요한 객체는 Spring 컨테이너에서 사용하는등 Java 객체를 직접 Spring안에서 관리한다.
  • Spring은 복잡한 트랜잭션을 어노테이션 혹은 Xml을 통해 설정하여 개발자가 매번 상황에 맞는 코드를 작성하지 않아도 된다.
  • 웹 프로그래밍 개발의 표준인 MVC(Model-View-Controller) 패턴을 사용한다.
  1. IOC(Inversion Of Control) = 제어의 역전
      일반적으로 자바 프로그램에 관해 배울 때, 우리는 각 객체를 직접 생성하고 객체의 메소드를 호출하는 등 직접 객체를 조작하는 작업(ex A객체가 B객체의 메소드를 사용하고 싶다면 A객체에서 B객체를 선언해준다)을 하였다. 이 때 IOC란, 이렇게 사용자가 작업을 제어 하는 것이 아닌, Spring에서 의존성 객체를 만들어주고 필요한 곳에 넣어주어 기존에 사용자가 가졌던 제어권을 다른 주체에게 넘겨주는 것을 의미한다.
  2. DI(Dependency Injection) = 의존성 주입
      DI란, 필요로 하는 객체를 자신에게 직접 생성하는 것이 아닌, 필요로 하는 객체를 외부(Spring)에서 생성하여 사용하려는 객체에 주입시켜주는것을 의미한다. 직접 객체를 생성하는 경우 의존성이 높지만, DI와 같이 외부에서 객체를 주입하게 되면 의존성을 줄일 수 있게 된다.
  3. POJO(Plain Old Java Object)
      POJO란, 말 그대로 평범하고 오래된 자바 객체를 의미한다. 이는 Spring에서 객체간의 관계를 구성할 때, 별도의 API를 사용하지 않고 Java 코드를 이용하여 객체를 구성할 수 있음을 의미한다. 이를 통해 개발자가 코드를 작성할 때 특정 라이브러리나 컨테이너의 기술에 종속되지 않을 수 있게된다.
  4. AOP(Aspect Oriented Programming)
      AOP란, 개발자가 비즈니스 로직에만 집중 할 수 있도록 반드시 처리가 필요한 부분(횡단 관심사 = cross-cutting concerns)을 모듈로 분리하는 프로그래밍의 패러다임을 의미한다. Spring에서는 AOP를 AspectJ의 문법을 통해 구현하는데, 이를 통해 아래와 같은 효과를 얻는다.

 

  • 개발자는 핵심 비즈니스 로직에만 집중하여 개발을 진행 할 수 있다.
  • 프로젝트마다 다른 관심사를 적용할 때 코드의 수정을 최소화 시킬 수 있다.
  • 필요로 하는 관심사의 유지보수가 원활하도록 코드를 구성할 수 있다.

 

Spring Boot의 특징

  • Maven과 Gradle의 dependency에 starter 라이브러리만 작성해주면 Spring에서는 직접 세팅하던 초기 작업들의 세팅을 자동적으로 세팅해주게 된다. 또한 starter 라이브러리는 dependency에 필요한 라이브러리들의 버전관리를 자동으로 해주어 버전이 맞지 않는 오류를 방지 할 수 있다.
  • 이 때 Maven이란, 자바용 프로젝트 관리 툴로 자바에서만 사용 가능한 툴이다. Gradle또한 관리 툴이지만 Java 이외에도 Python 혹은 C++과 같은 다양한 언어를 지원하여준다.
  • 단독으로 실행이 가능한 Spring 애플리케이션을 생성한다.

 

Spring VS Spring Boot

  • Spring Boot는 톰캣과 같은 내장 서버가 존재한다. Spring의 경우 톰캣을 직접 설치하여 프로잭트 내에서 서버 설정및 버전관리를 해주어야 했지만, Spring Boot는 톰캣 내장 서버가 존재하여 설치와 버전 관리를 신경쓰지 않아도 된다.
  • Spring에서는 servlet-context, root-context와 같은 xml 파일을 작성하여 웹과 관련된 설정 및 프로젝트 내의 의존성을 직접 관리해주어야 했지만, Spring Boot는 자동으로 의존성을 관리하여 준다.

 

 Node.js vs Spring 

 

  Node.js Spring
Programming Language Javascript Java
Thread Single Thread
(+Libuv Thread Pool)
Multi Thread
Better Performance Lots of I/O operations Cpu intensive
Barriers to entry <
characteristic Runtime Environment Java Based Framework

 

  위에서 언급했던것처럼 Node.js는 Runtime 환경이고, Spring은 Framework이다. 따라서 Runtime 환경과 Framework를 비교하는 것은 맞지 않을 수 있다. 하지만 이러한 차이에도 불구하고 Node.js와 Spring이 같이 언급되는 이유는, Node.js 의 등장으로 Javascript로 애플리케이션의 개발이 용이해지고, Spring의 등장으로 Java의 애플리케이션 개발이 용이해졌기 때문이라고 생각한다.

 

 Node.js & Spring Boot Companies 

 

https://stackshare.io/stackups/nodejs-vs-spring-boot

 

참고사이트

1. https://nodejs.org/ko/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

2. https://spring.io/

 

Spring makes Java simple.

Level up your Java code and explore what Spring can do for you.

spring.io

3. https://stackshare.io/stackups/nodejs-vs-spring-boot

 

Node.js vs Spring Boot | What are the differences?

Node.js - A platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Spring Boot - Create Spring-powered, production-grade applications and services with absolute minimum fuss.

stackshare.io