notion 04 review

김지우·2023년 2월 9일
0

TIL

목록 보기
16/16
post-thumbnail

이번엔 라우팅의 개념을 학습하고 refresh 도구인 nodemon을 설치하여 적용해보았다.

이전에 만들어 두었던 API를 Rest-API로 만들어본 뒤 express로 실행해 보았다. 또한, Swagger를 활용해 API-Docs를 제작했다.

코드캠프 동안 Nest.js와 GraphQL-API를 주로 사용하여 프로젝트를 진행해서 Node와 Rest-API는 확실히 익숙치가 않다.

nodemon

코드를 수정할때마다 서버를 종료하고 다시 시작하기를 반복하는 문제점을 해결해주는 도구.

📌 설치 방법

  1. yarn add nodemon
  2. package.json 파일에 scripts 작성
  "scripts": {
    "dev": "nodemon index.js"
  },
  1. yarn dev로 서버 실행

라우팅

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

라우팅의 기본 문법
app.METHOD(PATH, HANDLER)

  • app은 express의 인스턴스입니다.
  • METHOD는 HTTP 요청 메소드입니다.
  • PATH는 서버에서의 경로입니다.
  • HANDLER는 라우트가 일치할 때 실행되는 함수입니다.
1. 홈페이지에서 'Hello World!'로 응답
app.get('/', function (req, res) {
  res.send('Hello World!');
});

2. 애플리케이션의 홈 페이지인 루트 라우트(/)에서 POST 요청에 응답
app.post('/', function (req, res) {
  res.send('Got a POST request');
});

API-Docs를 제작하기 위한 Swagger 설치

설치방법 :
yarn add swagger-ui-express swagger-jsdoc

Swagger 문법 :
boards.swagger.js에 따로 작성

/**
 * @swagger
 * /boards:
 *   get:
 *     summary: 게시글 가져오기
 *     tags: [Board]
 *     parameters:
 *          - in: query
 *            name: number
 *            type: int
 *     responses:
 *       200:
 *         description: 성공
 *         content:
 *           application/json:
 *              schema:
 *                  type: array
 *                  items:
 *                      properties:
 *                          number:
 *                              type: int
 *                              example: 3
 *                          writer:
 *                              type: string
 *                              example: 철수
 *                          title:
 *                              type: string
 *                              example: 제목입니다~~~
 *                          contents:
 *                              type: string
 *                              example: 내용입니다!!!
 */

/**
 * @swagger
 * /boards:
 *   post:
 *     summary: 게시글 등록하기
 *     tags: [Board]
 *     responses:
 *          200:
 *              description: 성공
 */

Swagger API문서를 만들어주는 문법
config.js에 따로 작성

export const options = {
  definition: {
    openapi: "3.0.0",
    info: {
      title: "mini-poject-API-Docs",
      version: "1.0.0",
    },
  },
  apis: ["./swagger/*.swagger.js"], // files containing annotations as above
};

Swagger UI를 사용하기 위한 문법
index.js에 따로 추가

import swaggerUi from 'swagger-ui-express'
import swaggerJSDoc from 'swagger-jsdoc'
import { options } from './swagger/config.js'

...

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerJSDoc(options)));

createTokenOfPhoneRest-API로 만들기(핸드폰 번호에 인증번호 전송 로직)

// index.js

import express from "express";
import {
  checkValidationPhoneNumber,
  getToken,
  sendTokenToSMS,
} from "./phone.js";
import swaggerUi from "swagger-ui-express";
import swaggerJSDoc from "swagger-jsdoc";
import { options } from "./swagger/config.js";

const app = express();

app.use(express.json()); // express는 기본적으로 JSON을 읽지 못하므로 JSON을 읽을 수 있게 만들어주는 문법

app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerJSDoc(options))); // swagger UI를 사용하기 위한 문법


app.post("/tokens/phone", (req, res) => {
  const myPhone = req.body.myPhone;

  // 1. 휴대폰 번호 자릿수 확인
  const isValid = checkValidationPhoneNumber(myPhone);
  if (isValid === true) {
    // 2. 핸드폰 토큰 6자리 만들기
    const myToken = getToken();

    // 3. 핸드폰 번호에 토큰 전송
    sendTokenToSMS(myPhone, myToken);
    res.send("인증 완료");
  }
});

app.listen(3000, () => {
  console.log(`Example app listening on port ${3000}`);
});


// phone.js

export function checkValidationPhoneNumber(phoneNumber) {
  if (phoneNumber.length !== 10 && phoneNumber.length !== 11) {
    console.log("Error, 핸드폰 번호를 정확히 입력해주세요.");
    return false;
  } else {
    return true;
  }
  // if문을 활용한 에러핸들링 추가(phoneNumber)
}

export function getToken() {
  const count = 6;

  if (count === undefined) {
    console.log("Error, count의 값을 입력해주세요.");
    return;
  } else if (count <= 0) {
    console.log("Error, count의 값이 너무 작습니다.");
    return;
  } else if (count > 10) {
    console.log("Error, count의 값이 너무 큽니다.");
    return;
  }
  // if문을 활용한 에러핸들링 추가(count)

  const Token = String(Math.floor(Math.random() * 10 ** count)).padStart(
    count,
    "0"
  );

  return Token;
}

export function sendTokenToSMS(phoneNumber, Token) {
  console.log(`${phoneNumber}번호로 인증번호 ${Token}이 전송되었습니다.`);
}
profile
백엔드 성장 기록

0개의 댓글