Node.js
Node.js는 서버 측에서 JavaScript를 실행할 수 있는 런타임 환경입니다.
JavaScript는 주로 클라이언트 측 웹 브라우저에서 사용되었지만, Node.js의 등장으로 JavaScript를 서버에서도 사용할 수 있게 되었습니다.
Node.js의 편리성
1) back-end 부터 front-end까지 JavaScrpit로
기존 JavaScript는 웹 페이지의 동적인 기능을 구현하는 데 사용되었으며, 주로 프론트엔드(클라이언트 측)에서 사용되었습니다.
Node.js가 등장하기 전에는 프론트는 JavaScript로 개발하되, 백앤드의 경우 Java, C#, php등의 언어들을 사용하여 애플리케이션을 개발하였습니다. 즉, 백앤드 개발 언어와 프론트 언어 개발 언어가 상이했습니다.
Node.js의 등장으로 JavaScript를 백엔드에서도 사용할 수 있게 되어 웹 개발에서의 통일성과 효율성이 더욱 향상되었습니다.
이로 인해 웹 개발에서 전체적인 통일성이 높아지고, JavaScript로 전체 웹 애플리케이션을 구축하는 것이 가능해졌습니다.
2) 비동기성과 Non-blocking I/O
Node.js는 비동기성, Non-blocking I/O 모델을 사용합니다.
* 비동기성 (Asynchronous)
비동기성은 Node.js가 하나의 요청이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있는 능력을 의미합니다. 즉, 요청을 처리하는 동안 다른 작업을 실행할 수 있으므로, 블로킹이 발생하지 않고 다른 요청들을 동시에 처리할 수 있습니다.
예를 들어, 파일을 읽거나 네트워크 요청을 보내는 작업은 시간이 오래 걸릴 수 있습니다. 기존의 동기적인 방식에서는 이러한 작업을 기다려야 하지만, 비동기적인 방식에서는 요청을 보낸 후에도 다른 작업을 수행하며, 해당 작업이 완료되면 콜백 함수를 호출하여 결과를 처리합니다.
* Non-blocking I/O 모델
Node.js는 Non-blocking I/O 모델을 채택하여 입출력 작업을 비동기적으로 처리합니다.
I/O 작업은 파일 시스템 액세스, 네트워크 요청, 데이터베이스 쿼리 등을 포함하는데,
기존의 블로킹 I/O 모델에서는 입출력 작업이 완료될 때까지 해당 스레드가 블로킹되어 다른 작업을 수행할 수 없게 됩니다. 이러한 방식은 대용량 요청 처리에 적합하지 않고, 많은 스레드를 필요로 하여 메모리 사용량이 늘어나는 단점이 있습니다.
하지만 Node.js의 Non-blocking I/O 모델에서는 입출력 작업이 요청되면 해당 작업을 백그라운드에서 비동기적으로 처리하고, 다음 작업으로 넘어가며 기다리지 않습니다. 작업이 완료되면 이벤트 루프를 통해 결과를 처리합니다.
이를 통해 Node.js는 단일 스레드로 많은 요청을 동시에 처리할 수 있으며, 높은 성능을 유지할 수 있습니다.
비동기성과 Non-blocking I/O 모델을 활용하여 Node.js는 높은 처리량과 확장성을 가진 웹 애플리케이션을 구축하는 데 적합한 환경을 제공합니다.
즉, 입출력 작업을 기다리지 않고도 다른 작업을 처리할 수 있게 하므로 성능이 빠릅니다.
여기서 Non-blocking I/O, blocking I/O 에 대해서 조금 더 알아보도록 하겠습니다.
=> ** Non-blocking I/O, blocking I/O 비교
<상황 가정>
1. A 요청이 먼저 들어옵니다. A 요청은 처리에 시간이 오래 걸리는 요청입니다.
2. B 요청이 그 다음에 들어옵니다. B 요청은 처리가 빨리 끝나는 요청입니다.
블로킹 I/O 동작
1. A 요청이 먼저 처리되고, I/O 작업이 완료될 때까지 다른 요청은 대기
2. B 요청은 A 요청이 완료될 때까지 기다려야 함
Non-blocking I/O 동작
1. A 요청이 처리되는 동안, 서버는 B 요청을 기다리지 않고 동시에 처리
2. A 요청의 I/O 작업이 완료되지 않아도 B 요청은 I/O 작업이 끝나기를 기다리지 않음
=> B 요청은 A 요청과 관계없이 빠르게 처리되며, 지연 없이 결과를 반환합니다.
- 블로킹 I/O 모델에서는 하나의 I/O 작업이 끝날 때까지 다른 작업들이 기다려야 하기 때문에, 처리 시간이 긴 A 요청 때문에 다른 요청들이 블로킹되어 지연이 발생
- 반면에 Non-blocking I/O 모델에서는 I/O 작업이 끝날 때까지 기다리지 않고 다른 작업을 계속해서 처리할 수 있기 때문에, 처리 시간이 긴 A 요청이 다른 요청에 영향을 주지 않음
따라서,
Non-blocking I/O 모델은 높은 동시 접속자 수를 처리하는 상황에서 유용하며, 빠른 응답 시간과 높은 성능을 제공하는 데 도움이 됩니다.
예) 동시다발적 요청이 매우 많은 채팅, SNS서비스 등의 처리에 적합,
요청이 많거나 오래걸리는 요청으로 인한 부하나 요청 대기시간 발생 x
블로킹 I/O 모델은 하나의 요청이 끝날 때까지 다른 요청들이 기다려야 하기 때문에, 많은 요청을 처리하는 경우 지연과 성능 저하가 발생할 수 있습니다.
Node.js (서버) 와 기존 JavaScript(클라이언트 )의 차이점
특성 | 기존 JavaScript | Node.js |
---|---|---|
실행 환경 | 클라이언트 측 웹 브라우저 | 서버 측 JavaScript 런타임 |
비동기성 | 동기적 | 비동기적 |
모듈 시스템 | 내장 모듈 시스템 없음 | CommonJS 모듈 시스템 사용 |
파일 시스템 액세스 | 로컬 파일 시스템 액세스 제한 | 서버 측에서 파일 시스템 액세스 가능 |
네트워킹 | 클라이언트-서버 간 제약 있음 | 서버에서 다양한 네트워크 통신 지원 |
1. 실행 환경
- 기존 JavaScript: 기존의 JavaScript는 주로 클라이언트 측 웹 브라우저에서 실행됩니다.
- Node.js: Node.js는 서버 측에서 실행되는 JavaScript 런타임 환경입니다.
2. 비동기성
- 기존 JavaScript: 클라이언트 측 JavaScript는 주로 동기적으로 동작합니다.
- Node.js: Node.js는 비동기적으로 동작합니다. 즉, Non-blocking I/O 모델을 사용하여 입출력 작업을 기다리지 않고 여러 작업을 동시에 수행할 수 있습니다.
3. 모듈 시스템
- 기존 JavaScript: 기존의 JavaScript는 모듈 시스템을 내장하고 있지 않아서 스크립트들이 전역 스코프를 공유합니다.
- Node.js: Node.js는 CommonJS 형식의 모듈 시스템을 사용합니다. 모듈별로 자체 스코프를 가지므로, 변수와 함수가 다른 모듈들과 격리되어 이름 충돌을 피할 수 있습니다.
4. 파일 시스템 액세스
- 기존 JavaScript: 기존 JavaScript는 클라이언트 측에서는 보안 상의 이유로 로컬 파일 시스템에 직접적인 액세스를 허용하지 않습니다.
- Node.js: Node.js는 서버 측에서 파일 시스템에 직접 액세스할 수 있으므로, 서버 애플리케이션에서 파일 관리가 필요한 경우 유용합니다.
5. 네트워킹
- 기존 JavaScript: 기존 JavaScript는 클라이언트-서버 간의 네트워크 통신을 담당하는데 제약이 있습니다.
- Node.js: Node.js는 서버에서 네트워크 통신을 다루기 쉽도록 설계되어 있으며, HTTP를 비롯한 다양한 프로토콜을 지원합니다.
장점
Node.js는 아래와 같은 장점이 있습니다.
- 하나의 언어로 클라이언트와 서버를 모두 개발할 수 있어 개발 생산성이 향상됩니다.
- 비동기적인 특성으로 인해 확장성이 높고, 동시 접속자에 대한 처리가 용이합니다.
- 큰 커뮤니티와 많은 라이브러리와 모듈이 제공되어 개발이 용이합니다
단점
- 이벤트 기반 비동기방식이므로 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있습니다.
예를 들어, 한번의 요청에 대해 DB에서 조회한 결과값에 따라 다른 로직을 처리해야 하며, 이런 로직이 여러개인 경우 콜백함수 늪 (Callback Hell) 에 빠지게됩니다. - 싱글 쓰레드(Single Thread)이기 때문에 하나의 작업 자체가 많이 걸리는 웹서비스에는 적합하지 않습니다.
게시판형태와 같이 가벼운 I/O가 많은 웹서비스에 어울린다. - 코드가 수행되어야 코드에 에러가 있는지 알 수 있습니다.
오늘은 기본적인 Node.js의 개념과 장단점에 대해서 알아보았습니다.
다음 포스팅에서는 Node.js와 함께 서버 구축에 사용되는 프레임워크, express에 대해 포스팅하겠습니다.
Reference
https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/\
https://junspapa-itdev.tistory.com/3
+chatGPT 활용!
'node.js' 카테고리의 다른 글
[Node.js] express 설치 및 사용법 (0) | 2023.07.24 |
---|