본 학습은 postgreSQL data 바인딩 및 sequelize를 통한 추가에 대한 logic 구현이 주 목적이지만, express-handlebars에 대한 기본 구조까지 폭넓게 진행하도록 한다.
일단 hard coding을 통해 data를 구성하여 data ADD 구조를 먼저 확인해본다 :
visual studio 상에서 직접 데이터를 작성
const data = {
title: 'WANTED FOR CPP DEVELOPER',
technologies: 'REACT, JAVA, JAVA SCRIPT',
budget: '$90000',
description: 'SPECIFIC COMPANY A',
contact_email: 'COMPANY_A@gmail.com'
}
1차적으로 구성한 data를 postgresql table에 저장하기 위한 logic은 다음과 같다.
- 구성한 data를 직접적인 url요청(router.get)을 통해 table에 추가한다.
- ※ router level에서 추가적인 url 요청을 통해 데이터를 postgresql table에 전달하는 구조이다.
- table 구성 완료 및 데이터 추가 이후 이전의 url로 redirect한다.
/tables(router 레벨 요청의 처음 경로) get 요청 시 저장된 data를 log 출력
//WE CAN route url request in detail from application level.
//This router is for formatting more route path and request from router level.
router.get('/', (req, res) => {
//res.send('THIS IS entities')
Model.findAll()
.then(list=>{
console.log(list)
res.sendStatus(200)
})
.catch(err => console.error('ERROR FOUND : ', err))
})
위에서 table 구성에 맞게 생성한 data들을 ./tables/add(=url) 요청을 통해 정의한다.
그 후 postgresql 측에 전달하여(Model.create) data들을 실제 add(추가)한다.
※ DATA CREATE to postgresql server
//DATA ADD
router.get('/add', (req, res) => {
//data add(by get request)
const data = {
title: 'WANTED FOR CPP DEVELOPER',
technologies: 'REACT, JAVA, JAVA SCRIPT',
budget: '$90000',
description: 'SPECIFIC COMPANY A',
contact_email: 'COMPANY_A@gmail.com'
}
//destructuring
let {title, technologies, budget, description, contact_email} = data
//ADD data to table information
Model.create({
title: title,
technologies: technologies,
budget: budget,
description: description,
contact_email: contact_email
})
.then(list => res.redirect('/tables'))
.catch(err=>console.error('ERROR FOUND ', err))
})
data 정의 및 저장
저장 후 router의 첫 페이지('./tables')로 이동한다.
log 화면 및 postgresql server에서 data add가 정상적으로 되었는지 확인한다.
express-handlebars는 기존의 CSS나 React xml과는 달리 문법적으로 생소하다.
프로젝트를 진행하면서 학습한 부분을 바탕으로 express-handlebars의 개념과 구조 등을 참조하도록 한다.
handlbars가 적용되는 부분은 app.js에서 최초로 보이는 Home이 아닌, router 레벨에서 화면전환이 이루어진 그 이후 시점부터이다.
Home에 대한 구성은 별도로 get request, rendering logic을 구성해주어야 한다.
expree-handlebar를 사용하기 위해선 기본 template의 확장자를 별도 설정해주어야 한다.
//set middleware before url request
app.engine('handlebars', exphbs({defaultLayout: 'main'}))
app.set('view engine', 'handlebars')
기본 template에서 body는 별도 구성해준다.
<body>
<header class="inner">
<h2><a href="/"><i class="fas fa-code"></i>
What_is_YOUR_POSTGRESQL_LIST?</a></h2>
<nav>
<ul>
<li>
<a href="/">Home</a>
</li>
<li>
<a href="/tables">All tables</a>
</li>
<li>
<a href="/tables/add">Add list to table</a>
</li>
</ul>
</nav>
</header>
<div class="container">
{{{body}}}
</div>
</body>
위 main.handlebars 코드에서, 실제적으로 화면 body 부분에 나타나는 부분은 {{{body}}} 코드에 해당된다.
이 {{{body}}} 코드는 아래의 render 부분
//WE CAN route url request in detail from application level.
//This router is for formatting more route path and request from router level.
router.get('/', (req, res) => {
//res.send('THIS IS entities')
Model.findAll()
.then(list=>{
//console.log(list)
res.render('list', {
list: list
})
})
.catch(err => console.error('ERROR FOUND : ', err))
})
즉 res.render 되는 부분이 'list'를 가르키기 때문에, list.handlebars를 body 부분에 매칭시켜 화면에 나타나도록 한다.
이러한 express-handlebars의 template 구성은 위와 같이 되어있는 것으로 보면 된다.
data binding to template(handlebars)
data binding이 안되거나, undefined 등의 오류를 발생하지 않기위해선
이 잘 이루어져야 한다.
handlebars matching
변수 matching
list.handlebars (main handlebars의 body부분)
<section id="list" class="container">
<h1>HELLO!</h1>
{{#each list}}
<div class="datalist">
<h3>{{dataValues.title}}</h3>
<p>{{dataValues.description}}</p>
<ul>
<li>Budget : {{dataValues.budget}}</li>
<li>
<a href="mailto:{{dataValues.contact_email}}" class="btn btn-reverse">Apply now</a>
</li>
</ul>
<div class="tech">
<small>Technologies Needed: <span>{{dataValues.Technologies}}</span></small>
</div>
</div>
{{else}}
<p>No LIST available</p>
{{/each}}
</section>
위 코드를 통해 알 수 있는 handlebars 문법은 아래와 같다.
처음의 Home 화면은 express handlbars의 middleware가 적용되지 않는다.
//Home view rendering by index template(handlebars)
app.get('/', (req, res)=> {
res.render('index', { layout : 'landing'})
})
Home과 같이 router가 없을 경우엔, 위와 같이 app.js 의 root directory('/')로 부터 따로 구성을 해주어야 Home 화면 구현이 가능하다.
기본 구성이 정해져 있다.
※ ~ : 파일, ▶ : 폴더
views
~ add.handlebars (body, by render)
~ index.handlebars (body, by render)
~ list.handlebars (body, by render)
▶ layouts (뼈대가 되는 handlbars)
~ main.handlebars (*defalut layer)
~ landing.handleabars
app.js
//set middleware before url request
app.engine('handlebars', exphbs({defaultLayout: 'main'}))
app.set('view engine', 'handlebars')
//set static folder
app.use(express.static(path.join(__dirname, 'public')))
<link rel="stylesheet" href="/css/style.css">
main.handlebars
<link rel="stylesheet" href="/css/style.css">
<title>CodeGig</title>
</head>
sequelize / postgresql 학습링크
https://www.youtube.com/watch?v=6jbrWF3BWM0
handlebars npm 공식문서
https://www.npmjs.com/package/@handlebars/allow-prototype-access
handlebars 개념/구조
https://velog.io/@parkoon/%EC%8B%A4%EB%AC%B4%EC%97%90%EC%84%9C-Handlebars-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-feat-express
https://velog.io/@hwang-eunji/nodejs-7-express-handlebars-%ED%85%9C%ED%94%8C%EB%A6%BF%EC%97%94%EC%A7%84
handlebars 구조
https://stackoverflow.com/questions/41252105/how-to-set-handlebars-layout-directory
handlebars 예제
https://programmingsummaries.tistory.com/381
git commit 용량이 클 경우 오류해결방안
https://jonhyuk0922.tistory.com/106