#5.0 Setup
- Go로 Server-side 렌더링 웹사이트를 어떻게 만드는지 알아보자
- 하나의 library만 있으면 된다.
- 다른 언어에 비하면 쉽다.
- 먼저 http.ListenAndServe()를 쓴다.
- 이 함수는 string address랑 지금은 안 쓸거지만 handler를 필요로 한다.
- 나중에 handler가 뭔지 볼 것이다.
package main
import "net/http"
const port string = ":4000"
func main() {
http.ListenAndServe(port, nil)
}
- 여기에 port를 넣고 handler는 없다.
- 서버를 여는 것은 매우 간단하다.
- go run main.go를 입력하면 서버가 열린 것이다.
- 서버가 listening 중인 걸 알 수 있다.
- 프로그램이 끝나지 않았다.
- 하지만 출력문을 하나 넣어보자.
const port string = ":4000"
func main() {
fmt.Printf("Listening on http://localhost%s\n", port)
http.ListenAndServe(port, nil)
}
- localhost:4000을 listening하고 있다고 나오게 된다.
- 동작을 하고 있다. 서버를 가지고 있긴 하다.
- 404 page not found가 떠있지만 서버를 연 것이다.
- 한 줄은 print하는 용이고, 한 줄은 서버를 여는 용도이다.
- 그럼 error handling을 해보자.
- 이 함수를 log.Fatal()로 감싸보자
- log.Fatal()의 설명을 살펴보면 Fatal은 os.Exit(1) 다음에 따라나오는 error를 Print)를 하는 것과 동일하다.
- os.Exit(1)은 프로그램이 error code 1로 종료되는 것을 말한다.
- 이건 error가 있을 때에만 실행된다.
- ListenAndServe function은 error를 반환할 것이다. error가 있다면
- error 가 있다면 error를 출력할 것이다.
- error가 없다면 이 function은 끝나지 않고, Fatal function은 실행되지 않는다.
- 홈페이지를 만들어보자.
- 이 explorer에 딱 두 페이지만 만들 것이다.
- 하나는 homepage고 하나는 add page이다.
- 사람들이 block을 추가하는 페이지이다.
- 데이터를 쓸 수도 있고, blockchain에 block을 추가할 수도 있다.
- Node.js에서 route라고 불렀던 것을 만들어 볼 것이다.
- http.HandleFunc()를 쓰고 여기엔 pattern을 써줘야하는데 home("/")이 될 것이다.
- 그 다음으로는 handler를 작성해야 한다.
- handler는 inline으로 쓸 수도 있고, 바깥에 쓸 수도 있다.
- 지금은 inline으로 해볼 것이다.
func main() {
http.HandleFunc("/",func(w http.ResponseWriter, r *http.Request) {})
fmt.Printf("Listening on http://localhost%s\n", port)
log.Fatal(http.ListenAndServe(port, nil))
}
- vscode를 사용하고 있다면, 'f'를 입력하는 순간, 여러가지 자동완성 제안이 뜨는데, 그 중에 func(...) {}에서 엔터를 입력한다.
- vscode는 곧바로 이 handler function이 필요로하는 특징적인 것들을 생성해준다.
func home(rw http.ResponseWriter, r *http.Request)
- 다른 방법은 다른 function을 만드는 것이다.
- 그리고 이 function을 Home이라고 할 것이다.
- home은 2개의 인자를 받는 function이다.
- 첫 번째는 ResponseWriter이다.
- 여기에 유저에게 보내고 싶은 데이터를 적는 것이다.
- 그리고 나머지 하나는 Request의 pointer이다.
- 하나는 pointer가 아니고, 하나는 pointer이다.
- 합리적인게, 애초에 Request를 복사하고 싶은게 아니다.
- 왜냐하면 request가 file이 될 수도 있고, 빅데이터가 될 수도 있다.
- 그래서 복사하기보다 실제 request를 사용하는게 좋다.
- 반면에 Writer는 그냥 어딘가에 데이터를 쓰고 싶은 것이다.
func home(rw http.ResponseWriter, r *http.Request) {
fmt.Fprint(rw, "Hello from home")
}
func main() {
http.HandleFunc("/", home)
fmt.Printf("Listening on http://localhost%s\n", port)
log.Fatal(http.ListenAndServe(port, nil))
}
- 데이터를 쓰기 위해 fmt를 쓸 것이다.
- Fprint가 하는 일은 데이터를 출력하기는 하지만, console에 보여주는게 아니라 Writer에 출력하는 것이다.
- data를 format해서 Writer에 보내는 것이다.
- 그동안 Printf를 사용해왔는데 그건 data를 출력하고 포맷해주는 걸 console에 해줬지만, Fprint의 경우에는 Writer에 할 것이다.
- rw를 입력하고 Response에 쓰고 싶은 것들을 입력하면 된다.
- 나중에 Request object를 어떻게 쓸 수 있을지 보자.
댓글 영역