3주차부터 Express.js 학습을 시작했다.
우선, 늘 그랬듯 몰랐던 개념 먼저 체크하고 가자.
서버 개발자는 API 설계를 할텐데, URL을 막 만드는 게 아니라 규칙이 있는 것을 처음 알았다.
특히 복수형 사용이 중요하다고 강조됐는데,
전체 상품 조회를 예로 들면, /product가 아닌 /products가 이상적이다.
개별 상품 조회 또한 /product가 아닌 /products/개별상품id가 이상적이다.
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");
위의 예시에서는 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을 사용해도 이런 습관을 만드는게 더 좋다고 한다.