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 메타데이터를 가집니다.