[Node.js vs Spring] 백엔드 결정

김민석·2023년 4월 11일
0

Another

목록 보기
1/1
post-thumbnail

Node.js vs Spring 차이점 정리

Node.js?

JavaScript인 스크립트 언어에서 Google의 V8엔진을 사용하여 Javascript로 만든 프로그램을 실행 시켜주는 환경

핵심

Javascipt > 언어

Node.js > 실행 환경(런타임 환경)

Express > 웹 프레임 워크

Node.js 특징

  1. 하나의 텍스트 프로그램에서 하나의 코드만 실행 > 하나의 힙, 하나의 콜 스택
  2. 여러 요청이 동시에 와도 Event loop에 의해 비동기 > 시간 효율 ↑
  3. 여러개 Request 들어와도 해당 I/O를 기다리지 않아도 되서 서버 부하 ↓
  4. 멀티 쓰레드에 비해 메모리 절약 ↑

1. Single Thread

프로세스 내에서 하나의 스레드가 하나의 요청만을 수행한다.
해당 요청이 수행될 때 다른 요청을 함께 수행할 수 없다.

위 사진과 같이 하나의 종업원(thread)이 손님(client)에게 하나씩 주문(request)을 받고 햄버거(response)가 완성 되는 순서대로 각 손님에게 전달

장점 : 더 적은 자원으로 높은 성능 기대 가능

단점 : 손님이 많아지고 요청이 많아지면 종업원이 한명이라 서버가 느려진다.


2. Non-Blocking I/O

먼저 요청을 모두 접수하고 빨리 완료된 순서대로 실행

A : 10초
B : 10초
C : 500초
D : 10초

위와 같은 작업이 들어 왔을 때
1. 논블로킹 없는 서버는 D는 C의 작업이 끝나는 500초를 기다려야 한다.
2. 논브로킹을 가지고 있는 서버는 빨리 완료된 순서대로 처리해줌

예) 싱글쓰레드 예제에서 2번 세트 주문 / 3번 콜라 요청
3번 콜라를 먼저 주고 2번의 세트를 주게 된다.

정리 : 블로킹 > 동기 / 논블로킹 > 비동기


3. Event-driven (이벤트 기반)

Node.js 내부 아키텍쳐를 살펴보면 C++로 작성된 libuv에 쓰레드 풀이 존재
즉 이벤트 리스너에 등록해둔 쓰레드 풀을 실행하는 방식으로 동작한다.


Spring?

Java 웹 애플리케이션을 개발 할 수 있는 오픈소스 Framework이다.
동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공

핵심

Java > 언어

Spring > 프레임워크

Spring 특징

  1. 실행 초기에 Node.js보다 오류를 잡기 쉽다.
  2. 쉽게 구동할 수 있다.(Tomcat)
  3. 비즈니스 로직에 더 잘 집중할 수 있다.(IOC,DI,POJO,AOP 등)
  4. MVC(Model-View-Controller) 패턴 사용
  5. Multi-Thread, blocking 방식

Multi Thread

한개의 Thread가 하나의 요청을 담당하여 응답까지 책임지고 반환하고 요청이 들어오면 바로 결과를 반환해주는 동기방식을 사용 blocking 방식 사용

위 사진과 같이 각각의 종업원(thread)이 각각의 손님(client)를 담당하여 주문(request)을 받아서 한번에 음식(response)을 반환

장점 : 많은 요청을 동시에 처리 할 수 있음

단점 : 주방에서 조리하는 동안 하염없이 기다려야함.(자원 낭비)


1. 경량 컨테이너

경량 컨테이너로서 자바 객체를 직접 관리한다.
각각의 객체 생성, 소멸과 같은 라이프 사이클 관리하며 스프링으로부터 필요한 객체 얻어올 수 있다.

2. IOC(Inversion Of Control) = 제어의 역전

애플리케이션의 느슨한 결합을 도모.
Spring에서 의존성 객체를 만들어주고 필요한 곳에 넣어 주어 기존에 사용자가 가졌던 제어권을 다른 주체에게 넘겨주는 것을 의미

3. POJO(Plain Old Java Object)

평범하고 오래된 자바의 객체를 의미
별도 API를 사용하지 않고 Java 코드를 이용하여 객체를 구성할 수 있음

4. DI(Dependency Injection) = 의존성 주입

객체를 직접 생성하는 것이 아닌, 필요로 하는 객체를 프레임워크(Spring)에서 생성하여 사용하려는 객체에 주입 시켜주는 것
직접 객체 생성 > 의존성 ↑
외부에서 객체 주입 > 의존성 ↓

5. AOP(Aspect Oriented Programming) = 관점 지향 프로그래밍

개발자가 비즈니스 로직에만 집중 할 수 있도록 반드시 처리가 필요한 부분을 모듈로 분리하는 프로그래밍의 패러다임 의미
예) 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

6. MVC(Model View Controller)

구조
View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO
외에 DispatcherServlet, servlet-context

View - 사용자에게 보여지는 화면(JSP등)
Controller - View와 Service 사이를 연결
Service - 실제 로직을 처리하는 곳(거의 모든 기능은 Service에 만들어짐)
DAO(Data Access Object) - 프로젝트와 데이터베이스를 연결
DTO(Data Transfer Object) - 데이터 교환을 위한 오브젝트


간단한 I/O요청이 많은 경우 비교


동일한 처리 CPU 사용 연산에 따른 그림

개인적인 결론

Node.jsSpring
Programmin LanguagejavascriptJava
ThreadSingleMulti
I/ONon-blockingblocking
좋은 부분간단하고 많은 I/O 작업Cpu intensive
특징런타임 환경자바 기반 프레임 워크
간단한 I/O가 많은 경우👍
CPU 연산 많아질 경우👍
외부 API 작업 요청 많을 경우👍
진입 장벽(개인적인)👍

그래서 이번 프로젝트의 결론은 다른 백엔드분과 협의 결과
우선 요리도우미라는 프로젝트에는 간단한 I/O작업이 많고
javascript에도 부족한 부분이 많은데 Typescript로 해야하기 때문에
React도 공부하며 Spring으로 하기에는 부족한점이 많을 것 같아
다음학기Spring을 이용한 Backend를 구상하고
javascript를 이용하는 Node.js를 사용하기로 했다..


참조 사이트

https://doqtqu.tistory.com/284
https://well-made-codestory.tistory.com/31
https://jaehoney.tistory.com/167
https://siyoon210.tistory.com/164

profile
개발을 배우는 대학생입니다!

0개의 댓글

관련 채용 정보