Go(golang) HTML을 출력해 주는 서버 만들기(module사용)

해당 작성 코드는 위 링크를 참고해 주시기 바랍니다.  (링크)


// ./main.go
package main

import (
"fmt"
"html/template"
"net/http"
)

// 포트번호 지정
const portNumber = ":8080"

func Home(w http.ResponseWriter, r *http.Request){
renderTemplate(w, "home.page.tmpl")
}

func About(w http.ResponseWriter, r *http.Request){
renderTemplate(w, "about.page.tmpl")
}

// 해당 tmpl을 rendering합니다.
func renderTemplate(w http.ResponseWriter, tmpl string) {
// 해당 tmpl파일을 파싱 합니다.
parseTemp, _ := template.ParseFiles("./templates/" + tmpl)

// 파싱한 tmpl파일을 응답합니다.
err := parseTemp.Execute(w, nil)

// 에러 발생시 if문 실행
if err != nil {
fmt.Println("error parsing template", err)
return
}

}

func main(){

http.HandleFunc("/", Home)
http.HandleFunc("/about", About)

fmt.Println(fmt.Sprintf("Starting application on port %s", portNumber))
_ = http.ListenAndServe(portNumber, nil)
}

위의 main.go파일은 하나의 파일에 여러 func가 모여 있습니다. 이는 코드를 볼때 매우 좋지 않기 때문에 몇몇 func에 대해서는 다른 go파일로 옮기는 것이 좋습니다.


사진1) go module생성

해당 go module을 만들어 줍니다. 위 사진1에서는 app이라고 지정 했습니다.


사진2) go.mod 파일 생성

사진1을 실행한 이후 사진2와 같이 go.mod가 자동 생성이 됩니다. 이는 현재 루트경로에 있는 모든 파일이 "app" 명칭의 모듈로 관리 된다는 것입니다.


사진3) 폴더 및 파일 구성

이제 사진3처럼 폴더와 파일을 생성해 줍니다. 


// ./render/render.go
package render

import (
"fmt"
"html/template"
"net/http"
)

// 해당 tmpl을 rendering합니다.(해당 함수는 다른 파일에서도 실행되야 하기때문에 첫 알파벳을 대문자로 합니다.)
func RenderTemplate(w http.ResponseWriter, tmpl string) {
// 해당 tmpl파일을 파싱 합니다.
parseTemp, _ := template.ParseFiles("./templates/" + tmpl)

// 파싱한 tmpl파일을 응답합니다.
err := parseTemp.Execute(w, nil)

// 에러 발생시 if문 실행
if err != nil {
fmt.Println("error parsing template", err)
return
}

}


RenderTemplate는 위 코드와 갖이 작성해 줍니다.

참고 : 함수의 맨 앞글자가 대문자일시 다른 .go파일에서 사용할수 있습니다.


// ./web/hendlers.go

package hendlers

import (
"app/render" // render부분 import
"net/http"
)

// Home, About은 다른 go 파일에서도 사용할수 있어야 하기때문에
// 첫 글자를 대문자로 합니다.

func Home(w http.ResponseWriter, r *http.Request){
// 해당 RenderTemplate는 render 패키지에 속하기 때문에 아래와 갖이 작성한다.
render.RenderTemplate(w, "home.page.tmpl")
}

func About(w http.ResponseWriter, r *http.Request){
render.RenderTemplate(w, "about.page.tmpl")
}

이제 핸들러 부분을 작성합니다. 이때 import를 위하여 Home, About의 함수명 맨 첫글자를 대문자로 설정해 줍니다.


// ./main.go
package main

import (
"app/hendlers"
"fmt"
"net/http"
)

// 포트번호 지정
const portNumber = ":8080"

func main(){

http.HandleFunc("/", hendlers.Home)
http.HandleFunc("/about", hendlers.About)

fmt.Println(fmt.Sprintf("Starting application on port %s", portNumber))
_ = http.ListenAndServe(portNumber, nil)
}

이제 마지막으로 main.go를 수정해 줍니다. 핸들러에서 Home, About를 import하여 사용해 줍니다. 그러면 module를 이용하여 정상적으로 출력되는 것을 확인할수 있습니다.

$ go run main.go




개발자 디스코드 서버에 초대합니다.

사진) 아래링크 클릭시 커뮤니티로 초대

Comunity Discord Link




댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)