coding/Node.js

Node.js, express

JIN_Coder 2022. 7. 22. 23:16

Node.js

Node.js란, 크롬 V8 자바스크립트 엔진으로 빌드 된 자바스크립트 런타임

 

런타임이란 프로그래밍 언어가 구동되는 환경

자바스크립트 런타임의 종류로는 웹 브라우저(크롬, 파이어폭스, 익스플로러 등)프로그램과 Node.js 라는 프로그램

따라서 노드는 자바스크립트 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경을 의미

 

Node.js는 확장성이 있는 네트워크 어플리케이션 개발에 사용되는 소프트웨어 플랫폼

특히 서버사이트에서 많이 사용된다.

Node.js 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 하다

 

JavaScript는 독립적인 언어가 아닌 스크립트 언어이다.

스크립트 언어는 특정한 프로그램 안에서 동작하는 프로그램이기 때문에 웹 브라우저 프로그램 안에서만 동작을 한다.

그렇기에 웹 브라우저(크롬, 사파리, 익스플로러, 파이어폭스 등)가 없으면 사용할 수 없는 프로그램이다.

Node.js를 설치하게 되면 터미널프로그램(윈도우의 cmd, 맥의 terminal 등)에서 Node.js를 입력하여 브라우저 없이 바로 실행할 수 있다.

Server-Client 웹사이트를 만들 때 웹에서 표시되는 부분은 JavaScript 를 사용하여 만들어야만 했으며, 서버는 Reby, Java 등 다른 언어를 써서 만들었어야 했는데 마침내 한 가지 언어로 전체 웹 페이지를 만들 수 있다.

 

내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능하며, 이를 통한 웹 서버의 동작에 있어 더 많은 통제에서 벗어나 여러 가지 기능을 가능하게 한다.

 

 

자바스크립트(Javascript) 언어를 사용하며,

이벤트 기반, Non-blocking I/O와 단일 스레드, 이벤트 루프를 통한 높은 처리 성능을 가짐

 

이벤트 기반

이벤트 기반(Event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.

즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록한다.

이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.

 

이벤트 루프

이벤트 루프(event loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단한다.

노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loog)라고 부른다.

논 블로킹 I/O

Blocking Model이란, 코드의 실행이 끝나기 전까지 실행 제어권을 다른곳에 넘기지 않아 다른 작업을 하지 못하고 대기하는 것

Non-blocking Model이란, 코드의 실행이 끝나지 않아도 실행 제어권을 다른곳에 넘겨 다음 코드가 실행될 수 있는것

함수 호출 시 당장 실행하는 것이 아니라(동기→블로킹) 일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고(비동기→논 블로킹) 요청이 완료된 순서대로처리(스택 이용) 한다는 말이다.

 

동기(sync)는 이전 작업이 끝나야만 다음 작업을 수행한다. 먼저 실행된 코드의 결과가 나올때까지 대기

비동기(Async)이란 이전 작업이 완료될 때까지 대기하지 않고 동시에 작업을 수행한다.

 

자바스크립트는 비동기(Async) + Non-blocking Model을 채용하여 현재 실행중인 코드의 실행이 끝나지 않아도 다음 코드를 호출한다.
결론적으로 자바스크립트는 Non-blocking model을 가지며 각 명령이 순서대로 실행될 수 있게 구현되어 있지만, Non-blocking model에 의해 명령이 아닌 모든 함수는 비동기적으로 실행된다.

 

Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.

하지만 노드는 CPU 부하가 큰 작업에는 적합하지 않다.

우리가 작성하는 코드는 모두 스레드 하나에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어렵다.

 

즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 노드는 적합하다. 예를 들어 네트워트나 데이터베이스, 디스크 작업 같은 I/O에 특화되어있다. 실시간 채팅 애플리케이션, 주식 차트도 포함된다.

 

 

노드의 장점

1. 멀티 스레드 방식에 비해 적은 컴퓨터 자원을 사용

2.  I/O 작업이 많은 서버로 적합

3. 웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없음

4. 자바스크립트를 사용하기 때문에 JSON 형식과 쉽게 호환됨

 

 

[JavaScript] 런타임 작동 방식, 비동기와 이벤트 루프 - 하나몬

⚡️ [JavaScript] 런타임 작동 방식, 비동기와 이벤트 루프 ❗️알아볼 키워드 자바스크립트란? 자바스크립트 V8 엔진이란? 자바스크립트 런타임이란? 자바스크립트 싱글 스레드 기반 프로그래밍

hanamon.kr

 

 

Node.js 노드 개념 이해하기 자바스크립트 JavaScript 런타임 이벤트

Node.js 노드 개념 이해하기 JavaScript 런타임 - 노드는 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는데 제일 많이 사용된다. 이벤트 기반 이벤트 루프 논블로킹 I/O 싱글

hanamon.kr

 

 

 

Express

Express.js는 Node.js로 서버를 빠르고 간편하게 만들 수 있게 도와주는 웹 프레임워크

 

Express는 프레임워크이므로 웹 애플리케이션을 만들기 위한 각종 라이브러리와 미들웨어 등이 내장돼 있어 개발하기 편하고, 수많은 개발자들에게 개발 규칙을 강제하여 코드 및 구조의 통일성을 향상시킬 수 있다.

 

express로 서버 띄우기

1. node.js 설치

 

2. express 설치 : 터미널에서 아래 코드 순차적으로 실행

// 프로젝트 initialize(package.json 생성)
npm init -y

// express 설치
npm i express

3. app.js 파일 생성

// app.js 파일

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(port, '포트로 서버가 열렸어요!');
});

4. 웹 서버 실행

// 터미널에서
node app.js

5. http://localhost:3000/ 에서 서버 확인

 

매우 간단하게 node와 express로 서버를 생성 하였다.

 

 

Routing

라우팅이란, URI(또는 경로) 및 특정한 HTTP 요청 메소드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것을 말한다.

// '/'경로에 GET 요청이 올 경우 "hello world"로 응답한다.
app.get('/', function(req, res) {
  res.send('hello world');
});

// '/'경로에 POST 요청이 올 경우 "Got a POST request"로 응답한다.
app.post('/', function (req, res) {
  res.send('Got a POST request');
});

 

Router

라우터란, 클라이언트의 요청을 쉽게 처리 할 수 있게 도와주는 Express.js 기본 기능중 하나

 

예시

routes 폴더를 생성해 goods.js라는 파일을 생성

// routes/goods.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
	res.send('this is home page');
});

router.get('/about', (req, res) => {
	res.send('this is about page');
});

// 작성한 Router를 app.js에서 사용하기 위해서 하단에 내보내주는 코드를 추가
module.exports = router;

 

// app.js
// Router 미들웨어를 사용하겠다고 작성
const goodsRouter = require("./routes/goods");
// '/api' 로 시작되는 주소는 routes/goods.js 에 있는 Router 미들웨어를 통해 처리
app.use("/api", [goodsRouter]);

localhost:3000/api/about 으로 들어가면 this is about page 표시

 

 

 

 

 

'coding > Node.js' 카테고리의 다른 글

모듈(module), require(), IIFE  (0) 2022.08.03
sequelize CRUD 사용법  (0) 2022.08.02
package.json  (0) 2022.07.31
npm jsonwebtoken  (0) 2022.07.29
Express의 미들웨어  (0) 2022.07.23