0Pricing
Go Academy · 강의

동시성 오류 처리를 위한 errgroup

실전에서 golang.org/x/sync/errgroup 사용

동시성 오류 처리를 위한 errgroup은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

고루틴과 오류의 문제

go func()로 고루틴을 시작하면 오류를 포함한 반환값이 버려집니다. 반환값을 수집하려면 채널이나 WaitGroup 같은 추가 장치가 필요합니다. errgroup을 사용하면 이 작업이 간단해집니다.

golang.org/x/sync/errgroup

errgroup.Group은 고루틴을 실행하고 오류를 수집합니다. Wait()는 모든 고루틴이 완료될 때까지 차단되며, nil이 아닌 첫 번째 오류를 반환합니다.

var g errgroup.Group
g.Go(func() error { return fetchUsers() })
g.Go(func() error { return fetchOrders() })
if err := g.Wait(); err != nil {
    log.Fatal(err)
}

errgroup.WithContext

WithContext는 그룹과 파생된 컨텍스트를 반환합니다. 첫 번째 고루틴이 오류를 반환하면 컨텍스트가 취소되어 나머지 작업이 중단됩니다.

g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
g.Go(func() error { return doOtherWork(ctx) })
err := g.Wait()

오류와 함께 결과 수집하기

errgroup은 결과가 아니라 오류만 수집합니다. 동기화 없이 결과에 접근하려면 미리 할당한 슬라이스에 인덱스를 사용해 결과를 저장합니다:

results := make([]Result, len(items))
for i, item := range items {
    i, item := i, item
    g.Go(func() error {
        r, err := process(ctx, item)
        if err != nil { return err }
        results[i] = r
        return nil
    })
}
if err := g.Wait(); err != nil { return err }

g.SetLimit (Go 1.20 이상)

g.SetLimit(n)은 동시에 실행되는 고루틴 수의 상한을 설정합니다. 별도의 채널 없이 세마포어처럼 동작합니다.

g.SetLimit(10) // at most 10 goroutines at once
for _, item := range items {
    g.Go(func() error { return process(item) })
}

g.TryGo

g.TryGo(f)는 SetLimit으로 설정한 제한이 허용하는 경우에만 고루틴을 시작합니다. 시작하지 못하면 false를 반환합니다.

첫 번째 오류만 반환

errgroup은 첫 번째 오류만 반환합니다. 모든 오류가 필요하다면 각 고루틴 내부에서 뮤텍스로 보호되는 슬라이스에 오류를 수집합니다.

var mu sync.Mutex
var errs []error
g.Go(func() error {
    if err := doWork(); err != nil {
        mu.Lock(); errs = append(errs, err); mu.Unlock()
    }
    return nil
})

sync.WaitGroup과의 차이

WaitGroup은 완료 여부를 추적하고, errgroup은 완료 여부를 추적하면서 오류도 수집합니다. 어느 고루틴에서든 발생한 오류를 보고해야 한다면 errgroup을 우선 사용합니다.

컨텍스트 취소 전파

errgroup.WithContext를 사용하면 파생된 컨텍스트의 취소 신호가 다른 모든 고루틴에 중단을 알립니다. 이는 첫 번째 오류가 발생하면 취소하는 방식과 유사합니다.

errgroup 코드 테스트

테스트에서는 WithTimeout이 적용된 컨텍스트를 주입하여 고루틴이 멈추더라도 그룹이 무한히 실행되지 않도록 합니다.

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
g, ctx := errgroup.WithContext(ctx)

세마포어 대안

SetLimit이 없던 시절(Go < 1.20)에는 개별 고루틴 내부에서 버퍼가 있는 채널을 세마포어로 사용하여 같은 효과를 얻을 수 있었습니다.

빠른 확인

일반적인 errgroup.Group에는 없고 errgroup.WithContext가 반환하는 것은 무엇인가요?

복습: errgroup

핵심 내용:

  • g.Go(func() error) — 시작하고 첫 번째 오류를 수집합니다
  • g.Wait() — 모든 작업이 완료될 때까지 차단하고 첫 번째 오류를 반환합니다
  • WithContext — 첫 번째 오류 발생 시 컨텍스트가 취소됩니다
  • g.SetLimit(n) — 동시에 실행되는 고루틴 수를 제한합니다(Go 1.20 이상)

자주 묻는 질문

“동시성 오류 처리를 위한 errgroup” 강의는 무료인가요?

네 — “동시성 오류 처리를 위한 errgroup” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“동시성 오류 처리를 위한 errgroup”에서 뭘 배우나요?

실전에서 golang.org/x/sync/errgroup 사용 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Go Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“동시성 오류 처리를 위한 errgroup” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 파이프라인과 단계 패턴
  2. 동시성 오류 처리를 위한 errgroup
  3. 세마포어 패턴
  4. 누수 감지와 취소
← Go Academy(으)로 돌아가기