친구와 To Do List 앱을 만들기로 하고, 서버 프로그래밍을 담당했다.
처음부터 차근차근 살을 붙여가보도록 한다.
지난 포스팅에서 DDNS 설정과 포트포워딩을 완료했고,
이번 포스팅에서는 net/http 패키지로 서버를 띄우고
github.com/julienschmidt/httprouter 를 통해 HTTP request router를 구현한다.
package main
import (
"net/http"
)
func main() {
router := httprouter.New()
err := http.ListenAndServe(":19124", router)
if err != nil {
todolib.MakeLog("ListenAndServe fail")
panic(err)
}
}
위의 코드만으로 서버가 열렸다. 포트포워딩 해둔 19124 포트로 통신하고, Request를 router 라는 handler에 연결한다.
helloHandler := func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "Hello, world!\n")
}
http.HandleFunc("/hello", helloHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
위와 같이 handler 없이도 구현은 가능하나, 가볍고 성능이 좋은 github.com/julienschmidt/httprouter를 사용 해본다.
router.GET("/get/db/version", todolib.GetVersion)
router.POST("/signup", todolib.SignUp)
router.PUT("/upload", todolib.UploadFile)
router.DELETE("/delete/db/version", todolib.DeleteVersion)
http의 대표적인 Method 4개로 CRUD를 구현했다.
전달인자로는 URL에서 도메인을 뺀 부분과 handler 이름을 넣는다.
func GetVersion(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
a := DbQuery("version", "version")
b := DbQuery("name", "version")
c, _ := strconv.Atoi(DbQuery("updateTime", "version"))
mem := version{a, b, c}
fmt.Fprintln(w, JSONEnc(mem))
MakeLog("GetVersion success")
}
router.GET("/get/db/version", todolib.GetVersion) 의 GetVersion 함수이다.
DB의 "version" table에서 version, name, updateTime을 읽고, 이를 JSON 형식으로 Encoding하여 응답하는 함수이다.
DB 와 JSON에 관련된 부분은 추후 포스팅에 작성한다.