ksundev 님의 블로그

[URL Checker] hitURL 그리고 느린 URL Checker (순차적) 본문

[개발] Go/중급 프로젝트

[URL Checker] hitURL 그리고 느린 URL Checker (순차적)

ksundev 2025. 6. 26. 17:39
	urls := []string{
		"https://www.airbnb.com/",
		"https://www.google.com/",
		"https://www.amazon.com/",
		"https://www.reddit.com/",
		"https://www.google.com/",
		"https://soundcloud.com/",
		"https://www.facebook.com/",
		"https://www.instagram.com/",
	}

위의 유명한 사이트들에 get 요청을 보내는 메서드를 만들어봅시다.

참고로 Go 표준 라이브러리 중 net/http를 사용할 것입니다.

https://pkg.go.dev/net/http

 

package main

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

var errRequestFailed = errors.New("Request Failed")

func main() {
	var results = make(map[string]string)
	urls := []string{
		"https://www.airbnb.com/",
		"https://www.google.com/",
		"https://www.amazon.com/",
		"https://www.reddit.com/",
		"https://www.google.com/",
		"https://soundcloud.com/",
		"https://www.facebook.com/",
		"https://www.instagram.com/",
	}

	for _, url := range urls {
		result := "OK"
		err := hitURL(url)
		if err != nil {
			result = "FAILED"
		}
		results[url] = result
	}
	for url, result := range results {
		fmt.Println(url, result)
	}
}

func hitURL(url string) error {
	fmt.Println("Checking", url)
	resp, err := http.Get(url)
	if err != nil || resp.StatusCode >= 400 {
		return errRequestFailed
	}
	return nil
}

400번대 이상의 에러코드는 접속 실패를 뜻하므로 실패메세지를 돌려줍시다.

 

로그를 보면 알 수 있듯이 목록에서 하나씩 순차적으로(sequentially) 처리되는 것을 볼 수 있습니다.

만약 각 링크당 1초가 걸린다면 1초 X 링크 수 만큼의 시간이 소요될 것입니다.

 

이제 앞으로 우리가 할 것은 이를 동시에 처리하려고 합니다.
python에서는 불가능한 병렬 처리(parallelism)을 하려는 것인데,
동시에 처리할 수 있다면 모든 링크에 접근하는데 1초밖에 소요되지 않겠죠?

이것이 우리가 Go를 사용하는 이유입니다!

 

다음 포스트에서 병렬처리(parallelism)을 해보겠습니다.