JS/TIL(Today I Learned)

2024-11-18

프린스 알리 2024. 11. 18.

내일배움캠프 Node.js 트랙 16일차

1. ZEP에서 이루어진 Node.js 입문 스터디

Node.js란?

오픈 소스 및 크로스 플랫폼 JavaScript 런타임 환경이다.
구글 Chrome의 핵심인 V8 자바스크립트 엔진을 브라우저 외부에서 실행한다. 이를 통해 매우 뛰어난 성능을 선보이는 게 특징

모듈과 패키지, 그리고 yarn

Node.js에선 코드의 재사용성을 높이기 위해 작성된 독립적인 코드 조각들을 "모듈"이라고 부른다. 패키지는 이러한 모듈을 포함하고 있거나 다른 패키지에 의존하고 있는 코드의 집합을 의미한다.

 

패키지 매니저라는 도구를 이용한다면 패키지의 설치, 업데이트, 삭제 등이 훨씬 편리해진다. yarn은 바로 이 패키지 매니저 중 하나다. Node.js의 대표 패키지 매니저인 npm을 대체하기 위해 출시되었고, 보안 성능이 더 뛰어나다.

 

yarn의 설치는 기존 npm을 통해 가능하다.

// npm을 이용하여 전역 환경에 Yarn을 설치합니다!
npm install -g yarn

 

yarn init을 이용해 새로운 패키지를 만들게 되면, npm을 사용할 때처럼 package.json파일이 생성된다.

{
  "name": "package-manager",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

 

패키지 설치는 yarn add [패키지 명]을 통해 가능하다. 터미널에 다음과 같이 입력하게 되면 여러 개의 패키지를 동시에(병렬적으로) 다운로드 받을 수 있다.

yarn add express mongoose jest

yarn을 이용하기 위한 더 많은 명령어들은 다음 링크를 통해 확인해볼 수 있다.
Usage | Yarn

 

Yarn

Fast, reliable, and secure dependency management.

classic.yarnpkg.com

express 프레임워크 설치와 사용

Express.js는 Node.js에서 서버를 쉽게 만들 수 있도록 돕는 웹 프레임워크이다.
Installing Express
Express.js의 공식 홈페이지에서 읽을 수 있는 문서들을 아주 가볍게 간추려서 번역해보았다.

 

Installing Express

Learn how to install Express.js in your Node.js environment, including setting up your project directory and managing dependencies with npm.

expressjs.com

Hello World

우리가 만들 수 있는 가장 단순한 형태의 Express 앱은 다음과 같을 것이다.

import express from 'express'; // express를 ESM 방식으로 사용하는 법

const app = express();
const PORT = 3000;

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

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

이 앱은 서버를 시작하고 포트 3000에서 연결을 수신 대기한다. 앱은 루트 URL() 또는 route로 전달 받은 요청에 대해 "Hello World!"로 응답한다. 이외의 경로로 요청을 받은 경우 404 찾을 수 없음으로 응답한다.

Basic Routing

라우팅은 어떤 데이터를 목적지까지 보내기 위한 경로를 선정하는 과정이다.

 

애플리케이션이 특정 엔드포인트(URI 또는 경로)와 특정 HTTP 요청 메서드(GET, POST 등)에 대한 클라이언트 요청에 어떻게 응답할지를 결정하는 것을 말한다. 컴퓨터 네트워크는 노드라고 하는 여러 시스템과 이러한 노드를 연결하는 경로 또는 링크로 구성된다. 상호 연결된 네트워크에서 두 노드 간의 통신은 여러 경로를 통해 이루어질 수 있다. 라우팅은 미리 정해진 규칙을 사용하여 최상의 경로를 선택하는 프로세스이다.

 

라우트는 바로 그 경로를 의미하며, 각 라우트는 하나 이상의 핸들러 함수를 가질 수 있으며, 라우트가 일치할 때 이러한 함수들이 실행된다.

Express.js에서 라우트는 다음과 같은 구조로 이루어져 있다.

app.METHOD(PATH, HANDLER)
  • app은 express 모듈의 인스턴스이다.
  • METHOD는 HTTP 요청 메서드를 의미하며 이곳에선 소문자로 쓰인다.(예를 들어 GET은 get으로 쓴다.)( 추가 자료: HTTP 요청 메서드 - HTTP | MDN, HTTP - Wikipedia)
  • PATH는 서버의 경로
  • HANDLER는 경로가 일치할 때 실행되는 함수이다.(즉, 콜백 함수)

Route Parameters(경로 변수)

경로 변수는 URL의 특정 위치에 지정된 값을 캡처하기 사용된다. 캡처된 값이 객체에 채워지며, 경로에 지정된 매개변수의 이름이 각 키로 사용된다.

Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }

app.get('/users/:userId/books/:bookId', (req, res) => {
  res.send(req.params)
})

Middleware(미들웨어)

미들웨어는 웹 애플리케이션에서 요청(request)과 응답(response) 사이에 위치하여 특정 작업을 수행하는 함수이다. 요청이 서버의 최종 핸들러에 도달하기 전에 실행되며, 다양한 기능을 추가하거나 요청과 응답을 처리하는 데 사용된다.

미들웨어의 주요 특징:

  1. 요청과 응답 객체를 사용: 미들웨어 함수는 요청 객체(req), 응답 객체(res), 그리고 다음(next) 미들웨어로 제어를 넘기는 next 함수를 매개변수로 받는다.
  2. 요청-응답 주기를 제어: 미들웨어는 요청이 처리되는 흐름을 조정할 수 있다. 예를 들어, 요청이 특정 조건을 만족하지 않으면 응답을 바로 보내거나, 다음 미들웨어로 넘기지 않고 멈출 수 있다.
  3. 다양한 용도로 사용:
    • 로깅: 요청이 들어올 때마다 기록을 남기는 기능을 수행할 수 있다.
    • 보안: 사용자의 인증이나 권한 검사를 할 수 있다.
    • 파싱: 요청 본문을 JSON이나 URL 인코딩된 데이터로 변환할 수 있다.
    • 정적 파일 제공: 정적 파일(예: HTML, CSS, 이미지 등)을 제공하는 기능을 추가할 수 있다.

미들웨어의 동작 예시:

import express from "express";

// 간단한 로깅 미들웨어
app.use((req, res, next) => {
  console.log(`Request Method: ${req.method}, Request URL: ${req.url}`);
  next(); // 다음 미들웨어 또는 라우트로 넘어감
});

// 요청 본문을 JSON으로 파싱하는 미들웨어
app.use(express.json());

// 라우트 핸들러
app.get('/', (req, res) => {
  res.send('Hello, World!');
});

// 404 에러 처리 미들웨어
app.use((req, res) => {
  res.status(404).send('Page not found');
});

// 오류 처리 미들웨어
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

미들웨어의 흐름:

  1. 클라이언트가 서버로 요청을 보낸다.
  2. 요청은 각 미들웨어를 거쳐간다. 각 미들웨어는 next() 함수를 호출함으로써 다음 미들웨어로 요청을 전달할지, 아니면 응답을 보낼지를 결정한다.
  3. 요청이 미들웨어를 거쳐 라우트 핸들러에 도달하면 적절한 응답을 반환한다.
  4. 오류나 특별한 상황이 발생하면 이를 처리하는 미들웨어가 실행된다.

* 미들웨어를 거치는 기준

app.use → 모든 HTTP 메서드(GET, POST 등)에서 작동하며 경로가 지정되지 않으면 모든 경로에서 실행된다. 특정 경로를 지정하면 그 경로와 일치할 때만 실행된다.
app.get → GET 요청에서만 작동하며 지정된 경로에서만 실행된다.

 

 

참고 자료
라우팅이란 무엇인가요? - 네트워크 라우팅 설명 - AWS
비전공자도 이해할 수 있는 쉬운 라우팅 개념 : 네이버 블로그
Express basic routing

'JS > TIL(Today I Learned)' 카테고리의 다른 글

2024-11-20  (2) 2024.11.20
2024-11-19  (1) 2024.11.19
2024-11-15  (2) 2024.11.15
2024-11-14  (1) 2024.11.14
2024-11-13  (2) 2024.11.13

댓글