Node.js & Spring

Hyeonjeong Jeon·2022년 12월 2일
2
post-thumbnail

들어가며
Node.js와 Java Spring을 목적에 맞게 사용하기 위해서 둘의 차이점에 대해 정리하는 글이다.

Node.js

Node.js란?

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

Node.js의 특징

  • 싱글 스레드 Non-Blocking I/O 이벤트 기반 비동기 방식으로 작동한다.

    • 서버의 무리가 적다.

Non-Blocking I/O
: 호출 직후 프로그램으로부터 제어가 돌아오기 때문에 시스템 호출 종료를 기다리지 않고 다음 처리로 넘어가는 것이 가능하다.

  • JavaScript 엔진(V8 Engine)으로 빌드된 JavaScript 런타임이다.

    • c++로 개발된 V8 JavaSciprt Engine이기 때문에 확장성이 좋다.

    • 개발속도 향상이 가능하다.

    • JavaScript를 사용하면 JSON 데이터를 다루기 용이하다.

  • npm(node package manager)를 통해 다양한 패키지를 제공한다.

Node.js의 장/단점

👍장점

  • V8 엔진을 기반으로 한 성능이 뛰어나다.

  • 싱글스레드, 비동기 IO 처리에 기반한 빠른 속도를 가진다.

  • 파일 I/O나 네트워크 처리를 이벤트 드리븐 방식으로 처리하기 때문에 빠른 처리가 가능하다.

  • CPU의 대기시간을 최소화 할 수 있다.

  • CPU 부하가 적고, 많은 커넥션을 동시에 처리해야 하는 구조에 적합하다.

  • 자바스크립트를 이용해서 개발할 수 있기 때문에 프론트엔드 개발자의 진입장벽이 낮다.

  • 기존 Java 서버에 비해 생산성이 훨씬 높다.

👎단점

  • 싱글스레드 모델이기 때문에 하나의 작업에 시간이 오래걸리면 시스템 전체의 성능이 급격하게 떨어진다.

  • 에러가 발생할 경우 프로세스 자체가 죽어버리므로 주의해야한다. (watch dog 등으로 처리 가능)

  • 멀티 코어 활용을 위해서 cluster 모듈을 이용해야 하고, 세션을 공유할 경우 부가적인 작업이 필요하다.

  • 비동기 제어가 까다롭다.

Spring

Spring이란?

자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크이다. (작성 언어: Java)

Spring의 특징

  • "경량 컨테이너"로서 Java 객체와 라이브러리등을 직접 관리해주며, WAS(ex. 톰캣)이 내장되어 있어 애플리케이션을 구동할 수 있도록 한다.

  • Java 객체의 생성 및 소멸과 같은 생명주기(Life Cycle)을 관리하고, 필요한 객체는 Spring 컨테이너에서 사용하는 등 Java 객체를 직접 Spring 안에서 관리한다.

  • POJO(Plain Old Java Object) 방식의 프레임워크이다. 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.

  • IOC(Inversion Of Control)을 지원한다. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.

  • DI(Dependency Injection)을 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.

  • AOP(Aspect-Oriented Programming)을 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

  • 영속성과 관련된 다양한 서비스를 지원한다. iBATIS나 하이버네이트 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.

  • 확장성이 높다. 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 떄문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.

POJO(Plain Old Java Object)
: 오래된 방식의 간단한 자바 오브젝트라는 말로서, 주로 특정 자바 모델이나 기능, 프레임워크 등을 따르지 않는 자바 오브젝트를 지칭하는 말로 사용된다.Spring에서 객체간의 관계를 구성할 때, 별도의 API를 사용하지 않고 Java 코드를 이용하여 객체를 구성할 수 있음을 의미한다. 이를 통해 개발자가 코드를 작성할 때 특정 라이브러리나 컨테이너의 기술에 종속되지 않을 수 있게된다.

IoC(Inversion of Control) = 제어의 역전
: 메소드나 객체의 호출 작업을 사용자가 제어 하는 것이 아닌, Spring에서 의존성 객체를 만들어주고 필요한 곳에 넣어주어 기존에 사용자가 가졌던 제어권을 다른 주체에게 넘겨주는 것을 의미하는 소프트웨어 디자인 패턴이다.

  • 장점
    • 모든 시스템이 설계 목적에 집중하도록 한다.
    • 다른 시스템이 무엇을 할지 추측하지 않아도 된다.
    • 시스템을 바꿔도 다른 시스템에 부작용을 주지 않는다.

DI(Dependency Injection) = 의존성 주입
: 필요로 하는 객체를 자신에게 직접 생성하는 것이 아닌, 필요로 하는 객체를 외부(Spring)에서 생성하여 사용하려는 객체에 주입시켜주는것을 의미한다. 직접 객체를 생성하는 경우 의존성이 높지만, DI와 같이 외부에서 객체를 주입하게 되면 의존성을 줄일 수 있게 된다. 이러한 의존성 주입을 통해 모듈 간의 결합도가 낮아지고 유연성이 높아지게 된다.

AOP(Aspect Oriented Programming)
개발자가 비즈니스 로직에만 집중 할 수 있도록 반드시 처리가 필요한 부분(횡단 관심사 = cross-cutting concerns)을 모듈로 분리하는 프로그래밍의 패러다임을 의미한다.

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

Spring의 장/단점

👍장점

  • 크기와 부하의 측면에서 경량이다.

  • Spring이 안정적이라는 말을 많이 한다. 그 이유는 레퍼런스가 많아 이슈를 쉽게 해결할 수 있고, 자유성이 낮다는 점에서 안정적이라고 생각한다.

  • 스프링은 2002년 로드 존슨이 최초로 개발하였기에 Spring을 다루는 개발자가 많아 인력 문제도 없다.

  • 많은 개발자들이 오랫동안 사용하고 유지해왔기 때문에 알려진 버그와 보안 문제는 많이 잡혀있어서 안정성이 우수하다.

  • 정형화된 패턴이 있다.

  • IOC/ DI로 느슨한 결합도를 유지한다.

  • 자유도는 낮지만 안정적이다.

👎단점

  • 설정이 복잡한 편이다.

+ Spring Boot

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

Node.js와 Spring 비교

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

  • 간단한 요구사항이 많은 경우 노드를 사용하는 것이 유리하다.
    ex) 채팅, crud기반 서비스

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

  • 복잡한 요구 사항이 많은 경우 스프링을 사용하는 것이 유리하다.
    ex) 실시간 게임, 영상처리

✨ 정리 ✨

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

참고
https://nodejs.org/ko/about/
https://spring.io/
https://jaehoney.tistory.com/167
https://doqtqu.tistory.com/284
https://nolja98.tistory.com/60
https://syundev.tistory.com/229

profile
👩🏻‍🌾기억을 기록하고 공유하자📚

0개의 댓글