본문 바로가기
BackEnd/Server

Node.js와 Spring 비교

by 푸고배 2021. 9. 17.

Node.js

확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼

작성 언어 : JavaScript

 Node.js 특징 

  • 싱글 스레드non-blocking I/O 이벤트 기반 비동기 방식으로 작동한다.
    • 서버의 무리가 적다.
  • JavaScript 엔진(V8 Engine)으로 빌드된 JavaScript 런타임이다.
    • c++로 개발된 V8 JavasScript Engine이기 때문에 확장성이 좋다.
    • 개발속도 향상이 가능하다.
    • JavaScript를 사용하면 JSON 데이터 다루기가 용이하다.
  • npm(node package manager)를 통해 다양한 패키지를 제공한다.
non-blocking I/O
호출 직후 프로그램으로부터 제어가 돌아오기 때문에, 시스템 호출 종료를 기다리지 않고 다음 처리로 넘어가는 것이 가능하다.
Blocking :
호출된 I/O가 작업을 마칠 때까지 호출한 함수에게 제어를 돌려주지 않는 것
V8 JavaScript Engine
C++로 작성된 Google의 오픈 소스 고성능 JavaScript 및 WebAssembly 엔진이다. Chrome 및 node.js에서 사용되며, ECMAScript 및 WebAssembly를 구현하고 x64, IA-32, ARM 또는 MIPS 프로세서를 사용하는 Windows7 이상, macOS 10.12+ 및 Linux 시스템에서 실행된다. V8는 독립 실행형으로 실행되거나, 모든 C++ 애플리케이션에 포함될 수 있다.

Spring 

자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크

작성 언어 : Java

 Spring 프레임워크 특징 

  • 경량 컨테이너로서 자바 객체를 직접 관리한다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
  • Spring은 POJO(Plain Old Java Object) 방식의 프레임워크이다. 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
  • Spring은 제어 반전(IoC : Inversion of Control)을 지원한다. 컨트롤의 제어권을 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다. 
  • Spring은 의존성 주입(DI : Dependency Injection)을 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
  • Spring은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
  • Spring은 영속성과 관련된 다양한 서비스를 지원한다. iBATIS나 하이버네이트 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
  • Spring은 확장성이 높다. 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기때문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
POJO(Plain Old Java Object)
는 오래된 방식의 간단한 자바 오브젝트라는 말로서, 주로 특정 자바 모델이나 기능, 프레임워크 등을 따르지 않는 자바 오브젝트를 지칭하는 말로 사용된다.
제어반전(IoC : Inversion of Control)
은 프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게되는 소프트웨어 디자인 패턴이다.
목적 :
- 한 태스크의 실행을 구현에서 분리
- 모든 시스템이 설계 목적에 집중하도록 함
- 다른 시스템이 무엇을 할지 추측하지 않아도 됨
- 시스템을 바꿔도 다른 시스템에 부작용을 주지 않음
의존성 주입(DI :Dependency Injection)
은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다.

"의존성"은 예를 들어 서비스로 사용할 수 있는 객체이며, 클라이언트가 어떤 서비스를 사용할 것인지 지정하는 대신, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것이다. "주입"은 의존성(서비스)을 사용하려는 객체(클라이언트)로 전달하는 것을 의미한다. 서비스는 클라이언트 상태의 일부이며, 클라이언트가 서비스를 구축하거나 찾는 것을 허용하는 대신 클라이언트에게 서비스를 전달하는 것이 패턴의 기본 요건이다.

의존성 주입의 의도는 객체의 생성과 사용을 분리하는 것이다. 이는 가독성과 코드 재사용을 높혀준다.

의존성 주입은 광범위한 역제어 테크닉의 한 형태이다. 어떤 서비스를 호출하려는 클라이언트는 그 서비스가 어떻게 구성되었는지 알지 못해야 한다. 클라이언트는 대신 서비스 제공에 대한 책입을 외부코드(주입자)로 위임한다. 클라이언트는 주입자 코드를 호출할 수 없다. 그 다음, 주입자는 이미 존재하거나 주입자에 의해 구성되었을 서비스를 클라이언트로 주입(전달)한다. 그리고나서 클라이언트는 서비스를 사용한다. 이는 클라이언트가 주입자와 서비스 구성 방식 또는 사용중인 실제 서비스에 대해 알 필요가 없음을 의미한다. 클라이언트는 서비스의 사용 방식을 정의하고 있는 서비스의 고유한 인터페이스에 대해서만 알면 된다. 이것은 "구성"의 책임으로부터 "사용"의 책임을 구분한다.

 

Node.js와 Spring 비교

먼저 Node.js와 Spring의 언어에서도 알 수 있듯이, JavaScript는 Java와 같은 정적 언어와는 달리 명시적 타입 정의가 없다.

즉, JavaScript를 사용하는 Node.js의 경우 개발속도는 향상되지만, type safe하지 못하며 컴파일 단계에서 오류를 포착할 수 없다는 한계가 있다. (이러한 한계를 보완하기 위해 typeScript를 사용하기도 한다.)

 

Node.js싱글 스레드로 파일 I/O나 네트워크 처리를 이벤트 기반 방식으로 빠르게 처리가 가능하다. CPU 부하가 적고, 많은 커넥션을 동시에 처리하는 구조에 적합하다. 다만, 싱글 스레드이기 때문에 하나의 작업에 오랜 시간이 걸리면 시스템 전체의 성능이 급격히 떨어지는 한계를 가진다.

 

Spring은  멀티 스레드로 Spring은 동시에 많은 요청을 처리할 수 있다. 또한 많은 개발자들이 오랜기간 사용해왔기 때문에 버그와 보안 이슈를 보다 쉽게 해결할 수 있고, 자유성이 낮다는 점에서 안정적이라고 할 수 있다. 다만, Node.js 보다는 진입장벽이 높다.

 

따라서 I/O 작업과 같은 커넥션이 많고, 적은 CPU 연산을 처리하는 시스템에서는 Node.js가 CPU 연산이 많고, 커넥션이 적은 시스템에서는 Spring이 더 적합하고 할 수 있다.

 

 

 

 

 

 

[Node.js] 특징 및 장단점

Node.js 특징 Node.js는 Single-Thread의 non-blocking I/O 이벤트 기반 비동식 방식으로 작동한다. JavsScript 엔진(V8 Engine)으로 빌드 된 JavaScript 런타임이다. 따라서, 사용자의 요청은 한 곳에서 받지만..

seoyeonkk.tistory.com

 

제어의 역전 IoC - 제타위키

다음 문자열 포함...

zetawiki.com

 

스프링 프레임워크 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

Spring, Node.js 비교

그동안 인턴과 취업 준비를 하며 바빴다. 블로그를 보니 3달동안이나 포스팅을 안했다.. 🤭 사실 bear로 혼자 정리한 글은 몇 백개인데 ㅠㅠ 그래서 오늘은 오랜만에 포스팅을 해본다. 1. Spring와 N

hees-dev.tistory.com

 

반응형

댓글