[go] net/http 패키지를 사용한 요청 병렬 처리

Go 언어의 net/http 패키지를 사용하면 HTTP 요청을 보내고 응답을 받을 수 있습니다. 때로는 여러 개의 요청을 동시에 보내고, 모든 응답을 기다린 후 결과를 처리해야 하는 상황이 있습니다. 이를 위해 Go의 고루틴과 채널을 활용하여 요청을 병렬로 처리할 수 있습니다.

HTTP GET 요청 보내기

가장 간단한 형태의 HTTP GET 요청을 보내는 예제는 다음과 같습니다.

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	resp, err := http.Get("https://example.com")
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(body))
}

위 예제는 net/http 패키지를 사용하여 “https://example.com”으로 GET 요청을 보내고, 응답을 받아서 결과를 출력합니다.

요청 병렬 처리하기

만일 여러 개의 HTTP 요청을 병렬로 처리하고, 모든 응답을 받아서 처리해야 한다면, 다음과 같이 고루틴과 채널을 활용할 수 있습니다.

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	urls := []string{"https://example1.com", "https://example2.com", "https://example3.com"}

	responses := make(chan string, len(urls))

	for _, url := range urls {
		go func(url string) {
			resp, err := http.Get(url)
			if err != nil {
				responses <- err.Error()
				return
			}
			defer resp.Body.Close()

			body, err := ioutil.ReadAll(resp.Body)
			if err != nil {
				responses <- err.Error()
				return
			}

			responses <- string(body)
		}(url)
	}

	for i := 0; i < len(urls); i++ {
		fmt.Println(<-responses)
	}
}

위 예제는 urls 슬라이스에 있는 URL들에 대해 고루틴을 생성하여 동시에 GET 요청을 보내고, 각각의 응답을 채널에 보내고 있습니다. 마지막으로 채널에서 값을 읽어와서 처리합니다.

net/http 패키지를 이용하여 HTTP 요청을 보내는 방법과 고루틴과 채널을 활용하여 병렬로 요청을 처리하는 방법을 살펴보았습니다.

더 자세한 내용은 Go 공식 문서를 참고하시기 바랍니다.