[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 공식 문서를 참고하시기 바랍니다.