Toy Project with Go Lang - 2

less than 1 minute read

Project 둘째날

어제 MySQL DB 를 간단하게 구축하고, GoLang 과 MySQL 을 연동해 데이터를 입력하고, 받아오는 내용을 구현했었다. 오늘 목표는 우선, http 를 활용해 새로운 데이터를 입력하고, 받아온 데이터를 화면에 띄워줄 수 있도록 하는 것이었다.

대략적인 모양새는 갖추도록 만들었고, Post / Get 을 통해 데이터를 쓰고 받아오는 형태는 구현을 완료했다. 하지만 문제는, 프론트를 만들어줘야 하는데 그 부분에 대한 지식이 없고, 센스도 없다는 점이었다.

우선 오늘은 너무 졸리니까 여기까지만 하고, 다음주에 다시 공부를 해서 프론트를 대충이라도 만들고 DB 랑 HTTP 를 연동하도록 해야겠다.

package HttpAction

import (
	"Database"
	"encoding/json"
	"fmt"
	"github.com/gorilla/mux"
	"io/ioutil"
	"log"
	"net/http"
)

func HandleRequest() {
	myRouter := mux.NewRouter().StrictSlash(true)
	// 여기서 각 페이지 핸들러들 등록
	myRouter.HandleFunc("/", handleHomePage)
	myRouter.HandleFunc("/posts", handleGetPosts)
	myRouter.HandleFunc("/posts/{id}", handleGetPostByID)
	myRouter.HandleFunc("/post", handleNewPost).Methods("POST")

	log.Fatal(http.ListenAndServe(":9090", myRouter))
}

func handleNewPost(w http.ResponseWriter, r *http.Request) {
	log.Println("Endpoint Hit: handleNewPost")
	reqBody, _ := ioutil.ReadAll(r.Body)

	var post Database.Post
	json.Unmarshal(reqBody, &post)

	Database.InsertPost(post)
}

func handleGetPostByID(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id := vars["id"]
	log.Println("Endpoint Hit: handleGetPostByID")

	post, err := Database.SelectByID(id)
	if err != nil {
		log.Println("Error Occurred", err)
	}
	json.NewEncoder(w).Encode(post)
}

func handleGetPosts(w http.ResponseWriter, r *http.Request) {
	log.Println("Endpoint Hit: handleGetPosts")
	// 이제 여기서 DB 를 긁어와서 주는 형식으로 만들어야 되지 않을까?

	posts, err := Database.SelectAll()
	if err != nil {
		log.Println("Error Occurred", err)
	}

	json.NewEncoder(w).Encode(posts)

	//for _, post := range posts {
	//	fmt.Println(post)
	//	fmt.Fprintf(w, "%s", post.ToString())
	//}
}

func handleHomePage(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Welcome to the HomePage!")
	log.Println("Endpoint Hit: homePage")
}