① 왜 원격 Mac에서 모듈 풀이 자주 막히나
Go는 콤마로 구분된 GOPROXY 목록을 앞에서부터 시도합니다. 체인 앞단이 느리거나 타임아웃이 길면 잡 큐 전체가 밀리고, 끝에 direct가 없으면 미러에 없는 모듈에서 영구 실패로 이어질 수 있습니다.
- 프록시 지연·단일 장애점: 근접 미러 없이 공개 프록시만 쓰거나, 폴백 없이 한 곳만 두면 약한 회선에서 재현이 어렵습니다.
- 비공개 모듈 유출·패턴 누락:
GOPRIVATE가 베니티 경로를 덮지 못하면 공개 프록시·로그에 민감 URL이 노출될 수 있습니다. - 캐시·메타 혼선: 공유
GOMODCACHE에 서로 다른 GOPROXY를 쓰는 잡이 동시에 붙으면 락·메타데이터 충돌이 납니다.
GOMODCACHE는 다운로드한 모듈 ZIP·메타를 보관하고, GOCACHE는 빌드 산출물 캐시입니다. 둘을 잡별로 나누면 CI 간 간섭이 줄고, 캐시 키 설계도 명확해집니다.
② 의사결정 매트릭스: 자체 모듈 프록시 vs 공개 GOPROXY 체인
자체 호스팅(예: Athens, 사내 게이트)은 감사·승인된 아티팩트·동일 회선 내 캐시에 유리합니다. 공개 프록시를 콤마로 엮고 마지막에 direct는 초기 도입·소규모 팀·지역 미러만 바꿔 끼우기 좋습니다.
| 축 | 자체 모듈 프록시 | 공개 체인 + direct |
|---|---|---|
| 거버넌스 | 내부 승인·감사 로그·차단 목록 | 제3자 이용약관·가용성에 의존 |
| 운영 부담 | 스토리지·업그레이드·모니터링 | 환경 변수 변경 위주 |
| 약한 국경 간 링크 | 동일 리전/VPC에 두면 RTT 이득 | 신뢰 미러 선행 + direct로 VCS 폴백 |
| 비공개 모듈 | 내부 프록시 + sumdb 정책 통합 | GOPRIVATE·GONOPROXY·GONOSUMDB로 분리 |
팀이 이미 컨테이너·다른 언어용 사내 레지스트리를 운영 중이면 Go 모듈까지 같은 운영 창에 넣는 편이 재현과 온콜에 유리합니다. 반면 단일 저장소·공개 의존성 위주면 공개 체인으로 시작한 뒤 지표(실패율·p95 지연)로 자체 프록시 필요성을 판단해도 늦지 않습니다.
③ 실행 파라미터 표: GOPROXY·비공개·GOSUMDB·캐시
비밀은 저장소에 커밋하지 말고 CI 비밀·런너 환경에 두고, 콤마 구분값에는 공백을 넣지 않습니다. 적용 후 go env | grep -E 'GOPROXY|GOPRIVATE|GOSUMDB|GOMODCACHE'로 확인하세요.
| 변수 | 역할·예시 |
|---|---|
GOPROXY |
프록시 URL을 콤마로 나열. direct는 VCS 직접. 예: https://승인-미러,https://proxy.golang.org,direct |
GOPRIVATE |
비공개 모듈 경로 접두사(콤마). 프록시·기본 sumdb 동작에 영향 |
GONOPROXY |
프록시를 타지 않을 패턴. 보통 GOPRIVATE와 맞춤 |
GOSUMDB |
체크섬 DB. 기본 sum.golang.org, 사내 배포 시 엔드포인트 교체 |
GONOSUMDB |
sumdb 검증 생략 패턴(내부 모듈). 최소 범위만 |
GOMODCACHE |
모듈 캐시 루트. CI는 CI_PIPELINE_ID 등으로 하위 분리 |
GOCACHE |
빌드 캐시. GOMODCACHE와 경로 분리 권장 |
GOTMPDIR |
임시 파일. 느린 공유 볼륨 피하기 |
GOINSECURE |
레거시 내부 호스트만, 콤마 패턴. 가능하면 HTTPS 고정 |
비공개 경로는 import 경로 전체 접두사가 빠지지 않게 패턴을 적습니다. 토큰이 들어간 git config URL은 로그 마스킹 규칙과 함께 문서화하세요.
④ CI에 옮기기: 재현 가능한 다섯 단계
- 경로 인벤토리:
go list -m all로 공개·비공개 의존성을 나눕니다. - GOPRIVATE 고정: 조직 도메인·모노레포 베니티를 한 번에 덮는지 리뷰합니다.
- GOPROXY 순서: 사내→지역 미러→공개→direct 여부를 YAML·launchd·SSH에 동일하게 둡니다.
- 캐시 키:
go.sum해시·Go 마이너 버전·GOOS/GOARCH를 캐시 복원 키에 포함합니다. - 검증·롤백:
go mod verify·일부 패키지go test로 스모크 후 전체 파이프라인을 돌립니다.
⑤ 요약·FAQ: direct·sumdb·캐시
한 줄 요약: 프록시는 순서 있는 폴백, 비공개는 패턴으로 격리, 무결성은 GOSUMDB 정책, 디스크는 모듈 캐시와 빌드 캐시 분리가 기본기입니다.
direct만으로도 느리다면 병목이 Git 클론·LFS일 수 있어 모듈 프록시만으로는 한계가 있습니다. sumdb 오류가 반복되면 대체 프록시가 잘못된 메타를 주는지, GONOSUMDB 범위가 과한지부터 점검하세요.