Toy Project with Go Lang - 5
Project Day 5
- 오늘 목표는, POST 를 활용한 게시물 생성하기!
결과부터 얘기하면, POST 를 통한 게시물 생성과 추가적으로, Page 간 연결이 되지 않던 점을 수정했다. Main Page 에서 게시판 메인으로 옮겨가는 것과 게시판에서 새로운 게시물을 생성하는 것, 추가로 게시물을 확인하고 게시물 화면에서 게시판 화면으로. 페이지 간 연결을 모두 추가했고, New Post 를 통해 게시물을 새로 생성할 수 있도록 만들었다.
기존에 생각했던 것은, HTML 의 <form>
태그를 활용해서 golang 에서 Request 를 json 으로 marshalling 하도록 만들려고 했다.
하지만, 이런 방식이 생각했던 대로 동작을 하지 않아서 다른 방법을 찾아본 결과 Request 의 FormValue
메소드를 사용하면 아래와 같이 지정한 이름의 데이터를 받아올 수 있었다.
var post Database.Post
post.Title = r.FormValue("Title")
post.Text = r.FormValue("Text")
또 기존에는 HandleFunc().Methods()
함수를 통해서 Router 에 Method 를 지정해서 handler 함수를 구현했는데, 한 End Point 에서 POST / GET 을 같이 처리하고 싶은 생각이 들어 따로 방법이 없나 찾아봤다.
이 또한 방법이 있었는데, 아래와 같이 handler 함수 내부에서 Request 의 Method
변수를 확인해 GET / POST 별로 다른 핸들러 함수를 구현할 수 있도록 만들었다.
if r.Method == "GET" {
// GET action..
} else if r.Method == "POST" {
// POST action..
}
그리고 POST 를 통해 게시물을 생성하고 난 뒤에는 다시 게시물 화면으로 돌아갈 수 있도록 Redirect 메소드를 사용했다.
게시물 생성을 위한 Handler 함수의 코드는 다음과 같다.
func handleNewPost(w http.ResponseWriter, r *http.Request) {
log.Println("Endpoint Hit: handleNewPost", r.Method)
if r.Method == "GET" {
newPost.Execute(w, nil)
} else if r.Method == "POST" {
fmt.Println(r.Body)
var post Database.Post
post.Title = r.FormValue("Title")
post.Text = r.FormValue("Text")
fmt.Println(post)
Database.InsertPost(post)
http.Redirect(w, r, "http://localhost:9090/posts", http.StatusSeeOther)
}
}
그리고 새로운 게시물 생성을 위해 사용자로부터 게시물의 제목과 본문을 입력받는 페이지의 HTML 파일 내부는 다음과 같다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>New Post</h1>
<form action="http://localhost:9090/new_post" method="post">
<label for="Title" style="vertical-align: top">Title:</label>
<textarea name="Title" id="Title" cols="40" rows="1"></textarea><br><br>
<label for="Text" style="vertical-align: top">Text:</label>
<textarea name="Text" id="Text" cols="40" rows="5"></textarea><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
오늘은 여기까지! 새로운 목표를 생각날 때마다 패드에 정리해 놓고 매일매일 뭘 구현할 지 목표를 세우도록 해야겠다.