elice/WIL

[week_06] Template Engine

๊ฑด๋ง๋”” 2022. 2. 18. 15:31

1. ํ…œํ”Œ๋ฆฟ ์—”์ง„

  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ HTML์˜ ํ˜•ํƒœ๋ฅผ ๋ฏธ๋ฆฌ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ €์žฅ
  • ๋™์ž‘ ์‹œ์— ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ ํ…œํ”Œ๋ฆฟ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ ์™„์„ฑ๋œ HTML ์ƒ์„ฑ
  • ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ ๋ฌธ๋ฒ•๊ณผ ์ž‘์„ฑ๋œ ํ…œํ”Œ๋ฆฟ์„ HTML๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต

1-1. Express.js์˜ ํ…œํ”Œ๋ฆฟ ์—”์ง„

  • EJS: html๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์˜ ํ…œํ”Œ๋ฆฟ ์—”์ง„
  • Mustache: ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์น˜ํ™˜ ์ •๋„๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ํ…œํ”Œ๋ฆฟ ์—”์ง„
  • Pug: ๋“ค์—ฌ์“ฐ๊ธฐ ํ‘œํ˜„์‹์„ ์ด์šฉํ•œ ๊ฐ„๋žตํ•œ ํ‘œ๊ธฐ์™€ ๋ ˆ์ด์•„์›ƒ ๋“ฑ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต

 

2. Pug

  • ๋“ค์—ฌ์“ฐ๊ธฐ ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ๋†’์Œ, HTML์„ ์ž˜ ๋ชจ๋ฅด๋”๋ผ๋„ ๋ฌธ๋ฒ•์  ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
  • layout, include, mixin ๋“ฑ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต
html
	head
    	title= title
    body
    	h1#greeting ์•ˆ๋…•ํ•˜์„ธ์š”
        a.link(href="/") ํ™ˆ์œผ๋กœ
  • HTML ๋‹ซ๊ธฐ ํƒœ๊ทธ ์—†์ด ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๋ธ”๋Ÿญ ๊ตฌ๋ถ„
  • = ์„ ์ด์šฉํ•ด์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • id๋‚˜ class๋Š” ํƒœ๊ทธ ๋’ค์— ์ด์–ด์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ
  • ( )์„ ์ด์šฉํ•ด์„œ attribute ์‚ฌ์šฉ
each item in arr
	if item.name == 'new'
    	h1 New Document
    else
    	h1 `${item.name}`
  • each ~ in ํ‘œํ˜„์‹์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์ˆœํ™˜ํ•˜๋ฉฐ HTML ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • if, else if, else๋ฅผ ์ด์šฉํ•ด ์ฃผ์–ด์ง„ ๊ฐ’์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์—ฌ HTML ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
// layout.pug
html
	head
    	title= title
    body
    	block content



// main.pug
extends layout
block content
	h1 Main Page
  • block์„ ํฌํ•จํ•œ ํ…œํ”Œ๋ฆฟ์„ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ์„ layout์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • layout์„ extendsํ•˜๋ฉด block ๋ถ€๋ถ„์— ์ž‘์„ฑํ•œ HTML ํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋จ
// title.pug
h1= title


// main.pug
extend layout
block content
	include title
    div.content
    	์•ˆ๋…•ํ•˜์„ธ์š”
    pre
    	include article.txt
  • ์ž์ฃผ ๋ฐ˜๋ณต๋˜๋Š” ๊ตฌ๋ฌธ์„ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘๊ณ  includeํ•˜์—ฌ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
  • ์ผ๋ฐ˜์ ์ธ ํ…์ŠคํŠธ ํŒŒ์ผ๋„ includeํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์— ํฌํ•จ ๊ฐ€๋Šฅ
  • layout์€ ๋ฐ”๊นฅ์ชฝ์˜ ํ‹€์„ ์„ ์–ธํ•˜๊ณ  ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ
  • include๋Š” ํ•˜๋‚˜์˜ ์กฐ๊ฐ์„ ๋งŒ๋“ค์–ด๋†“๊ณ  ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ
// listItem.pug
mixin listItem(title, name)
	tr
    	td title
       	td name
        
        

// main.pug
include listItem
table
	tbody
    	listItem('์ œ๋ชฉ', '์ด๋ฆ„')
  • mixin์€ ํ…œํ”Œ๋ฆฟ์„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • include๋Š” ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์ง€๋งŒ, mixin์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•˜์—ฌ ๊ฐ’์„ ๋„˜๊ฒจ๋ฐ›์•„ ํ…œํ”Œ๋ฆฟ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

3. Express.js์™€ pug์˜ ์—ฐ๋™

// app.js
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');



// request handler
res.render('main', {title: 'Hello Express'});
  • app.set์„ ์ด์šฉํ•ด ํ…œํ”Œ๋ฆฟ์ด ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ('views') ์ง€์ •
  • ์–ด๋–ค ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ• ์ง€ ์ง€์ •('view engine', 'pug')
  • res.render ํ•จ์ˆ˜๋Š” app.set์— ์ง€์ •๋œ ๊ฐ’์„ ์ด์šฉํ•ด ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ
    • render ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ…œํ”Œ๋ฆฟ์˜ ์ด๋ฆ„
    • render ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ’

3-1. Express.js์˜ app.locals

// app.js
app.locals.appName = "Express"

// main.pug
h1= appName // <h1>Express<h1>
  • Express.js์˜ app.locals๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด render ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๊ฐ’์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ํ…œํ”Œ๋ฆฟ์— ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋  ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ์—ญํ• 

3-2. express-generator ์‚ฌ์šฉ ์‹œ ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์ง€์ •ํ•˜๊ธฐ

$ express --view=pug myapp