PHpullh
학습 라이브러리/Go/레이스 디텍터

GO · 테스트

레이스 디텍터

-race 플래그로 동시성 버그를 감지합니다. 데이터 레이스를 컴파일/런타임에 발견합니다.

테스트중급race-detectorconcurrencydata-racetesting

핵심 설명

-race 플래그로 동시성 버그를 감지합니다. 데이터 레이스를 컴파일/런타임에 발견합니다.

Go code

package main

import (
	"fmt"
	"sync"
	"testing"
)

// 레이스 컨디션이 있는 코드 (나쁜 예)
type UnsafeCounter struct {
	count int
}

func (c *UnsafeCounter) Inc() { c.count++ }
func (c *UnsafeCounter) Get() int { return c.count }

// 안전한 버전
type SafeCounter struct {
	mu    sync.Mutex
	count int
}

func (c *SafeCounter) Inc() {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.count++
}

func (c *SafeCounter) Get() int {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.count
}

func TestRace(t *testing.T) {
	c := &SafeCounter{}
	var wg sync.WaitGroup

	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			c.Inc()
		}()
	}
	wg.Wait()

	if c.Get() != 100 {
		t.Errorf("카운터: got %d, want 100", c.Get())
	}
}

func main() {
	fmt.Println("레이스 디텍터:")
	fmt.Println("  go test -race ./...   # 모든 테스트에 레이스 감지")
	fmt.Println("  go build -race        # 바이너리에 레이스 감지 포함")
	fmt.Println("  go run -race main.go  # 실행 시 감지")
}

학습 팁

CI에서 go test -race를 항상 실행하세요. 레이스 디텍터는 10-20배 느려지므로 별도 파이프라인으로 분리할 수 있습니다.

주의할 점

레이스 디텍터는 실제로 경합이 발생할 때만 감지합니다. 감지되지 않았다고 안전한 것은 아닙니다. 설계 수준에서 동시성을 고려하세요.

자주 묻는 질문

레이스 디텍터란 무엇인가요?

-race 플래그로 동시성 버그를 감지합니다. 데이터 레이스를 컴파일/런타임에 발견합니다.

레이스 디텍터 학습 시 주의할 점은 무엇인가요?

레이스 디텍터는 실제로 경합이 발생할 때만 감지합니다. 감지되지 않았다고 안전한 것은 아닙니다. 설계 수준에서 동시성을 고려하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.