백엔드: Node js
프론트엔드: bootstrap
(출처: https://startbootstrap.com/template/small-business)
(필요에 따라 Typescript로 기능 추가할 예정)
DB: MySQL
+) 파일이 여러 개이기 때문에 복수를 붙였다.
index.js
exports.getIndex = (req, res, next) => {
res.render("index", { pageTitle: "Welcome E-Book" });
};
homeRoutes.js
const express = require('express');
const indexController = require('../controllers/index');
const routes = express.Router();
routes.get('/', indexController.getIndex);
module.exports = routes;
그러면 Controller에 있는 render가 index파일을 사용자에게 보여주는 식으로 흘러가는 것이다.
index.ejs
<%- include('includes/head-nav.ejs')%>
<!-- Page Content-->
<div class="container px-4 px-lg-5">
<!-- Heading Row-->
<div class="row gx-4 gx-lg-5 align-items-center my-5">
<div class="col-lg-7"><img class="img-fluid rounded mb-4 mb-lg-0" src="https://dummyimage.com/900x400/dee2e6/6c757d.jpg" alt="..." /></div>
<div class="col-lg-5">
<h1 class="font-weight-light">Business Name or Tagline</h1>
<p>This is a template that is great for small businesses. It doesn't have too much fancy flare to it, but it makes a great use of the standard Bootstrap core components. Feel free to use this template for any project you want!</p>
<a class="btn btn-primary" href="#!">Call to Action!</a>
</div>
</div>
<!-- Call to Action-->
<div class="card text-white bg-secondary my-5 py-4 text-center">
<div class="card-body"><p class="text-white m-0">This call to action card is a great place to showcase some important information or display a clever tagline!</p></div>
</div>
<!-- Content Row-->
<div class="row gx-4 gx-lg-5">
<div class="col-md-4 mb-5">
<div class="card h-100">
<div class="card-body">
<h2 class="card-title">Card One</h2>
<p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem magni quas ex numquam, maxime minus quam molestias corporis quod, ea minima accusamus.</p>
</div>
<div class="card-footer"><a class="btn btn-primary btn-sm" href="#!">More Info</a></div>
</div>
</div>
<div class="col-md-4 mb-5">
<div class="card h-100">
<div class="card-body">
<h2 class="card-title">Card Two</h2>
<p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quod tenetur ex natus at dolorem enim! Nesciunt pariatur voluptatem sunt quam eaque, vel, non in id dolore voluptates quos eligendi labore.</p>
</div>
<div class="card-footer"><a class="btn btn-primary btn-sm" href="#!">More Info</a></div>
</div>
</div>
<div class="col-md-4 mb-5">
<div class="card h-100">
<div class="card-body">
<h2 class="card-title">Card Three</h2>
<p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem magni quas ex numquam, maxime minus quam molestias corporis quod, ea minima accusamus.</p>
</div>
<div class="card-footer"><a class="btn btn-primary btn-sm" href="#!">More Info</a></div>
</div>
</div>
</div>
</div>
<%- include('includes/footer.ejs')%>
app.js
const path = require('path');
const express = require('express');
const bodyParser = require('body-parser');
const indexRoutes = require('./routes/homeRoutes');
const app = express();
app.set('view engine', 'ejs');
app.set('views', 'views');
app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname, 'static')));
app.use(indexRoutes);
app.listen(3000);
예시 'age=26&name=yulgok'의 url형식을 =>
{'age': 26, 'name': yulgok}으로 값을 받을 수 있다는 것
최종 작동 순서
사용자 요청 -> app.js -> homeRoutes -> indexController -> index.ejs -> 사용자에게 반환