본문 바로가기
Go/Go Web Programming

[Go Web programming] 003.서버 설정 | 데인트리 라이브러리

by 데인트리 2021. 6. 17.

 

 

이 페이지에서는 go로 작성한 서버 실행 시 세부 설정 사항에 대해 다룬다.

 

 

 

 

 

앞선 포스팅에서도 살펴보았지만 go에서는 net/http 패키지를 사용해 서버를 실행한다.

지금까지는 http.ListenAndServe 함수를 통해 서버를 실행하였지만, 직접 Server 구조체를 생성하여 몇가지 설정을 커스터마이징 할 수 있다.

 

1) net/http 패키지의 ListenAndServe 함수

// 함수 선언
func ListenAndServe(addr string, handler Handler) error {
	server := &Server{Addr: addr, Handler: handler}
	return server.ListenAndServe()
}

위의 코드를 보면 http.ListenAndServe(":8080",nil) 형태로 함수 호출 시 server 구조체를 선언과 함께 파라미터값을 전달하고 server.ListenAndServe를 호출하는 것을 볼 수 있다.

 

좀 더 자세하게 알아보기 위해 server 구조체와 ListenAndServe 함수를 살펴보자

2) net/http 패키지의 server 구조체

[daintree github.com]$ godocc net/http server
package http // import "net/http"

type Server struct {
        Addr string
        Handler Handler // handler to invoke, http.DefaultServeMux if nil
        TLSConfig *tls.Config
        ReadTimeout time.Duration
        ReadHeaderTimeout time.Duration
        WriteTimeout time.Duration
        IdleTimeout time.Duration
        MaxHeaderBytes int
        TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
        ConnState func(net.Conn, ConnState)
        ErrorLog *log.Logger
        BaseContext func(net.Listener) context.Context
        ConnContext func(ctx context.Context, c net.Conn) context.Context
}

func (srv *Server) ListenAndServe() error

자주 사용되는 설정 값은 다음과 같다.

속성명 설명
Addr string 서버가 수신하는 TCP 포트 주소, 기본값 80 
Handler Handler 서버가 사용하는 멀티플렉서, nil일경우 http.DefaultServeMux
TLSConfig *tls.Config HTTPS 서버 실행 시 사용하는 설정
ReadTimeout time.Duration 요청 헤더를 읽는 최대 시간, 해당 값이 0인 경우 ReadTimeout이 사용된다. 둘 다 0일 경우, 시간제한이 없다.
WriteTimeout time.Duration 응답 작성 제한시간, 새로운 요청이 읽힐 때마다 리셋된다.
IdleTimeout time.Duration 다음 요청이 있을 때가지 대기하는 시간이다. 0 일 경우 ReadTimeout 값이 사용된다. 둘 다 0일 경우, 시간제한이 없다.
MaxHeaderBytes int 요청 헤더의 키,값이 파싱된 바이트의 최대 수, 요청 body의 사이트를 제한하는 것이 아님, 0일 경우 DefaultMaxHeaderBytes 값이 사용됨
ErrorLog *log.Logger 로거 정보, nil일 경우 로그 패키지의 기본 로거가 사용됨

 

1에서 http.ListenAndServe 함수 선언부의 코드를 살펴보았다. 이제 이 함수에서 수행한 것처럼 직접 Server 객체를 생성하고 메서드를 호출해 서버를 실행해 보자.

 

3) Serve 객체 생성 및 메서드 호출

소스코드: https://github.com/daintree-henry/studygo/tree/main/200.Web/203_ServerConf

 

daintree-henry/studygo

Go 스터디 자료입니다. Contribute to daintree-henry/studygo development by creating an account on GitHub.

github.com

package main

import (
	"fmt"
	"net/http"
	"time"
)

func main() {

    //(1) DefaultServeMux에 핸들러 등록
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello World, This is custom webserver.")
	})

	server := &http.Server{ //(2) server 객체 할당
		Addr:              ":8080",
		ReadHeaderTimeout: time.Duration(60 * time.Second),
		WriteTimeout:      time.Duration(60 * time.Second),
		Handler:           http.DefaultServeMux,
	}
	server.ListenAndServe() //(3) 서버 실행
}

(1) http.HandleFunc 함수를 통해 " / " 경로에 문자열을 응답하는 핸들러를 등록하였다.

 

(2) http.Server 구조체를 선언과 동시에 초기화하였다. 포트는 8080, Timeout은 60초, 헤더최대값 20 byte, 멀티플렉서는 DefaultServeMux를 사용하는 서버 객체이다. (여기서 흥미로운 것은 필드명이 Handler인데, 내부 구조를 살펴보면 멀티플렉서도 핸들러 인터페이스를 구현한 일종의 핸들러 라는 것이다.)

 

(3) 생성한 객체의 ListenAndServe 메서드를 호출하여 서버를 실행한다. 객체의 필드에 값을 직접 입력하였기 때문에 설정한 값으로 서버가 실행된다.

 

 

[서버 실행 결과]

 

[daintree github.com]$ go run .

 

[daintree github.com]$ curl http://localhost:8080
Hello World, This is custom webserver.

 

 

사실 속성값을 살펴보니 Default 설정을 사용해도 무난할 것으로 보인다. 특수한 상황을 가정하거나 테스트를 진행할 때 일부 값을 변경하여 사용해볼 수 있을 것이다. 이번 포스팅에서는 Server 객체에 대한 이해만 하고 넘어가면 유의미 할 것 같다.

 

 

 

 

내용에 오류가 있거나 질문이 있으면 댓글로 소통해주세요

언제나 환영합니다

댓글