상세 컨텐츠

본문 제목

[Nomad Coin] Explorer - #5.1 Rendering Templates

Go/Blockchain

by Gopythor 2022. 7. 17. 04:17

본문

728x90
반응형

#5.1 Rendering Templates

  • HTML template을 렌더링해볼 것이다.
  • templates 폴더 안에 새로운 파일을 하나 만들 것이다.
  • home.html을 만들자.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>노마드 코인</title>
</head>
<body>
    <h1>Home</h1>
</body>
</html>
  • 타이틀에 노마드 코인을 입력한다.
  • body에 h1을 넣어보자.

 

 

  • Go에서 template을 어떻게 렌더링하는가?
  • 표준 library에 package가 이미 존재한다.
  • package에서 불러오는 template이다. htmp의 text template가 아니다.
  • 옵션이 많은데 ParseFiles()를 쓴다.

  • 그럼 어떤 파일을 parse하고 싶은지 물어본다.
func home(rw http.ResponseWriter, r *http.Request) {
	tmpl := template.ParseFiles("templates/home.html")
}
  • home.html을 parsing하고 싶으니 입력할 것이다.
  • ParseFiles()는 template의 pointer와 error를 retrun한다.
  • error도 처리해줘야한다.
  • 해당 function은 template와 error 두 가지를 반환한다.
func home(rw http.ResponseWriter, r *http.Request) {
	tmpl, err := template.ParseFiles("templates/home.html")
}
  • err을 써준다.
  • Go언어에는 다른 Excepction이나 Error가 없으므로, 알아서 오류들을 처리해야 한다.
  • 그렇기 때문에 function이 error을 반환한다.
  • error을 어떻게 처리할 지 선택해야 한다.
if err != nil {
		log.Fatal(err)
	}
  • error가 존재하고 nil과 같지 않으면, 즉 아무것도 없는 상태가 아니면, error를 출력하고 프로그램을 os.Exit(1)으로 종료하겠다는 것이다.
  • database를 다루게 되면 정말 많은 오류들을 만나게 되고, 이 코드를 계속해서 써줘야 한다.
  • 그렇지만 이 코드를 계속 써야되는 건 아니다.
  • utilities package등을 만들어보자.
  • 그 utilities에 오류들을 처리하는 function들을 만들 것이다.
  • 실제로 template을 excute해보자.

 

 

  • tmpl.Excute()를 쓰고, 여기에는 두 가지 argument가 필요한데, 하나는 Response에 써줄 Writer이다.
  • 그리고 다른 하나는 data이다. template에 전송할 data이다.
  • template는 아무 data도 받고 있지 않다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>노마드 코인</title>
</head>
<body>
    <h1>{{.pageTitle}}</h1>
</body>
</html>
  • pageTitle를 받아보자.
type homeData struct {
	pageTitle string
}

func home(rw http.ResponseWriter, r *http.Request) {
	tmpl, err := template.ParseFiles("templates/home.html")
	if err != nil {
		log.Fatal(err)
	}
	data := homeData{"Home}
	tmpl.Execute(rw,data)
}
  • data를 써보자.
  • struct를 만드자
  • 그리고 여기에 data := homeData를 적고 pageTitle이 들어가야 하는데 Home이라고 적는다.
  • template 뒤로 data를 보낼 수 있는지 확인하자.
  • template내부에서는 pageTitle이라고 하는 variable 또는 field를 기다리고 있다.

 

  • 아무것도 안나왔다.
type homeData struct {
	PageTitle string
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>노마드 코인</title>
</head>
<body>
    <h1>{{.PageTitle}}</h1>
</body>
</html>
  • pageTitle은 소문자로 시작해서 아무데서도 공유되지 않았다.
  • 대문자로 바꿔보자.

  • 잘 나온다.
  • 대/소문자 즉 private/public 속성은 templates 까지 영향을 준다.
  • 전체 struct를 public로 할 필요는 없다. 다른 곳에서 homeData를 import하진 않는다.
  • 하지만 PageTitle은 대문자가 되어야 한다.

 

 

  • 이번에는 block을 렌더링해보자
  • Blocks를 대문자로 쓰고, 이건 block pointer 배열이 될 것이다.
  • block이 공유되고 있다.
  • 그런데 여기에 문제가 있는데, blockchain.go를 보면 block struct는 공유되고 있지 않다.

 

type Block struct {
	Data     string
	Hash     string
	PrevHash string
}
  • 이젠 공유할 시간이다.
  • 모든 곳을 대문자로 고친다.
type homeData struct {
	PageTitle string
	Blocks    []*blockchain.Block
}
  • blockchain.Block이라고 쓸 수 있다.

 

func home(rw http.ResponseWriter, r *http.Request) {
	tmpl, err := template.ParseFiles("templates/home.html")
	if err != nil {
		log.Fatal(err)
	}
	data := homeData{"Home", blockchain.GetBlockchain().AllBlocks()}
	tmpl.Execute(rw, data)
}
  • blockchain에 있는 모든 block을 갖다주는 function을 사용해야한다.
  • AllBlocks이다.
  • blockchain에서 block들을 불러온다.
  • 기억해야 할 가장 중요한 내용은 *공유*되도록 한다. 그럴려면 대문자로 써야 한다.

 

 

  • template utility를 하나 보자. 이 모든 걸 자동으로 해준다.
  • template.Must라고 부른다.
  • error를 가져오고 에러처리 코드를 쓰는 대신에 Must로 감싼다.
  • 이건 Template나 error를 반환하는 function 호출을 감싸서 error가 있다면 Must funciton이 방금 했던 일을 도와준다.
  • 오류가 있으면 error를 출력해준다.
  • 오류가 없다면 Template pointer를 반환한다.

  • Must fuctnion은 소스코드를 보면 우리가 방금 하고 있던걸 그대로 해준다.

 

func home(rw http.ResponseWriter, r *http.Request) {
	tmpl := template.Must(template.ParseFiles("templates/home.html"))
	data := homeData{"Home", blockchain.GetBlockchain().AllBlocks()}
	tmpl.Execute(rw, data)
}
  • 여기 template pointer만 있고, 코드가 더 짧아졌다.
  • for loop가 html의 모든 element를 순회하도록 하려면 어떻게 해야 하는가?
  •  

출처 : 노마드코더 노마드코인

728x90
반응형

관련글 더보기

댓글 영역