MVC는 Model,View,Controller의 약자로 애플리케이션이(소프트웨어) 동작하는 방식에 대한 하나의 디자인 패턴이다.
하나의 애플리케이션을 구성하는 요소들을 세가지의 역할로 구분한다.
유저가 보게되는 페이지(View), 데이터를 처리하는 요소(Model), 이 둘의 사이에서 제어를 담당하는 요소(Controller)들로 구성되는 애플리케이션을 개발하면 각각의 요소들을 개발할 때, 요소가 담당하는 역할에만 집중하여 개발을 진행할 수 있다.
각자의 역할에만 집중하여 개발을 하면 다음과 같은 장점이 있다.
1. 유연하고 확장하기 쉽다.
2. 개발자와 디자이너간의 협업이 수월해진다.
애플리케이션이 작동하는데 필요한 모든 데이터를 가지고 있거나 또는 모든 데이터가 저장된 데이터베이스와 상호작용하여 데이터를 제공할 수 있어야한다.
Controller가 요구하는 바에따라 알맞은 데이터를 제공해주는 역할을 한다.
유저에게 보이는 화면을 담당한다.(html,css등)
페이지에서 유저에 의해 일어나는 액션이나 이벤트를 Controller에게 전달하고 Controller로 부터 받는 데이터를 화면에 그려서 유저에게 보여주는 역할을 한다.
View와 Model의 중간에서 제어(Control)를 담당한다.
View에서 일어나는 액션,이벤트들을 전달받아 model에게 데이터를 요구하는 역할과 model이 제공한 데이터를 다시 View에게 전달하는 역할을 한다.
SSR에서 html을 조금 더 세련되게 쓸 수 있도록 돕는 express 뷰 엔진이다. 이는 html태그들과 javascript를 함께 실행할 수 있게 돕는다
pug는 파일을 렌더링하여 html로 변환한 뒤 내부의 javascript(없을 수도 있음)를 실행하여 텍스트로 바꾼 후 유저 UI를 형성한다.
express, res.render("index",{pageTitle:"home"});과 같이 사용
여기서, "index"는 index.pug를 말하고
두 번째 파라미터는 객체 형태로 값을 전달할 수 있다. ex) h1=pageTitle // home
뼈대가 될 레이아웃 안에 block만 생성해주고 이를 상속받은 후 block 내부를 채워줌으로써 객체처럼 템플릿을 이용할 수 있다! 특히 일일이 head 내용을 바꿀 필요 없어서 꿀꿀!
// base.pug
doctype html
html(lang="ko")
head
title 제목입니다
link(...)
body
main
block content
script
// main.pug
extends base
block content
h1 hello world!
// footer.pug
footer © #{new Date().getFullYear()} Wow!
// base.pug
doctype html
html(lang="ko")
head
title 제목입니다
link(...)
body
main
block content
include footer <====== 이렇게 첨부
script
이는 수많은 블럭들에 똑같은 템플릿을 적용해야할 때 사용하면 꿀이다. 마치 for문을 쓰는 것과 비슷하다. include로 적용 후 each ~ in 안에 +(함수명)으로 사용하면 된다.
/ video.pug
mixin video(info)
a(href=`/videos/${info.id}`).video_mixin
div.video_mixin_data
span.video_mixin_title=info.title
div.video_mixin_meta
span #{info.owner.name} ▪
span #{info.meta.views} 회
// main.pug
include mixins/video
extends base
block content
div
each video in videos
+video(video) <==== 이렇게