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
댓글
댓글 쓰기