๐Ÿ‘จโ€๐Ÿ’ป npm ์ •๋ฆฌ

  • npm init -> package.json ์ƒ์„ฑ
  • npm install express -> express ์„ค์น˜(์„œ๋ฒ„ ๊ตฌ์ถ•์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋„์™€์คŒ)
  • npm install nodemon -> ํŒŒ์ผ์— ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ ํ•ด์คŒ
    package.json ํŒŒ์ผ์—์„œ "scripts" ๋ถ€๋ถ„์—์„œ test .. ๋‚ด์šฉ์€ ํ•„์š”์—†์œผ๋‹ˆ ์ œ๊ฑฐํ•˜๊ณ 

    "start": "nodemon app.js"

    ๋ฅผ ๋„ฃ์œผ๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ

    npm start

    ๋ฅผ ์น˜๋Š”๊ฑธ๋กœ app.js๋ฅผ ๋…ธ๋“œ๋ชฌ์œผ๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ‘จโ€๐Ÿ’ป express ์ •๋ฆฌ

	const express = require('express');

	const app = express();

	app.get("/", function(req, res) {
	res.send("<h1>Hello World</h1>")
	})

	app.listen(3000);

์ €๋ฒˆ ๊ฐ•์˜์—์„œ๋Š” ์ด์ œ send๋ฅผ ํ†ตํ•ด์„œ html์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์จ์„œ ๋ณด๋‚ด๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ด์ œ๋Š”

	app.get("/", function(req, res) {
	const htmlFilePath = path.join(__dirname, "views", "index.html");
	res.sendFile(htmlFilePath);
	})

	app.get('/restaurants', function(req, res) {
	const htmlFilePath = path.join(__dirname, "views", "restaurants.html");
	res.sendFile(htmlFilePath);} )

์ง์ ‘ ํŒŒ์ผ์„ ๋ณด๋‚ด๋Š” ํ˜•์‹, views ํด๋”์˜ restaurant.html ํŒŒ์ผ์„ ์ง์ ‘ ๋ณด๋‚ด๋Š” ํ˜•์‹์œผ๋กœ ๊ต์ฒดํ–ˆ๋‹ค.

	<a href="restaurants.html">
   	    <a href="/restaurants">

์›๋ž˜๋Š” ์œ„์˜ ๊ฒƒ์—์„œ ๋ฐ‘์˜ ๊ฒƒ์˜ ํ˜•์‹๋“ค๋กœ ๋ฐ”๊ฟ”์คฌ๋Š”๋ฐ, ์ด๋Ÿฌ๋ฉด ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ฆ‰ ์›๋ž˜ ๋„๋ฉ”์ธ ๋’ค์— href๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์›๋ž˜ ์žˆ๋˜ ํ™ˆํŽ˜์ด์ง€๊ฐ€ domain ๋’ค์— ๋‹ค๋ฅธ ๋ผ์šฐํ„ฐ๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์žˆ๋”๋ผ๋„ ๊ทธ ๋ผ์šฐํ„ฐ๋ฅผ ๋นผ๊ณ  href๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ด๋™ํ•œ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” website์—์„œ ์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” GET์ด์—ˆ๋‹ค๋ฉด ์ด์ œ๋Š” ์„œ๋ฒ„์ชฝ์œผ๋กœ ๋ณด๋‚ด๋Š” ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” POST๋ฅผ ์•Œ์•„๋ณด์ž

app.use(express.urlencoded({extended: false}));

css,js ํŒŒ์ผ์„ ๋ถ€๋ฅด๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ web์—์„œ ์˜ค๋Š” ์ •๋ณด๋“ค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

app.post("/recommend", function(req, res) {
	const restaurant = req.body; //object save
	const filePath = path.join(__dirname, "data", "restaurants.json");
	
	const fileData = fs.readFileSync(filePath);
	const storedRestaurants = JSON.parse(fileData);
	
	storedRestaurants.push(restaurant);
	
	fs.writeFileSync(filePath, JSON.stringify((storedRestaurants)));
	
	res.redirect("/confirm");
	
});

๊ทธ๋ฆฌ๊ณ  recommend์—์„œ ์ •๋ณด๊ฐ€ ์™”์„ ๋•Œ(์‹๋‹น ๊ด€๋ จ ์ •๋ณด ๊ฐ์ฒด๊ฐ€ ์˜ฌ ์˜ˆ์ •) ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  data ํด๋”์— ์žˆ๋Š” 'restaurants.json'ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  website์—์„œ๋Š” /confirm ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ํ–ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฒŒ ์ด๊ฒŒ html์˜ form์—์„œ ์˜ค๋Š” ์ •๋ณด๋“ค์ผํ…๋ฐ, html์˜ form์—

<form action="/recommend" method="POST">

์™€ ๊ฐ™์ด ์—ฐ๊ฒฐ(?) ์ž‘์—…์„ ๊ผญ ํ•ด์ฃผ๊ณ  ๋˜ํ•œ restaurants.json ํŒŒ์ผ์— ๋นˆ ๋Œ€๊ด„ํ˜ธ [] ์ ์–ด๋†“๋Š” ๊ฒƒ๋„ ์žŠ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๐Ÿ‘จโ€๐Ÿ’ป ๋ฌธ์ œ

๊ฐ•์˜์—์„œ npm install์„ ์น˜๋ฉด node_modules๊ณผ package-lock.json ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ๋‚˜๋Š” package-lock.json๋งŒ ์ƒ์„ฑ์ด ๋œ๋‹ค.

=> npm install ์ด๋ž€??

2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. ํŒจํ‚ค์ง€ ๋ช…์„ ๋ช…์‹œํ•ด ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋™์ž‘
    npm intall express
    npm install nodemon

๊ณผ ๊ฐ™์ด ํŠน์ • ํŒจํ‚ค์ง€๋ช…์„ ๋ช…์‹œํ•ด์„œ ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. "package.json"ํŒŒ์ผ์— ์˜์กดํ•˜์—ฌ ์„ค์น˜
    package.json ํŒŒ์ผ์—์„œ ์–ด๋–ค ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ ํ•˜์—ฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์„ค์น˜ํ•˜๋Š” ๊ฒƒ

๊ฐ•์˜์—์„œ๋Š” npm install์„ ์‚ฌ์šฉํ–ˆ๊ธฐ์— 2๋ฒˆ ์ผ€์ด์Šค์— ํ•ด๋‹น๋ ํ…๋ฐ ๊ทธ๋Ÿฌ๋ฉด ๋‚ด๊ฐ€ package.jsonํŒŒ์ผ์„ ์ œ๋Œ€๋กœ ์•ˆ๊ฐ€์ ธ์™”์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ์˜ค๋ฅ˜๊ฐ€ ๋–ด๋‹ค. ๊ฐ•์˜๋ฅผ ๋ณด๋‹ˆ package.jsonํŒŒ์ผ์ด ๋ฐ–์— ๋‚˜์™€์žˆ๋˜๋ฐ ๋‚˜๋Š” ํด๋” ์•ˆ์— ์ง‘์–ด๋„ฃ์–ด๋†“์€๊ฒŒ ์˜ค๋ฅ˜์˜ ์›์ธ์ด์—ˆ๋‹ค. ํ•ด๊ฒฐ:)

goorm ide์˜ Node.js ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ ์•ˆ์—์„œ๋Š” html ํŒŒ์ผ์ด ์•ˆ์—ด๋ฆฐ๋‹ค....

์•„๋ฌด๋ž˜๋„ ๊ตฌ๋ฆ„์—์„œ๋Š” node.js๋ž‘ html/css/js๋ž‘ ์Šคํƒ์ด ๋‹ค๋ฅด๋‹ˆ๊นŒ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์€๋ฐ.. ์Œ ๋‚ด๊ฐ€ ๋ชจ๋ฅด๋Š”๊ฒŒ ์žˆ๋Š” ๊ฑธ๊นŒ ์•„๋‹˜ ๊ตฌ๋ฆ„ide์˜ ํ•œ๊ณ„์ผ๊นŒ?

๊ฐ•์˜์—์„œ๋Š” live-server๋ฅผ ํ†ตํ•ด์„œ html์„ ์—ฌ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ npm์„ ํ†ตํ•ด์„œ live-server๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค.

npm install -g live-server

๋กœ ์ฒ˜์Œ์— ์„ค์น˜ํ• ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ 'deprecated'๋ผ๊ณ  ๋œจ๋ฉด์„œ package.json ํŒŒ์ผ์— ์ถ”๊ฐ€๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ

npm i live-server

๋กœ ์„ค์น˜ํ•˜๋‹ˆ๊นŒ ๋˜‘๊ฐ™์ด 'deprecated' ๋œจ๊ธฐ๋Š” ํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ package.json ํŒŒ์ผ์— ์ถ”๊ฐ€๊ฐ€ ๋˜์—ˆ๋‹ค.

๊ทธ ์ดํ›„ index.html์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์„œ ํ„ฐ๋ฏธ๋„์—์„œ

live-sever

๋ฅผ ์ž…๋ ฅํ•˜์—ฌ http://127.0.0.1:8080 ๋ผ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ๋ฐ›์•„์„œ ๋“ค์–ด๊ฐ”์ง€๋งŒ ๋˜ ์•ˆ๋œ๋‹ค... ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜ํ•ณใ…Žใ…Žใ…Ž

์„œ๋ฒ„์˜ ํ˜ธ์ŠคํŒ… ์„ค์ •์ด localhost ๋˜๋Š” 127.0.0.1 ์ด๋ผ๋ฉด 0.0.0.0 ์œผ๋กœ ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”.
๋ผ๊ณ  ๊ตฌ๋ฆ„์— ๋‚˜์™€์žˆ๊ธฐ๋Š” ํ•œ๋ฐ.. ์• ์ดˆ์— node.js ์ปจํ…Œ์ด๋„ˆ์—ฌ์„œ ํ˜ธ์ŠคํŒ… ์„ค์ •์ด ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ํฌํŠธ ์„ค์ •๋งŒ ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š๋‚˜ ์‹ถ๊ธดํ•œ๋ฐ.. ํ•˜ํ•ณ

์šฐ์„  live-server๋กœ ์—ฌ๋Š” ๋ฐฉ์‹์ด ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„์„œ ๋‚˜์˜ ์Šค์Šน๋‹˜ Mr.gpt๊ป˜ ์กฐ์–ธ์„ ๊ตฌํ–ˆ๋‹ค.

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
// ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ index.html ํŒŒ์ผ ์ œ๊ณต
res.sendFile(__dirname + '/frontend-site/index.html');
});

app.listen(port, () => {
console.log(Server is listening at http://localhost:${port});
});

js ํŒŒ์ผ์—์„œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  ์„œ๋ฒ„์—์„œ html์„ ์—ฌ๋Š” ๋ฐฉ์‹์ธ๋ฐ ... ๋œ๋‹ค! ๊ทผ๋ฐ css,js ๋‹ค ๋‚ ๋ผ๊ฐ€๊ณ  html๋งŒ ์ผœ์ง„๋‹ค!....

์›น์‚ฌ์ดํŠธ์—์„œ f12๋ฅผ ๋ˆ„๋ฅด๊ณ  ํ™•์ธ์„ ํ•ด๋ณด๋‹ˆ ๋ญ

'Refused to apply style from because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.'

์ด๋Ÿฐ์‹์œผ๋กœ ๋– ์„œ ํ™•์ธํ•ด๋ณด๋‹ˆ ๊ฒฝ๋กœ๋ฌธ์ œ๋‹ˆ ๊ฒฝ๋กœ ์•ž์— /๋ฅผ ๋ถ™์—ฌ์•ผ ํ•˜๋‹ˆ ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ํ•ด๋ดค๋Š”๋ฐ๋„ ์•ˆ๋ผ์„œ ์ด๊ฑด ๋ฒ„๋ฆฌ๊ธฐ๋กœ ๊ฐ•์˜๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹ˆ๊นŒ:)

๊ฐ•์˜์—์„œ ์•Œ๋ ค์คฌ๋‹ค. ํ•˜ํ•ณํ•ณํ•˜
์›๋ž˜ html์„ ๋ถ€๋ฅด๊ณ  html์—์„œ ๋‹ค์‹œ css, javascript, img ๋“ฑ์˜ ํŒŒ์ผ์„ ๋‹ค์‹œ ์š”์ฒญ(๋ถ€๋ฅด๋Š”)ํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค.
๊ทธ๋Ÿฐ๋ฐ app.js(์„œ๋ฒ„ ์ฝ”๋“œ ์ ์–ด๋…ผ ํŒŒ์ผ)์— ์ด๋Ÿฐ ์š”์ฒญ์„ ๋‹ค๋ฃจ๋Š” ๋ผ์šฐํŠธ์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ๋Š” html,css,js,img ์ฝ”๋“œ๊ฐ€ dynamic์ด ์•„๋‹ˆ๋ผ static์ด๋ผ๋Š” ๊ฐ€์ •ํ•˜์— app.js์—

app.use(express.static("public"));

์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์„œ ๊ฐ€๋Šฅํ•˜๋‹ค. public์ด๋ผ๋Š” ํด๋”(์ด๋ฆ„ ๋งˆ์Œ๋Œ€๋กœ ํ•ด๋„ ใ„ฑใ…Š)์— css,js,img์™€ ๊ฐ™์ด html์„ ๋กœ๋“œํ–ˆ์„ ๋•Œ ์ถ”๊ฐ€์ ์ธ ์š”์ฒญ์„ ๋ณด๋‚ผ ํŒŒ์ผ๋“ค์„ ๋ชจ์•„๋†“๊ณ  ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด
public์˜ ํŒŒ์ผ์„ ๋‹ฌ๋ผ๋Š” ์š”์ฒญ์„ ํ–ˆ์„ ๋•Œ, static์ด๋ฉด ์ œ๊ณต์„ ํ•ด์ค€๋‹ค.

๐Ÿ‘จโ€๐Ÿ’ป ๋А๋‚€์ 

์š”์ฆ˜ ์ข€ ๋‚˜ํƒœํ•ด์ง„ ๊ฒƒ ๊ฐ™๊ณ  ์ง‘์ค‘๋„ ์ž˜ ์•ˆ๋๋‹ค. ๊ทผ๋ฐ ๊ธ€๋กœ ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•˜๋ฉด ์ง‘์ค‘์ด ์ž˜๋˜๊ธฐ์— ์•ž์œผ๋กœ๋Š” ๋งค์ผ ๊ธ€ ํ•œ ๊ฐœ์”ฉ์„ ์“ฐ๋Š” ๊ฑธ ๋ชฉํ‘œ๋กœ ํ•˜๋Š”๊ฒŒ ์–ด๋–ค๊ฐ€ ์‹ถ๋‹ค.(๋ฌผ๋ฃฌ ํœด๊ฐ€ ์ œ์™ธ:)
์˜ค๋Š˜ html ๋กœ๋“œํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋งŽ์€ ์‹œ๊ฐ„์„ ์จ์„œ ์ง„๋„๋ฅผ ๋งŽ์ด ๋ชป๋‚˜๊ฐ„๊ฒŒ ์•„์‰ฝ๊ธด ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ด ๋ฌ๋“  ๋ญ๊ฐ€ ๋ฌ๋Š” ๋ฐฐ์›€์— ์žˆ์–ด์„œ ์–ด๋ ค์šด ๋ฌธ์ œ, ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ถ™์žก๊ณ  ๋Š˜์–ด์ง€๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ์— ์˜ค๋Š˜ ๊ณต๋ถ€์— ๋งŒ์กฑํ•œ๋‹ค. ๋‚ด์ผ๋„ ๊ธ€์ด ์˜ฌ๋ผ์˜ค๊ธฐ๋ฅผ...

profile
์ž˜ํ•˜์ง„ ๋ชปํ• ์ง€์–ธ์ • ๊พธ์ค€ํžˆ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž:)

0๊ฐœ์˜ ๋Œ“๊ธ€