Node.js
Chrome V8 JS 엔진을 기반으로 하는 *서버 측 JS 런타임이다.
(*JS 코드를 실행할 수 있는 환경으로, 이를 통해 JS 코드를 컴파일하고 실행한다.)
일반적으로 JS는 웹 브라우저에서 실행되는 클라이언트 측 스크립트 언어로 알려져 있지만,
Node.js를 사용하면 JS를 이용해서 서버 측 어플리케이션을 개발할 수 있다.
- 특징1) Node.js는 *비동기 *I/O 처리 방식 / 이벤트 기반 / 논블로킹 방식의 모델을 구현한다.
- I/O는 Input/Output의 약어로 컴퓨터 시스템에서 데이터를 입력/출력하는 모든 작업을 말한다.
- Node.js에서 I/O 작업은 주로 파일 시스템 접근, 네트워크 통신, 데이터베이스 액세스 등과 관련된 작업을 말하는데, 이러한 작업들을 동기적(synchronous)으로 처리할 경우 작업이 완료될 때까지 기다리는 동안 다른 작업을 수행할 수 없어 성능이 저하될 수 있다. (하나가 끝나야 그 다음으로 넘어가는 구조-직렬적)
- 반면 비동기적(Asynchronous) 처리 방식은 작업이 병렬적으로 실행된다. 어떤 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있어 전체적인 성능을 향상시킬 수 있다.
- 비동기 I/O 처리 방식은 *콜백 함수를 사용해서 구현된다.
- 콜백 함수란 작업이 완료되면 호출되는 함수로, 작업이 완료되기 전까지는 대기 상태에 머무르지 않고 다른 작업을 수행한다.
- 이벤트 기반이란 이벤트가 발생할 때마다 콜백 함수를 호출하는 방식이다.
- 논 블로킹이란 I/O 처리 시 작업이 완료되기 전 다른 작업을 처리할 수 있도록 해준다. 결론적으로 셋 다 비슷비슷한 말같다.
- 특징2) Node.js는 싱글 스레드 기반이다.
- 스레드란 프로세스 내에서 실행되는 실행 단위다. 프로세스 안에서 독립적인 실행 흐름을 갖고 있으며 각각의 스레드는 하나의 작업을 처리한다.
- Node.js는 하나의 스레드에서 모든 작업을 처리한다. Node.js의 *이벤트 루프는 이 단일 스레드에서 실행되며 모든 I/O 처리 작업은 비동기식으로 처리된다. 따라서 I/O 작업이 완료될 때까지 블로킹되지 않고 다른 작업을 수행할 수 있다.
- 작은 데이터들을 처리하는 데에는 괜찮지만, CPU 집약적인 작업이 많은 경우에는 싱글 스레드이기 때문에 적절하지 않다.
- 이벤트 루프란 Node.js가 비동기 I/O 작업을 처리하는 핵심 메커니즘이다. 이벤트 발생을 기다리는 루프를 뜻하며, 이벤트 발생을 감지하면 미리 등록된 콜백 함수를 실행시켜 작업을 처리한다.
- 특징3) Node.js는 많은 장점을 갖고 있는 환경이다.
- 모듈화가 용이해 코드의 재사용성과 유지보수성을 높일 수 있다. 또한 JS를 기반으로 하기 때문에 웹 개발자들에게 익숙한 언어다. 적은 메모리 사용량으로 높은 처리량을 제공하며 커뮤니티도 넓다고 한다.
- 특징4) *서버 프레임워크로는 **Express.js를 가장 많이 사용한다.
- 서버 프레임워크란 서버에서 동작하는 **웹 어플리케이션(웹 브라우저를 통해 실행되는 어플리케이션) 개발을 쉽게 하기 위해 제공되는 도구 모음이다. 이를 통해 웹 서버의 구현을 단순화할 수 있다. 대표적으로 Node.js, Django, Ruby on Rails, Spring이 있다.
- 라우팅: 클라이언트로부터 요청된 URL을 적절한 컨트롤러나 함수로 연결한다.
- 모델-뷰-컨트롤러 패턴: 어플리케이션의 코드를 분리해 유지보수와 확장성을 높인다.
- 데이터베이스 처리: 데이터베이스에 대한 연결과 쿼리 실행을 단순화하고 ORM(object-Relational Mapping)을 지원한다.
- 보안: 인증, 인가, XSS, CSRF 등 보안 기능을 제공한다.
- API 구현: RESTful API 구현에 필요한 기능들을 제공한다.
- Express.js는 Node.js를 위한 웹 프레임워크(서버 프레임워크의 하위 개념, 웹 어플리케이션 개발을 위해 특화된 프레임워크)로 라우팅, 미들웨어, 템플릿 엔진 등을 제공해 웹 어플리케이션을 쉽게 구축할 수 있도록 도와준다.
- 미들웨어: HTTP 요청과 응답 사이에서 처리되는 함수로 클라이언트의 요청을 가로채 필요한 처리를 수행하거나 응답을 가공해 클라이언트에게 전달할 수 있다. (EX. 로그인 인증, 캐싱 등)
- 템플릿 엔진: 웹 어플리케이션에서 유저에게 보여지는 HTML을 동적으로 생성하는 도구. HTML과 프로그래밍 코드를 조합해 만든다.
- 서버 프레임워크란 서버에서 동작하는 **웹 어플리케이션(웹 브라우저를 통해 실행되는 어플리케이션) 개발을 쉽게 하기 위해 제공되는 도구 모음이다. 이를 통해 웹 서버의 구현을 단순화할 수 있다. 대표적으로 Node.js, Django, Ruby on Rails, Spring이 있다.
즉 Node.js는 웹 개발자들에게 익숙한 JS로 서버를 만들 수 있는 환경이다. (그렇기 때문에 당연히 JS를 선행해야 한다.)
JS는 스크립트 언어이기 때문에 웹 브라우저 안에서만 동작하기에 웹 브라우저가 없으면 사용할 수 없는 프로그램이다.
그래서 JS를 웹 브라우저에서 독립시킨 것으로, Node.js를 사용하면 브라우저 없이 바로 실행을 시킬 수가 있다.
참고