흔히 사용하는 백엔드 프레임 워크는 스프링, node js 가 있다. 둘의 차이를 바탕으로 몇가지 중요한 CS 지식들을 돌아보자.
스프링 프레임워크는 기본적으로 Java 언어와 JVM 기반으로 동작하며, Java의 스레드 기능을 활용하여 멀티 스레드 방식으로 동작한다. 스프링은 요청마다 새로운 스레드를 생성하여 처리하며, 각각의 요청이 독립적으로 처리되기 때문에 안정적이고 예측 가능한 방식으로 동작한다.
단점: 스레드의 생성과 관리에 대한 오버헤드가 발생할 수 있고, 스레드의 동기화 문제도 발생할 수 있다.
반면에, Node.js는 이벤트 기반의 비동기 방식을 사용합니다. Node.js는 단일 스레드로 동작하며, 이벤트 루프와 콜백 함수를 사용하여 요청을 비동기적으로 처리한다. 이러한 방식은 스레드 생성 및 관리에 대한 오버헤드가 없으며, 많은 양의 요청을 빠르게 처리할 수 있습니다.
또한, Node.js는 JavaScript 언어를 사용하기 때문에 프론트엔드와 백엔드 개발을 모두 JavaScript로 처리할 수 있어서 개발 생산성이 높아진다.
단점: 콜백 지옥이라는 문제가 발생할 수 있고, 동기화 문제도 발생할 수 있다.
performance
처리량, 실행시간, 메모리 사용량 모든 부분에서 Node가 우세하다. 물론 그림의 그래프는 CPU 사용량이 적은 간단한 I/O 요청의 경우이다.
아래의 그림은 동일한 처리를 하는데 걸리는 수행 시간을 비교한 그래프이다. CPU를 사용하는 연산이 많아질수록 NodeJS의 처리 수행 시간은 급격히 증가한다.
즉, CPU 연산이 많을 수록 Spring이 유리하고 간단한 I/O가 많을 수록 NodeJS가 유리하다.
추가적으로 외부 API에 작업을 요청하는 부분이 많으면 Node.js가 유리하다고 볼 수 있다. 스프링은 동기 방식이기 때문에 요청을 보내고 대기하기 때문이다.
Node.js가 성능적 이점을 내는 상황은 아래와 같다.
- 다중처리를 동시에 처리하도록 요구된다.
- 많은 I/O작업을 수행한다.
- 단순한 CPU작업만을 진행한다.
위와 같은 전제 조건이 현재의 전형적인 웹 애플리케이션에 잘 어울러지기에, 보통 Node.js가 Spring에 비해 성능적 이점을 가진다고 하는 것이다.
요약
스프링 프레임워크가 효울적인 곳
안정성, 확장성, 보안성, 통합성 등의 장점으로 인해 안정성과 예측 가능성이 중요한 애플리케이션에서 사용하기 좋다.
ex) 대규모 엔터프라이즈 애플리케이션, e-커머스, CMS(Content Management System)
Node.js가 효율적인 곳
비동기 I/O 처리 능력과 확장성 등의 장점으로 인해 대용량의 요청을 빠르게 처리하고, I/O 처리가 많은 애플리케이션에서 사용하기 좋다.
ex) 대규모 실시간 웹 애플리케이션, 게임, 채팅 애플리케이션, 비디오 스트리밍
그럼 위의 지식들이 "왜" 그러한지 알아보기 위한 사전지식들을 몇가지 알아보자.
- 멀티 스레드
프로세스에 대비되는 장점:
1) response 속도
스레드 x 시 IO wait, block 만날때 해당 프로세스는 멈춰야함.
만약 각 스레드가 같은 프로그램의 다른 부분을 맡는다면 한 스레드가 어떤 부분에서 멈춰도
나머지 스레드들은 그대로 진행 가능. >> response good!
2)자원 공유
Process: 자기만의 address space 가진다. 똑 같은 일을 하는 process 라도
Address space 는 독립적으로 존재(내용만 code 영역, 로컬 변수 영역 등등이 같을뿐).
즉 같은 정보가 여러 번 들어가게된다. 자원 효율이 좋지 않다.
3)속도, 경제성
스레드: 생성,삭제 그리고,context switch의 오버헤드 적다.
Process생성,삭제: 오버헤드 많다. >> context: address space를 복사까지 하는 행위>> 오래걸린다.
스레드는 mem copy x 공유할떈 공유, 반드시 따로 있어야하는거만 생성.
따라서 생성시 훨씬 가벼움
4)확장성(scalabilty)
멀티코어에서 1개 프로세스( 스레드x) 시 1코어에서만 돌 수 있다.
여러 스레드 가지는 process>> 1개의 프로세스가 나눠져서 여러코어에서 돌 수 있다.
프로세스에 대비되는 단점:
안정성 문제: 스레드간의 공유 자원에 대한 동기화 문제와 교착 상태 등의 문제가 발생할 수 있다.
하나의 스레드가 문제를 일으키면 전체 프로세스에 영향을 미칠 수 있다.
동기(Synchronous) VS 비동기(Asynchronous)
동기 : 앞의 요청이 끝날 때까지 대기한다.
보통 앞선 작업이 끝났는지 지속적으로 방문해서 확인한다.
비동기: 처음 진입 시, 명령을 보낸 뒤, 앞선 요청이 진행 중이라면,
이 후에 interrupt 등으로 앞선 작업이 종료되었음을 알림 받고 진입한다.
첫 write시 io한테 명령보내고 확인받고( 읽으라고 말한거 알아들었어!)
동기
동기 방식은 요청과 응답이 일치하는 것을 의미한다.
작업을 요청하고, 해당 작업이 완료될 때까지 기다린 후에 결과를 받는다. 이는 순차적인 작업 처리 방식으로, 작업이 순서대로 진행되며, 한 작업이 완료될 때까지 다른 작업을 처리할 수 없다. 동기 방식은 간단하고 직관적이지만, 대기 시간이 길어지는 작업에서는 효율적이지 않을 수 있다.
비동기
비동기 방식은 요청과 응답이 일치하지 않는 것을 의미합니다. 즉, 어떤 작업을 요청하고, 해당 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리하다가 작업 완료 interrupt를 받으면 해당 작업을 수행할 수 있다.
이는 병렬적인 작업 처리 방식으로, 작업이 동시에 처리될 수 있어 대기 시간을 최소화할 수 있다. 하지만, 비동기 방식은 복잡하며, 작업이 완료된 시점을 예측하기 어렵고, 작업 처리 순서에 따라 결과가 달라질 수 있다.
동기 방식이 효율적인 경우
네트워크 통신과 같이 작업의 순서가 중요한 경우에는 동기 방식을 사용하는 것이 더 적절하다.
비동기 방식이 효율적인 경우
사용자 입력에 반응하는 GUI 프로그램에서는 비동기 방식을 사용하여 작업 대기 시간(Response time)을 최소화하고, 대규모 데이터 처리와 같이 시간이 오래 걸리는 작업에서는 비동기 방식으로 처리할 경우, 작업을 병렬로 처리할 수 있으므로 효율적이다.
네트워크 통신에서 작업의 순서가 중요한 이유는?
- 네트워크 통신에서 작업의 순서가 중요한 이유는 데이터의 전송 순서가 바뀌면 데이터의 의미가 변경될 수 있기 때문이다.
예를 들어, 파일 전송을 하는 경우, 파일의 일부분을 먼저 전송하고 다른 부분을 나중에 전송하면, 파일의 내용이 완전하지 않은 상태로 전송될 수 있다. 이와 같이 데이터의 전송 순서가 바뀌면 데이터가 손상될 수 있으므로, 데이터 전송 순서를 보장해야한다.
- 네트워크 통신에서는 데이터의 전송 속도와 대역폭 등에 따라 데이터 전송이 지연될 수 있고, 먼저 전송한 데이터가 나중에 전송한 데이터보다 뒤로 밀려서 올바르게 동작하지 않을 수 있다.따라서 TCP와 같은 동기 방식의 프로토콜을 사용하여 데이터 전송 순서를 보장하고, 데이터의 안정적인 전송을 보장하는 것이 필요하다.
TCP VS UDP
TCP는 전송 제어 프로토콜(Transmission Control Protocol)의 약어로, 연결 지향적인 프로토콜이다.
데이터를 안정적으로 전송하기 위해 3-way handshake를 사용하여 연결을 설정하고, 데이터를 전송하기 전에 데이터의 정확성을 보장하기 위한 확인 응답 과정을 거친다. 따라서, 데이터의 손실이나 중복 전송을 막을 수 있으며, 안정적인 데이터 전송이 필요한 파일 전송, 이메일, 웹 페이지 전송 등에 적합하다.
UDP는 사용자 데이터그램 프로토콜(User Datagram Protocol)의 약어로, 비연결형 프로토콜이다. 데이터를 빠르게 전송하기 위해 데이터 전송을 위한 추가적인 과정을 거치지 않으며, 데이터 전송 순서와 정확성에 대한 보장을 하지 않는다. 따라서, 전송 속도가 빠르고 연결 설정에 시간을 쓰지 않아도 되는 실시간 스트리밍, 동영상 스트리밍, 온라인 게임 등에서 적합하다.
하지만, 요즘은 분산 컴퓨팅 기술을 통해서, 한개의 프레임워크에 국한되지 않고, 적재적소에 적절한 프레임워크를 사용하여 프로젝트를 만들어나갈 수 있다.
분산 컴퓨팅이란?
분산 컴퓨팅은 여러 대의 컴퓨터를 하나의 시스템으로 연결하여, 하나의 컴퓨터로 처리할 수 없는 대규모 데이터나 복잡한 계산을 처리하는 기술이다. 이를 통해, 컴퓨팅 자원을 효율적으로 활용하고 성능을 향상시킬 수 있다.
분산 컴퓨팅 시스템은 여러 대의 컴퓨터가 네트워크로 연결되어 있으며, 각 컴퓨터는 서로 독립적으로 동작하면서 작업을 분산 처리합니다. 이때, 작업을 처리하는 컴퓨터를 노드(node)라고 하며, 노드들은 네트워크를 통해 통신하면서 작업을 처리합니다.
분산 컴퓨팅은 대규모 데이터 처리, 병렬 계산, 클라우드 컴퓨팅 등 다양한 분야에서 사용되고 있으며, 분산 시스템에서는 데이터 일관성 유지, 네트워크 지연, 오류 처리 등의 문제를 고려하여 설계하고 구현해야 한다.
이처럼 ,분산 컴퓨팅을 통해 여러 대의 컴퓨터의 자원을 하나의 시스템에서 사용할 수 있고, 각각의 자원들을 서로 다른 프레임워크 위에 운용할 수 있기에, 각 프레임워크의 장점을 조합할 수 있게 된다.
ex) 스프링 프레임워크의 안정성과 보안성을 유지하면서 Node.js의 비동기 I/O 처리 능력을 활용하여 대규모 실시간 웹 애플리케이션을 구현할 수 있다.
'MSA, EDA, Reactive 패러다임' 카테고리의 다른 글
Reactive System과 event-driven Architecture (0) | 2023.07.06 |
---|---|
Request-Respone(Rest 통신) VS 비동기 메세지 통신(Pub-Sub) (0) | 2023.07.06 |
reactive programing [이론 정리] (0) | 2023.07.06 |
WebFlux VS Spring MVC (0) | 2023.07.05 |
Spring reactive Stack VS Servlet Stack (0) | 2023.07.05 |