[go] 고루틴과 sync 패키지를 사용한 웹 서버 구현

고루틴과 sync 패키지를 사용하면 Go 언어로 효율적이고 안전한 병렬 프로그래밍을 할 수 있습니다. 이번 포스트에서는 고루틴과 sync 패키지를 사용하여 웹 서버를 구현하는 방법에 대해 알아보겠습니다.

목차

고루틴이란

고루틴은 Go 언어의 경량 스레드로, 병렬로 실행될 수 있는 코드 블록을 나타냅니다. go 키워드를 사용하여 함수 앞에 붙이면 해당 함수가 고루틴으로 실행됩니다. 고루틴은 스레드보다 경량이며, 수백, 수천 개의 고루틴을 생성해도 성능에 부하를 주지 않습니다.

go func() {
    // 고루틴으로 실행될 코드
}()

sync 패키지

sync 패키지는 고루틴 간에 안전하게 데이터를 공유하고 동기화하는 데 사용됩니다. sync 패키지에는 뮤텍스, 웨이트 그룹, 어토믹 연산 등을 지원하는 여러 도구가 포함되어 있습니다. 이를 사용하여 고루틴 간의 경쟁 상태와 데드락을 해결할 수 있습니다.

웹 서버 구현

이제 고루틴과 sync 패키지를 사용하여 간단한 웹 서버를 구현해보겠습니다. 코드는 아래와 같습니다.

package main

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

var mu sync.Mutex
var count int

func main() {
	http.HandleFunc("/", handler)
	http.HandleFunc("/count", counter)
	http.ListenAndServe("localhost:8000", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	mu.Lock()
	count++
	mu.Unlock()
	fmt.Fprintf(w, "Hello, 웹!")
}

func counter(w http.ResponseWriter, r *http.Request) {
	mu.Lock()
	fmt.Fprintf(w, "방문자 수: %d", count)
	mu.Unlock()
}

위 코드는 http 패키지를 사용하여 “/” 경로와 “/count” 경로에 대한 핸들러를 등록하고, 고루틴을 이용하여 각 핸들러를 병렬로 실행합니다. 또한, 뮤텍스를 사용하여 count 변수를 안전하게 공유하고 동기화합니다.

이제 코드를 실행하고 웹 브라우저에서 “localhost:8000”으로 접속하면 “Hello, 웹!”이 표시되고, “/count”로 접속하면 방문자 수가 표시됩니다.

고루틴과 sync 패키지를 사용하여 병렬 웹 서버를 구현하는 방법에 대해 간단히 소개했습니다. 이를 응용하여 더 복잡한 웹 애플리케이션을 개발할 수 있습니다.

참고문헌: