# Doit! - 뷰 템플릿 적용하기

자바스크립트 코드 안에 응답 문자열을 입력하는 것보다 응답 웹문서를 별도 파일로 만들어 사용하는 것이 더 좋다.

## 08-1 ejs 뷰 템플릿 사용하기

뷰 템플릿을 사용하면 웹 문서의 기본 형태는 뷰 템플릿으로 만들고 데이터베이스에서 조회한 데이터를 이 템플릿 안의 적당한 위치에 넣어 웹 문서를 만들게된다. 이렇게 뷰 템플릿을 사용해 결과 웹 문서를 자동으로 생성한 후 응답을 보내는 역할을 하는 것이 **View Engine**이다.

### 뷰 템플릿으로 로그인 웹 문서 만들기

```javascript
//뷰 엔진 설정
app.set('views',__dirname+'/views');
app.set('view enginge','ejs');
console.log('뷰 엔진이 ejs로 설정되었습니다.');
```

`set()`은 속성을 설정하는 역할을 한다.

```
//login_success.ejs
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>로그인 성공 페이지</title>
</head>
<body>
    <h1>로그인 성공</h1>
    <div><p>사용자 아이디 : <% = userid %> </p></div>
    <div><p>사용자 이름 : <% = username %> </p></div>
    <br><br><a href="/public/login.html">다시 로그인하기</a>
</body>
</html>
```

```javascript
    res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
    var context = {userid:paramId, username:paramName};
    req.app.render('login_success',context,function(err,html){
        if (err) {
            console.log('뷰 렌더링 중 오류 발생'+err.stack);

            res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
            res.write('<h1>뷰 렌더링 중 오류 발생</h1>');
            res.write('<p>' + err.stack+'</p>');
            res.end();

            return;
        }
        console.log('rendered: '+html);

        res.end(html);
    });
```

`render()`메소드를 호출하면 뷰 엔진이 템플릿 파일을 읽어 들인 후 파라미터로 전달한 context객체의 속성으로 들어 있는 값들을 적용하고 그 결과를 콜백함수로 돌려준다.

### 뷰 템플릿으로 사용자 리스트 웹 문서 만들기

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>사용자 리스트 페이지</title>
</head>
<body>
    <h2>사용자 리스트</h2>
    <div>
        <ul>
            <% for(var i=0;i<results.length;i++){
                var curId = results[i]._doc.id;
                var curName = results[i]._doc.name;%>
                <li>#<%= i %>-아이디 <%=curId%>,이름: <%=curName%></li>
            <%}%>
        </ul>
    </div>
    <br><br><a href="/public/listuser.html">다시 요청하기</a>
</body>
</html>
```

```javascript
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// 뷰 템플릿을 이용하여 렌더링한 후 전송
var context = {results : results};
req.app.render('listuser',context,function(err,html){
    if(err){throw err;}
    res.end(html);
});
```

### 뷰 템플릿으로 사용자 추가 웹 문서 만들기

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>헤드 부분 - ejs에서 include된다.</title>
</head>
<body>
    <h2><%=title%></h2>
    <br><br><a href="/public/login.html">로그인으로 - ejs에서 include됨</a>
</body>
</html>
```

```javascript
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
//뷰 템플릿으로 렌더링한 후 전송
var context = {title:'사용자 추가 성공'};
req.app.render('adduser',context,function(err,html){
    if(err){
        console.log('뷰 렌더링 중 오류 발생'+err.stack);
        res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
        res.write('<h2>뷰 렌더링 중 오류 발생</h2>');
        res.write('<p>' + err.stack + '</p>');
        res.end();

        return;
    }
    console.log('rendered:'+html);
    res.end(html);
});
```

## 08-2 pug 뷰 템플릿 사용하기

`pug`포맷은 웹 문서의 태그를 그대로 사용하지 않고 최대한 간단한 형태로 입력하기 때문에 **공백,들여쓰기**를 기준으로 태그의 구조가 결정된다.

\[[pugjs.org](http://pugjs.org)]

```javascript
//뷰 템플릿 설정
app.set('views',__dirname+'/views');
app.set('view engine','pug');
```

### pug로 HTML문서 만들기

`pug`는 공백을 **두 개**사용하여 들여쓰기를 한다.

### pug 템플릿으로 로그인 웹 문서 만들기

```
doctype html
html
  head
      meta(charset='utf8')
      title 로그인 성공 페이지
  body
      h1 로그인 성공
      div
        p 사용자 아이디 : #{userid}
      div
        p 사용자 이름 : #{username}
      br
      br
      a(href = '/public/login.html') 다시 로그인하기
```

```javascript
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});

//뷰 템플릿으로 렌더링한 후 전송
var context = {userid: paramId,username:username};
req.app.render('login_success',context,function(err,html){
    if(err){throw err;}
    console.log('rendered : '+html);

    res.end(html);
});
```

### pug 템플릿으로 사용자 리스트 웹 문서 만들기

```
doctype html
html
  head
    meta(charset='utf8')
    title 사용자 리스트 페이지
  body
    h1 사용자 리스트
    div
      ul
        - for (var i=0;i<results.length;i++){
        -  var curId = results[i]._doc.id;
        -  var curName = results[i]._doc.name;
          li #{i} - 아이디 : #{curId},이름 #{curName}
        - }
    br
    br
    a(href = '/public/listuser.html') 다시 요청하기
```

```javascript
//뷰 템플릿으로 렌더링한 후 전송
var context = {results : results};
req.app.render('listuser',context,function(err,html){
    if(err){
        console.error('뷰 렌더링 중 오류 발생'+err.stack);

        res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
        res.write('<h2>뷰 렌더링 중 에러 발생</h2>');
        res.write('<p>' + err.stack + '</p>');
        res.end();

        return;
    }
    console.log('rendered : '+html);

    res.end(html);
});
```

### pug 템플릿으로 사용자 추가 웹 문서 만들기

```
doctype html
html
  head
    meta(charset='utf8')
    title extends로 상속함
    script(src = 'public/jquery-2.1.4.min.js')
  body
    block content
    include ./footer.pug
```

* `block`코드는 이 파일을 상속받는 파일에서 이 부분을 대체할 수 있다는 것이다.
* `include`는 다른 pug템플릿 파일을 읽어와서 코드를 붙여준다.

  ```
  div#fotter
  a(href='/public/login.html') 로그인으로 - pug include됨
  ```

```
extends layout

block content
  h2 #{title}
```

```javascript
if (addedUser) {
    console.dir(addedUser);

    res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});

    // 뷰 템플릿으로 렌더링한 후 전송
    var context = {title : '사용자 추가 성공'};
    req.app.render('adduser',context,function(err,html){
        if(err){
            console.error('뷰 렌더링 중 오류 발생'+err.stack);

            res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
            res.write('<h2>뷰 렌더링 중 에러 발생</h2>');
            res.write('<p>' + err.stack + '</p>');
            res.end();

            return;
        }
        console.log('rendered : '+html);

        res.end(html);
    });
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dahye-jeong.gitbook.io/til/nodejs/chapter8.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
