Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.
✓ Visual Studio Code를 사용하였고, 기존에 사용하던 디렉터리가 아닌 새 디렉터리를 만듦.
HTTP 웹 서버 만들기
- Go 언어에서는 net/http 패키지를 사용하여 손쉽게 웹 서버를 만들 수 있음.
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World")
})
http.ListenAndServe(":3000", nil)
}
- HandleFunc은 핸들러를 등록하고, 경로에 해당하는 요청이 들어왔을 때 어떤 것을 실행할지 핸들러를 등록하는 Function.
- "/"(절대경로) 는 첫 번째 Index페이지 경로를 나타냄.
- Index 페이지에 대한 요청이 왔을 때, 어떤 것을 할 것인지는 func에 해당하는 것을 실행.
func은 정해진 형태로 Response를 Write하는 인자 w와, 사용자가 요청한 Request 정보를 가지고 있는 인자 r이 있음.
Fprint는 Writer에다 문자(Print)를 하라는 것으로 w에 해당하는 것으로, "Hello World"라는 Response를 주는 것.
- ListenAndServer를 통해 웹서버를 구동하고, Request가 올 때까지 기다리고, 요청이 왔을 때 이미 등록된
Handler Path에 해당하면 Handler를 실행하여 응답을 보냄.
기다리는 포트는 3000번 포트라 실행된 상태에서 웹 서버를 열면 응답을 줌.
실행 방법
1. 코드를 작성하고 저장한 후 Run → Run without Debugging 을 실행
2. 웹을 열어 주소창에 "http://localhost:3000" 을 입력
3. Hello World 확인
※ Debugging 시 에러 발생 ※
* 처음에 Run without Debugging을 실행하니 DEBUG CONSOLE에 빨간 에러가 뜨는데,
대충 go mod가 안되었다? 이런 내용 그래서 go mod init <Path> 를 통해 모듈을 생성해야 함!
근데 모듈 생성할 때 경로 문제로 또 에러 발생 "go: malformed module path "/Users/<>/Web": empty path element"
내가 절대 경로를 사용했는데, 구글에 검색하니 절대 경로 사용 시 첫 번째 Path에 /를 빼고 사용해야 한다고 함! → go mod init Users/<>/Web
새로운 Func를 추가하여 재호출 하기!
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World")
})
// 새로운 경로 추가
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello Bar!")
})
http.ListenAndServe(":3000", nil)
}
- /bar라는 새로운 경로를 추가하여 웹에서 다시 호출하기!
* 아주 당연하지만, debugging을 실행하고나면 3000번 포트가 LISTEN 되는 것을 볼 수 있다!
netstat (show network status)
-a: With the default display, show the state of all sockets. (기본적으로 모든 socket 상태를 표시함.)
normally sockets used by server processes are not shown. (일반적으로 서버 프로세스에서 사용되는 socket은 보여주지 않음.)
-n: Show network addresses as numbers. (네트워크 주소를 숫자로 표시)
-v: Increase verbosity level. (열려있는 포트와 관련된 프로세스 PID를 표시하는 열을 추가해 자세한 정보 표시)
lsof (list open files)
-i: selects the listing of files any of whose Internet address matches the address specified in i.
If -i4 or -i6 is specified with no following address, only files of the indicated IP version, IPv4 or IPv6, are displayed.
(인터넷 address가 i에 지정된 주소에 일치하는 것만 선출,
-i4 또는 -i6이 다음 주소 없이 지정된 경우, 지정된 IP 버전인 IPv4 또는 IPv6 파일만 표시)
-s: select protocol (p = TCP|UDP) states by name(s).
-n: inhibits the conversion of network numbers to host names for network files.
(네트워크 파일의 호스트 이름으로 네트워크 번호를 변환되지 않게함.)
-p: inhibits the conversion of port numbers to port names for network files.
(네트워크 파일의 포트 번호를 포트 이름으로 변환되지 않게함.)
p.s 예전에 상급 매니저님께 자주 들었던 말... "너 그 옵션 뭔지 알고 쓰는거야?" 그래서 항상 옵션쓸 때 뭔지 확인하는 좋은 습관이 생김
'Language > Golang' 카테고리의 다른 글
Golang (Go언어) Go로 만드는 웹 (3) (0) | 2025.01.07 |
---|---|
Golang (Go언어) Go로 만드는 웹 (2) (2) | 2025.01.03 |
Golang (Go언어) 제네릭 프로그래밍(Generic Programming) 3/3 (0) | 2025.01.01 |
Golang (Go언어) 제네릭 프로그래밍(Generic Programming) 2/3 (0) | 2025.01.01 |
Golang (Go언어) 제네릭 프로그래밍(Generic Programming) 1/3 (1) | 2024.12.27 |