[주간 복습] 3주차 - Express.js 학습 시작

김지환·2024년 3월 17일

3주차부터 Express.js 학습을 시작했다.

우선, 늘 그랬듯 몰랐던 개념 먼저 체크하고 가자.

1. REST API URL 규칙

서버 개발자는 API 설계를 할텐데, URL을 막 만드는 게 아니라 규칙이 있는 것을 처음 알았다.

  • 소문자만 사용한다.
  • 언더바(_)는 사용하지 않는다. 대신, 하이픈(-)을 사용한다.
  • URL의 마지막에 "/"는 붙지 않는다.
  • 행위를 포함하지 않는다.(HTTP Method를 포함하지 않는다.)
  • 파일 확장자를 적지 않는다.
  • 복수형을 사용한다.

특히 복수형 사용이 중요하다고 강조됐는데,
전체 상품 조회를 예로 들면, /product가 아닌 /products가 이상적이다.
개별 상품 조회 또한 /product가 아닌 /products/개별상품id가 이상적이다.


2. Express.js

2.1 Express의 미들웨어

Express는 미들웨어 함수들이 호출되며 동작한다.
미들웨어 함수는 일반적으로 req, res, next를 매개변수로 갖고 각각 요청객체, 응답객체, 다음 미들웨어 호출 함수의 역할을 한다.
Express는 일반적으로 위에서부터 코드를 실행한다.
next()가 실행되면 다음 미들웨어로 이동하고,
next()가 실행되지 않으면, req(요청객체)가 이동할 수 없음. 이는 곧 해당 미들웨어에서 res(응답객체)를 반환한다는 것임.

const express = require("express");

const app = express();

app.use((req, res, next) => {
//  ... 이런 저런 작업을 했어
  next();
});

app.use((req, res, next) => {
// ... 이런 저런 작업을 했어2
   next();
});

app.use((req, res, next) => {
  res.send("여기서 끝");
});

app.listen("8888");

2.2 Express의 use

위의 예시에서는 app.use를 사용했는데 app.Method(get, post 등)을 사용할 수 있다.
하지만 use와 다른 method는 차이가 있는데
첫번째 매개변수로 아래와 같이 요청의 경로를 전달할 수 있다.

const express = require("express");

const app = express();

app.use("/", (req, res, next) => {
  res.send("<h1>hello express.js!</h1>");
});

app.use("/test/1", (req, res, next) => {
  res.send("<h1>one!</h1>");
});

app.use("/test", (req, res, next) => {
  res.send("<h1>TEST Success</h1>");
});

app.listen("8888");

하지만 위의 코드를 실행하면 어떤 주소로 이동해도 "hello express.js!"만 나오는 것을 확인할 수 있는데,
앞서 설명한 바와 같이 Express는 위에서부터 코드를 읽는데,
use()의 경우는 뒤에 전달되는 요청의 경로가 완벽하게 일치하지 않고 경로의 첫 글자만 같아도 그냥 매칭시킨다.

위의 예시에서 가장 먼저 "/" 경로가 매칭되는데 "/test" 경로도 "/"로 시작되기 때문에 가장 위에있는 use() 미들웨어 함수에서 처리가 된다.

때문에 아래와 같은 순서로 재배열해야한다.

app.use("/test/1", (req, res, next) => {
  res.send("<h1>one!</h1>");
});

app.use("/test", (req, res, next) => {
  res.send("<h1>TEST Success</h1>");
});

app.use("/", (req, res, next) => {
  res.send("<h1>hello express.js!</h1>");
});

위와 같이 요청 경로에 따라 미들웨어 함수를 배열하는 습관을 만들면 좋다고 한다.

하지만 app.get이나 app.post와 같은 http method기반 함수는 URL이 정확하게 일치해야 미들웨어 함수가 실행된다.

Q. 그냥 use 말고 get이나 post 쓰면 되잖아?
A. 맞는말임. 그게 더 코드의 의미가 명확함. get을 사용해도 이런 습관을 만드는게 더 좋다고 한다.

profile
세상의 문제 해결을 즐기는 프론트엔드 개발자

0개의 댓글