Node.js

Node.js 용어 정리 - 2주차

추운날_너를_기다리며 2024. 8. 30. 12:11

1. API와 REST API의 개념

  • API(Application Porgramming Interface)는 서로 다른 소프트웨어나 어플리케이션 간을 연결해주는 매개체이자 약속이라고 볼 수 있습니다.
  • API는 서로 다른 시스템 간의 통신을 할 수 있게 해주는 중개자의 역할을 담당하게 됩니다.
  • 우리가 API를 작성하는 이유는?
    • 웹 어플리케이션(프론트엔드)에서 원하는 기능을 수행하는 URL과 인터페이스를 제공하기 위해서
    • 우리가 작성할 API에서 원하는 데이터를 받아 데이터베이스에 데이터를 저장하고, 저장되어 있는 데이터를 읽어서 웹 어플리케이션(프론트엔드)에 데이터를 제공하는 행위를 통해 사용자가 원하는 목적을 이룰 수 있게 해야 합니다.
  • REST API란?
    • REST API, RESTful API ?
    • REST란 "Representational State Transfer"의 줄임 말로, 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위해 네트워크 상에서 자원을 쉽고 명확하게 식별하고 조작할 수 있게 도와주는 소프트웨어 아키텍처의 한 형식이다.
    • 최대한 간단하게 설명하자면 URL, Headers, Method 등 네트워크 표현 수단을 사람이 봐도 이해하기 쉬운 표현으로 정의하는 것을 REST라고 한다.
    • 또한 이 REST 아키텍쳐는 사람이 봐도 쉽게 이해할 수 있도록 자원을 정의하고 이 자원을 중심으로 표현을 구성하는 원칙을 제시합니다.
    • REST API는 HTTP를 통해 웹 서비스의 자원에 접근하는 방식을 REST 아키텍처의 규칙을 따라 구현된 API라고 생각하시면 됩니다.
  • REST API의 구성은 크게 세 가지로 이루어 집니다.
    • 자원(Resource) - URL
      • 우리가 만들 소프트웨어가 관리하는 모든 것을 자원으로 표현할 수 있습니다.
    • 행위 - HTTP method
      • GET 메서드는 조회(Read)와 관련이 있으므로 데이터를 읽는 작업을 행위로 보고 
      • POST 메서드는 생성(Create)와 관련이 있으므로 새로운 데이터를 생성하는 행위로 봅니다.
      • 이렇게 나누어진 것을 보통 CRUD라고 합니다. 자원에 대한 생성/조회/수정/삭제
Create : 생성(POST)
Read : 조회(GET)
Update : 수정(PUT),(PATCH)
Delete : 삭제(DELETE)
  • 표현
    • 해당 자원을 JSON, XML 같은 형식을 이용해서 자원을 표현하는 것 
    • HTTP에서는 Content-Type 이라는 헤더를 통해 표현 방법을 서술합니다.
  • REST API 예시
router.get('/books', (req, res) => {
	res.json({ success: true, data: getAllBooks() });
});
  • 위의 예시 코드는 /books 라는 URL을 통해 전체 책 목록을 불러와 응답해 주는 역할을 하는 API입니다.
  • Http 메서드인 GET은 리소스를 조회하는 역할을 담당하므로, 이 코드는 전체 책 목록을 조회(Read)하고, 그 결과를 Json 형식으로 반환합니다.
  • 이렇게 API가 REST 원칙에 따라 구현되었으므로, 이 API는 RESTful 하다 볼 수 있습니다.
  • 자원 => /books
    행위 => get
    표현 => res.json

 

2. Routing 이해 및 Router 학습

  • Routing 이란? Routing은 클라이언트의 요청 조건(HTTP 메서드, 주소 등)에 대응해 응답(Response)하는 방식
  • Router 란? Router는 클라이언트의 요청을 쉽게 처리 할 수 있게 도와주는 Express.js의 기본 기능중 하나입니다.
    • 일반적으로 Router는 아래와 같은 구조를 가집니다. 구조분해 설명하겠습니다.
    • 더보기
      router.METHOD(PATH, HANDLER);
    • router : Express.js의 라우터를 정의하기 위해 사용합니다.
    • METHOD : HTTP Method를 나타냅니다. (ex: get, post, put, patch, delete ...)
    • PATH : 실제 서버에서 API를 사용하기 위한 경로를 나타냅니다. (ex: users, posts, books ...)
    • HANDLER : 라우터가 일치할 때 실행되는 함수입니다.
  • Router를 사용해봐야겠죠?
// routes/goods.js
// 1. express에서 제공되는 Router 함수를 사용해 Express Router를 생성
import express from "express";

// Express.js의 라우터를 생성합니다.
const router = express.Router();

// 2. 예시로 endpoint를 작성보겠습니다.
// localhost:3000/api/ GET
router.get("/", (req, res) => {
  res.json("default url for goods.js GET Method");
});

// localhost:3000/api/about GET
router.get("/about", (req, res) => {
  res.json("goods.js about PATH");
});

// 3. 작성한 Router를 app.js에서 사용하기 위해 하단에 내보내주는 코드를 추가합니다.
export default router;
// app.js

import express from 'express';
// 4. goods.js 파일에서 노출된 router를 미들웨어에 사용하겠다고 작성합니다.
// 5. 이렇게 하면, routes/goods.js 파일은 app.js파일에서 route로 사용될 수 있습니다.
import goodsRouter from './routes/goods.js';

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

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

// 6. 이제부터 http://localhost:3000/ 뒤에 /api 로 시작되는 주소는 routes/goods.js 에 있는 Router 미들웨어를 통해 처리됩니다.
app.use('/api', [goodsRouter]);

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

 

  • 미들웨어(Middleware)란? 서버에서 요청을 받을 때 가끔 모든 요청에 대해 공통적인 처리를 하고싶은 경우가 생길 수 있습니다. 그럴때 미들웨어를 이용하여 서버의 요청/응답에 대해 공통적으로 관리가 가능합니다.
  • 미들웨어는 양 쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어, 네트워크를 통해서 연결된 여러 개의 컴퓨터에 있느 많은 프로세스들에게 어떤 서비스를 사용할 수 있도록 연결해 주는 소프트웨어를 말한다.
  • 3계층 클라이언트/서버 구조에서 미들웨어가 존재한다.
  • 웹 브라우저에서 데이터베이스로부터 데이터를 저장하거나 읽어올 수 있게 중간에 미들웨어가 존재하게 된다.

 

3. API Client 학습

  • API Client란
    • 개발단계에서 우리가 작성한 API의 요청을 확인하거나 테스팅 할 때 도움을 주는 입니다.
    • API Client를 사용함으로 개발 속도를 높이거나 잘못된 API 요청으로 인한 치명적인 에러를 예방하는데 도움을 받을 수 있습니다.
  • 대표적인 API Client 종류
    • Postman, Insomnia (이 두가지의 API Client는 API 요청(Request)을 손쉽게 구성할 수 있고, 응답(Response)을 직관적으로 확인할 수 있게 도와줍니다.)
    • 우리가 사용할 Insomnia는 사용자 친화적인 UI와 간편하게 API 테스팅을 할 수 있는 기능을 제공해주고 있습니다.
  • 이 API Client는 왜 필요한가?
    • 지금까지 우리는 주로 데이터를 가져오는 데 사용되는 Http Method 중 GET에 대응하는 API를 구현하고, 웹 브라우저를 통해 확인해왔습니다.
    • 그러나, 서버의 데이터를 조회하기 위해선 생성, 수정, 삭제와 같은 작업이 필요합니다.
    • 해당하는 작업을 수행하기 위해서는 POST, PATCH, PUT, DELETE 등의 Http Method를 사용하는 API를 개발하고 테스트 해야합니다.
    • 이러한 상황에서 Terminal에서 명령어를 입력하거나, Html 파일을 생성하여, 각각의 API를 테스트 하면 되긴하지만, 더욱 편리하게 서버에 보낼 데이터와 주소를 한번에 관리할 수 있는 API Client를 사용할 겁니다.

 

4. Request와 Response

  • Request란 클라이언트가 서버에게 전달하려는 정보나 메시지를 담는 객체를 의미합니다.
    • Request의 세부 사항에는 URL, Http method, 헤더, 쿼리 파라미터, 바디 데이터 등이 포함됩니다.
  • Response란 서버에서 클라이언트로 응답 메시지를 전송시켜주는 객체입니다.
    • Response의 세부 사항에는 상태 코드(status), 응답 데이터, 응답 헤더 등이 포함됩니다.
  • 서버 모듈
    • 모듈이란 프로그램을 구성하는 시스템을 기능 단위로 독립적인 부분으로 분리한 것이다.
    • Node.js 서버 모듈에는 대표적으로 Http 모듈과 Express.js가 존재합니다.
  • Express.js의  통신 흐름 파악하기
    • 클라이언트는 특정 URL과 데이터를 담은 요청(Request)을 서버에 전송합니다.
    • 서버는 받은 데이터에 따라 필요한 비즈니스 로직을 수행합니다.
    • 서버는 처리된 결과를 클라이언트에게 응답(Response)으로 보내줍니다.

 

5. Express.js의 req.res 객체

req 객체

  • req.body: Request를 호출할 때 body로 전달된 정보가 담긴 객체입니다.
    • express.json() Middleware를 이용하여야 해당 객체를 사용할 수 있습니다.
  • req.params: **라우터 매개 변수(Path Params)**에 대한 정보가 담긴 객체입니다.
  • req.query: Request를 호출할 때 쿼리 스트링으로 전달된 정보가 담긴 객체입니다.

res 객체

  • res.status(코드) : Response에 HTTP 상태 코드를 지정합니다.
  • res.send(데이터) : 데이터를 포함하여 Response를 전달합니다.
    • ex) res.send('Hello, World');
  • res.json(JSON) : JSON 형식으로 Response를 전달합니다.
    • ex) res.json({ message: 'Hello, World' });

Express.js의 Response 란?

  • 서버에서 클라이언트에게 보내는 메시지를 응답(Response)이라고 부릅니다.
  • Status는 서버가 클라이언트에게 응답(Response)를 보낼 때 Http 상태 코드를 전송하는 것을 나타내며, send, json은 서버가 클라이언트에게 응답(Response) 데이터를 전송하는 방법을 나열한 것입니다.
  • res.status(상태 코드), res.json(JSON), res.send(데이터)
    • res.json() 메서드는 JSON 형식의 데이터만 보낼 수 있습니다. Response Header의 Content-Type이 ‘application/json’으로 설정됩니다.
    • res.send() 메서드는 다양한 유형의 데이터를 보낼 수 있습니다.Response Header의 Content-Type을 데이터 유형에 따라 다르게 설정할 수 있습니다.

Express.js의 Request 란?

  • 클라이언트에서 서버로 보내는 메시지를 요청(Request)이라고 부릅니다.
  • body, params, query는 클라이언트가 서버에 요청(Request)을 보낼 때 데이터를 어떤 방식으로 전송하는지에 대한 여러가지 방법들을 나열한 것 입니다.

req.body: (Body)

app.post('/', (req, res) => {
  // Request에서 body 데이터를 ReqBody 변수에 할당한다.
  const ReqBody = req.body;

  return res.status(201).json({});
});
  • 클라이언트가 요청(Request)을 보냈을 때, Body에 데이터를 삽입하였을 때 사용됩니다.
  • req.body 를 사용하기 위해서는 express.json 미들웨어를 사용해야 합니다.
  • Body는 Query String, Path Variable(params)과 다르게, URL만을 가지고 어떤 데이터를 전달 하였는지 확인할 수 없는 특징을 가지고 있습니다.
  • Post, Put과 같은 Http method에서 사용됩니다.

req.query: (Query String)

app.get('/', (req, res) => {
  // Request에서 Query String 데이터를 ReqQuery 변수에 할당한다.
  const ReqQuery = req.query;

  return res.status(200).json({});
});
  • 클라이언트가 요청(Request)을 보냈을 때, URL에 원하는 Key-Value를 삽입하여 데이터를 전달합니다.
  • URL의 마지막에 ?기호를 이용해 Query String을 사용할 수 있습니다.
    ex) https://sparta.com?name=이용우&age=29
  • 특정 콘텐츠의 위치를 표시하거나 웹 페이지에 특정한 옵션을 설정할 때 사용합니다.
    ex) 게시글의 정렬, 특정 날짜의 게시글만 출력하는 옵션 설정 등
  • 주로 서버의 리소스를 필터링하거나 정렬하는 데 사용됩니다.
  • GET과 같은 Http method에서 사용됩니다.

req.params: (Path Variable)

app.get('/:name', (req, res) => {
  // Request에서 Path Params 데이터의 name Key를 가진 Value를 name 변수에 할당한다.
  const { name } = req.params;

  return res.status(200).json({});
});
  • 클라이언트가 요청(Request)을 보냈을 때, URL에 원하는 데이터를 삽입하여 전달합니다.
  • URL 특정 경로를 매개 변수로써 사용합니다.
  • 특정 게시글을 선택하거나 명확한 리소스를 지정해야할 때 사용합니다.
    ex) 게시글의 상세 정보 조회, 사용자의 상세 정보 조회

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

데이터 링크 계층에 관하여...  (1) 2024.09.03
물리 계층이란?  (1) 2024.09.03
Node.js 용어 정리 - 1주차  (0) 2024.08.29
TextRPG 만들기 - 1탄  (0) 2024.08.22
2024-08-12  (0) 2024.08.12