본문으로 건너뛰기

[Loki] memory/columnar API를 Go 관용구에 맞게 리팩터링

PR #20622 - chore: make memory, columnar APIs more idiomatic

들어가며

Grafana Loki의 columnar 데이터 처리 패키지에서 타입 생성자 함수들이 Make*New* 두 가지 명명 규칙을 혼용하고 있었습니다. Go 커뮤니티에서는 생성자 함수에 New* 접두사를 사용하는 것이 관용적(idiomatic)입니다. 이 PR은 모든 Make* 함수를 New*로 통일하고, columnar.NewRecordBatch가 포인터를 반환하도록 변경합니다.

핵심 코드 분석

Before

alloc = memory.MakeAllocator(nil)
validity := memory.MakeBitmap(alloc, totalLen)
values := memory.MakeBuffer[T](alloc, totalLen)
return MakeNull(validity), nil
return MakeBool(values, validity), nil
return MakeNumber[T](values.Data(), validity), nil
return MakeUTF8(data.Data(), offsets, validity), nil

After

alloc = memory.NewAllocator(nil)
validity := memory.NewBitmap(alloc, totalLen)
values := memory.NewBuffer[T](alloc, totalLen)
return NewNull(validity), nil
return NewBool(values, validity), nil
return NewNumber[T](values.Data(), validity), nil
return NewUTF8(data.Data(), offsets, validity), nil

변경 대상:

  • memory.MakeAllocator -> memory.NewAllocator
  • memory.MakeBitmap -> memory.NewBitmap
  • memory.MakeBuffer -> memory.NewBuffer
  • columnar.MakeNull -> columnar.NewNull
  • columnar.MakeBool -> columnar.NewBool
  • columnar.MakeNumber -> columnar.NewNumber
  • columnar.MakeUTF8 -> columnar.NewUTF8

왜 이게 좋은가

  1. Go 관용구 준수: New*는 Go에서 생성자의 표준 접두사입니다. 표준 라이브러리(sync.NewMutex, bytes.NewBuffer 등)가 모두 이 패턴을 따릅니다.
  2. API 일관성: 같은 패키지 내에서 Make*New*가 혼용되면 개발자 혼란을 유발합니다.
  3. 포인터 반환 통일: NewRecordBatch가 포인터를 반환하도록 변경하여 다른 New* 함수와 시그니처를 맞춥니다.
  4. +209/-209 순수 리네이밍: 로직 변경 없이 네이밍만 정리한 안전한 리팩터링입니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글