Go 언어 sync.Once 완벽 가이드: 단 한 번의 실행 보장과 성능 최적화
🤖 AI 추천
Go 언어의 동시성 프로그래밍에서 리소스 초기화, 싱글턴 패턴 구현 등 단 한 번의 실행이 필요한 경우를 효과적으로 처리하고 싶은 모든 Go 개발자에게 이 콘텐츠를 추천합니다. 특히, 동시성 환경에서의 안정성과 성능 최적화에 관심 있는 미들 레벨 이상의 개발자에게 유용합니다.
🔖 주요 키워드

핵심 기술: Go 언어의 sync.Once
는 프로그램 라이프사이클 동안 특정 작업을 단 한 번만 실행하도록 보장하는 강력한 동시성 프리미티브입니다. 이를 통해 싱글턴 패턴, 레이지 로딩, 동시 안전 초기화 등의 일반적인 요구사항을 효율적으로 해결할 수 있습니다.
기술적 세부사항:
* 목적: 여러 고루틴이 동시에 호출해도 특정 함수의 실행을 단 한 번만 보장합니다.
* 주요 인터페이스: Do(f func())
메서드를 통해 함수 f
를 실행합니다.
* 작동 원리:
* atomic.Uint32
를 사용하여 실행 여부를 플래그로 관리합니다.
* 첫 번째 실행 시 sync.Mutex
를 사용하여 락을 획득하고, 실행 후 done
플래그를 설정합니다.
* 이후 호출은 락 없이 done
플래그를 확인하여 즉시 반환하므로 오버헤드가 거의 없습니다.
* Do
메서드 호출 시 f
함수가 완료된 후의 결과는 모든 Do
호출에 동기화됩니다.
* 사용 사례: 싱글턴 패턴 (DB 연결 풀, 설정 로딩), 레이지 로딩, 동시 안전 초기화.
* 주의사항: sync.Once
객체는 첫 사용 후 복사하면 안 되며, f
함수 내에서 Do
를 다시 호출하면 데드락이 발생합니다. f
함수에서 패닉이 발생하면 해당 실행으로 간주되어 이후에는 실행되지 않습니다.
* Go 1.21 신규 함수:
* OnceFunc(f func()) func()
: 패닉 처리 강화 (재패닉).
* OnceValue[T any](f func() T) func() T
: 결과 값을 캐싱하여 반환.
* OnceValues[T1, T2 any](f func() (T1, T2)) func() (T1, T2)
: (값, 에러) 반환 패턴에 적합.
개발 임팩트: sync.Once
는 매우 적은 오버헤드(첫 호출 시 50-100ns, 이후 1-2ns)로 동시성 문제를 해결하여 성능 저하를 최소화합니다. 특히 고성능이 요구되는 서버 애플리케이션에서 필수적인 도구입니다. Go 1.21의 새로운 함수들은 코드의 간결성과 안정성을 더욱 향상시킵니다.
커뮤니티 반응: (원문에서 직접적인 커뮤니티 반응 언급 없음)