
app.js : node.js๋ฅผ ํตํด ์๋ฒ ์ฝ๋๋ฅผ ์ ์ด๋๋ ๊ณณ
restaurants.json : ์๋น ์ ๋ณด๋ค์ ์ ์ฅํด๋์ ํ์ผ(์๋น๋ค์ ์ด๋ฆ, ์ฃผ์๋ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ก์ ์ ์ฅ๋๋ค.)
restaurant-item.ejs: ejs์ include ๊ธฐ๋ฅ์ ํตํด restaurants.ejs์ ์๋น ์ถ๋ ฅ ๋ด์ฉ์ ๋ฌถ์ด๋ ๊ฒ
404.ejs: page not found ํ์ํ๋ ํ์ด์ง
์ ๋ฒ๊น์ง ์๋ชป๋ url ํน์ ์๋ ์๋น id๋ฅผ ์ฐพ๋๋ค๋ฉด 404.ejs๋ฅผ ๋์ฐ๋ ๊ฒ์ ๊ธฐ์ตํ ๊ฒ์ด๋ค.
ํ์ง๋ง 404.ejs๊ฐ ๋ด์ ๋, ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํตํด status code๋ฅผ ๋ณด๋ฉด 404๊ฐ ์๋ ๊ฒ์ด๋ค.

์ด๋ฐ ๊ฒ๋ error ์ฝ๋์ ์ผ์น์์ผ์ค์ผ ํ๋ค.
๊ทธ ๋ฐฉ๋ฒ์ ์ด ํ์ด์ง๋ฅผ ์ถ๋ ฅํ ๋, status๋ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋๋ฐ
res.render("404");
res.status(404).render("404");
์๋ ์์์ ๋ฐ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ๋ฉด status๋ 404๋ก ๋ฐ๋๊ฒ ๋๋ค.
๋ญ ๋ณด์ด์ง ์๋ ๋ถ๋ถ์ด๋๊น ํฌ๊ฒ ์ค์์ฑ์ ๋ชป๋๋ ์๋ ์๋๋ฐ ์ด๋ฐ ๋ํ
์ผ๋ค์ด ๋์ค์ ํ๋ก์ ์ด ์ปค์ก์ ๋, ์คํ๊ฒํฐ๋ฉด ๊ฐ์ ํ๋ก์ ํธ๊ฐ ์๋๋ผ ์ ๊ตฌ์กฐํ, ์ ๋ฆฌ๋ ํ๋ก์ ํธ๋ก ๋ณด์ด๊ฒ ํ ๊บผ๋ผ๊ณ ์๊ฐํ๋ค.
app.js์์ ํจ์๋ค์์ ๊ฒน์น๋ ๋ถ๋ถ๋ค์ด ์๋ค ๋ฐ๋ก
const filePath = path.join(__dirname,"..", "data", "restaurants.json");
const fileData = fs.readFileSync(filePath);
const storedRestaurants = JSON.parse(fileData);
fs.writeFileSync(filePath, JSON.stringify((storableRestaurants)));
app.js๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํ๊ธฐ ์ํด ์ด ๋ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๋ก ์๋ก์ด'util/restaurant-data.js' ํ์ผ์ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
const fs = require("fs");
const path = require("path");
const filePath = path.join(__dirname,"..", "data", "restaurants.json");
function getStoredRestaurants() {
const fileData = fs.readFileSync(filePath);
const storedRestaurants = JSON.parse(fileData);
return storedRestaurants;
}
function storeRestaurants (storableRestaurants){
fs.writeFileSync(filePath, JSON.stringify((storableRestaurants)));
}
module.exports={
getStoredRestaurants: getStoredRestaurants,
// ๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฉํ ์ด๋ฆ: ์ด ํ์ผ์์ ํจ์ ์ด๋ฆ
storeRestaurants: storeRestaurants
}
์ ์ฒด ์ฝ๋๋ ์ด์ ๊ฐ์๋ฐ ํ๋์ฉ ์ดํด๋ณด์.
const fs = require("fs");
const path = require("path");
๋ฐ์์ fs์ path๋ฅผ ์ฌ์ฉํ๊ธฐ์ fs์ path๋ฅผ ๋ถ๋ฌ์ ์ฃผ๋ ๊ฒ์ ๋น์ฐํ ์ผ์ด๋ค.
const filePath = path.join(__dirname,"..", "data", "restaurants.json")
์ด๊ฑด getStoredRestaurants, storeRestaurants ํจ์ ๋ ๊ฐ ์ฌ์ฉํ๊ธฐ์ ์ ์ญ์ผ๋ก ๋นผ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ util์ด๋ ํ์ผ ์์ ์๊ธฐ์ ์๋ก ์ฌ๋ผ๊ฐ์ app.js๋ฅผ ์ฐพ์์ผ ํ๋ค.
๊ทธ๋์ ์์ ํด๋๋ก ์ฌ๋ผ๊ฐ๋ ".."์ ์ถ๊ฐํ ๊ฒ์ด๋ค.
module.exports={
getStoredRestaurants: getStoredRestaurants,
// ๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฉํ ์ด๋ฆ: ์ด ํ์ผ์์ ํจ์ ์ด๋ฆ
storeRestaurants: storeRestaurants
}
์ด๊ฒ ๋๋ ์ ์ผ ํฅ๋ฏธ๋ก์ ๋๋ฐ, ์ด ํ์ผ์์ ์ฌ์ฉํ ์ ์๋ ํจ์๋ค์ ์ ํ ์๊ฐ ์๋ค.
๋๋ ๋ค app.js์์ ์ฌ์ฉํด์ผ ํ๋ ๋ชจ๋ ์ ์๊ณ ๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฉํ ํจ์ ์ด๋ฆ๊ณผ ์ค์ ์ด ํ์ผ์์ ํจ์ ์ด๋ฆ์ ์ฝ๋ก ์ ๋๊ณ ์ ์ด์ฃผ๋ฉด ๋๋ค.
์ ๊ทธ๋ผ app.js์์ ์ด ํจ์๋ค์ ์ด๋ป๊ฒ ๋ถ๋ฌ์ฌ๊น?
const resData = require("./util/restaurant-data");
app.post("/recommend", function(req, res) {
const restaurant = req.body; //object save
restaurant.id = uuid.v4();
const restaurants = resData.getStoredRestaurants();
restaurants.push(restaurant);
resData.storeRestaurants(restaurants);
res.redirect("/confirm");
});
๋ค๋ฅธ ํจ์บ์ง์ฒ๋ผ require๋ก ๋ถ๋ฌ์ค๋ ์์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋ฃ๊ณ ํจ์๋ ๊ฐ์ ธ์จ ๊ฐ์ฒด์ .์ ๋ถ์ด๊ณ ํจ์๋ฅผ ๋ฃ์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํ ์ค์ฌ jsํ์ผ์ ๋๋ฌด ๋ง์ routes๋ค์ด ์๋ค๋ฉด, ์ด ๋ํ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๊ตฌ์กฐ์ ๋ ๊น๋ํ ๊ฒ์ด๋ค. ๊ทธ๋์ ๊ทธ routes๋ค์ ๋นผ์
const express = require("express");
const uuid =require("uuid");
const resData = require("../util/restaurant-data");
const router = express.Router();
router.get("/restaurants", function(req, res) {
const storedRestaurants = resData.getStoredRestaurants();
res.render("restaurants", { numberOfRestaurants: storedRestaurants.length,
restaurants : storedRestaurants})
} );
router.get("/restaurants/:id", function (req, res) {
const restaurantId = req.params.id;
const storedRestaurants = resData.getStoredRestaurants();
for(const restaurant of storedRestaurants) {
if(restaurant.id== restaurantId) {
return res.render("restaurant-detail", {restaurant: restaurant});
}
}
res.status(404).render('404');
});
router.get("/recommend", function(req, res) {
res.render("recommend");
} );
router.post("/recommend", function(req, res) {
const restaurant = req.body; //object save
restaurant.id = uuid.v4();
const restaurants = resData.getStoredRestaurants();
restaurants.push(restaurant);
resData.storeRestaurants(restaurants);
res.redirect("/confirm");
});
router.get("/confirm", function(req, res) {
res.render("confirm");
} );
module.exports = router;
์ด๋ฐ ์์ผ๋ก ๋ถ๋ฆฌํด์ค ์ ์๋ค.
const express = require("express");
const router = express.Router();
express๋ ๋ฉ์ธ ํ์ผ์์๋ง ์คํํ๊ธฐ์ express()๊ฐ ์๋๋ผ ์์ ๊ฐ์ด ์์์์ฑํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
module.exports = router;
๊ทธ๋ฆฌ๊ณ ์์์๋ ํ๋์ด ์ด๊ฑธ ๋ฉ์ธ ํ์ผ์์ ์ฌ์ฉํ ์ ์๊ฒ export ํด์ค์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์ธ ํ์ผ์์๋
const restaurantRoutes = require("./routes/restaurants");
app.use("/", restaurantRoutes);
์ด์ ๊ฐ์ด ํ์ผ์ ๋ถ๋ฌ์จ๋ค์ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด์ ์ด ํ์ผ์ ์ฑ ํ๊ฒ ํ๋ฉด ๋๋ค.
๋ด๊ฐ ํ๋๋ค๋ ํํ์ ์ฌ์ฉํ ์ด์ ๋ "./routes/restaurants" ํ์ผ์ ๋ค์ด๊ฐ๋ค๊ฐ ํด๋น๋๋ ๊ฒ ์์ผ๋ฉด ๋ค์ ๋์์ ๋ฉ์ธ ํ์ผ์์ ๋๋จธ์ง ์ฝ๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฃผ์
์ฝ๋๋ฅผ ์ฎ๊ธฐ๋ฉด์ require ํด์ผ ํ๋ ๊ฒ๋ค ์ ์ฑ๊ธฐ๊ณ ํ์ผ ์๋๊ฒฝ๋ก ๋ฐ๋๋ ๊ทธ๊ฒ๋ ์ ์์ ํด์ค์ผ ํ๋ค.
<form action="/restaurants" method="GET">
<input type="hidden" value="<%= nextOrder %>" name="order">
<button class="btn">Change Order</button>
</form>
์ด์ ๊ฐ์ด html ์ฝ๋์ ๋ฒํผ์ ์ถ๊ฐํ๋ค๊ณ ํด๋ณด์.
๋ฒํผ์ ๋๋ฅด๋ฉด url ๋ค์๋
?order=nextOrder
์ด๋ ๊ฒ ์ฟผ๋ฆฌ๊ฐ ๋ถ๋๋ค.(์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ ํญ์ ?๊ธฐํธ๋ฅผ ํตํด "์ฃผ ๊ฒฝ๋ก"์ ๋ถ๋ฆฌ๋จ)
์ด๊ฑธ ์ด์ฉํด์ ๊ธฐ๋ฅ๋ค์ ๋ง๋ค ์ ์๋๋ฐ, ์ ๋ฒํผ์ด sorting์ ์ค๋ฆ์ฐจ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ฆฌํ๋ ๋ฒํผ์ด๋ผ๋ฉด
restaurant.js์
router.get("/restaurants", function(req, res) {
let order = req.query.order;
let nextOrder = "desc";
if(order !== "asc" && order !== "desc") {
order="asc";
}
if(order === "desc"){
nextOrder="asc";
}
const storedRestaurants = resData.getStoredRestaurants();
storedRestaurants.sort(function(resA, resB) {
if((order === "asc" && resA.name > resB.name)||
(order === "desc" && resB.name > resA.name)){
return 1;
}
return -1;
});
res.render("restaurants", {
numberOfRestaurants: storedRestaurants.length,
restaurants : storedRestaurants,
nextOrder: nextOrder
})
} );
์ด๋ฐ ์์ผ๋ก ํด์
let order = req.query.order;
์ฟผ๋ฆฌ๋ฅผ ์ก์์(?) ๊ฐ์ ๊ฐ์ง๊ณ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ์ ์๋ค.
์ ๋ง ๊ตฌ์กฐํ๋ฅผ ํ๋ ๊น๋ํด์ง๋ ๊ฒ์ด ํ์ฐํ ๋ณด์ธ๋ค.
๋ฌผ๋ฃฌ ๋ชจ๋ฅด๋ ์ฌ๋๋ค์ ํด๋์ ํ์ผ์ด ๋์ด๋๋ ๊ฒ์ด ๋ ์ง์ ๋ถํด๋ณด์ผ ์ ์์ง๋ง ํด๋, ํ์ผ์ ์ ์ฒด์ฑ์ ์ญํ ์ ๊ฐํ์์ผ์ค์ผ๋ก ๋์ฑ ๋ณด๊ธฐ ํธํ๊ฒ ๋ง๋๋ ๊ฒ์ด ํ์คํ ๋๊ปด์ง๋ค.
๋ด๊ฐ ํผ์ ํ๋ก์ ํธํ ๋๋ ์ด์ ๊ฐ์ด ๊น๋ํ๊ธฐ๋ฅผ.. ใ