> ## Content Index
> Fetch the complete content index at: https://www.popit.kr/llms.txt
> Use this file to discover other available public pages before exploring further.

# 고 모듈과 함께 비공개 외부 저장소를 사용하는 방법
- URL: https://www.popit.kr/go-modules-private-repository/
- Published: 2020-03-17T03:09:02.000Z
- Updated: 2020-03-18T00:47:54.000Z
- Author: cp949
- Tags: #소프트웨어, golang, Go, 모듈

※ 고 언어 1.13 버전을 기준으로 설명합니다.

[고 모듈을 사용하여 패키지 구성 방법 개선하기](https://www.popit.kr/improve-package-structure-with-go-modules/)에서 로컬 모듈\[1\]을 사용하는 방법도 소개했습니다. 로컬 파일 시스템에 있는 모듈을 바로 사용하는 방법으로 조직 내에서만 사용되는 비공개 모듈에 적용할 수 있습니다. 그런데 이전 글에서 로컬 모듈에 대해 버전을 명시할 수 있는 것처럼 소개했는데 알고보니 그렇지 않았습니다.  

```go
require (
project/go-module v1.2.2
)

replace project/go-module => ../go-module
```

위 예제처럼 v1.2.2로 버전을 명시했더라도 실제 파일 시스템에 있는 모듈의 상황에 따라서 다른 버전이 사용될 수 있습니다.\[2\] 일관성 있는 빌드 환경을 위해선 이를 해결할 필요가 있습니다.

고 모듈의 버전 관리 핵심은 [Git](https://git-scm.com/?ref=popit.kr)으로 대표되는 [버전 관리 시스템](https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84%5F%EA%B4%80%EB%A6%AC?ref=popit.kr)과 [GitHub](https://github.com/?ref=popit.kr)과 같은 외부 저장소입니다. 그렇다면 조직 내의 비공개 외부 저장소를 사용하면 끝나는 문제인 것 같지만 기본적으로 고 모듈과 비공개 외부 저장소를 함께 사용할 수 없습니다. 비공개이므로 인증 없이는 접근이 차단되기 때문입니다. 이번 글에서는 고 모듈과 함께 비공개 외부 저장소를 사용할 수 있는 방법을 추가로 소개하겠습니다.

## 들어가기 전에

앞으로 소개할 방법은 비공개 외부 저장소에 대해서 [프록시 서버와 체크섬 서버](https://tip.golang.org/cmd/go/?ref=popit.kr#hdr-Module%5Fdownloading%5Fand%5Fverification)를 사용하지 않습니다. [자체 서버를 구축](https://docs.gomods.io/intro/?ref=popit.kr)하지 않는 이상 인증 문제를 해결할 방법이 없기 때문입니다. 프록시 서버나 체크섬 서버는 버전 관리를 위한 필수 요소가 아닙니다. 하지만 만약 자체 서버를 구축하고 앞으로 소개할 방법을 응용한다면 보다 편리하게 비공개 외부 저장소를 사용할 수 있을 것입니다.

## 모듈 경로 지정

외부 저장소를 통해 모듈을 제공하기 위해서는 모듈 경로가 외부 저장소 내에 위치한 경로가 되어야 합니다. 예를 들어 외부 저장소 도메인이 gitlab.my-company.com이고 popit 그룹(혹은 사용자) 내에 go-module 모듈이 위치한다면 아래와 같이 모듈 경로를 지정하여야 합니다.\[3\]\[4\]

```go
module gitlab.my-company.com/popit/go-module
```

## 엑세스 토큰 발급

비공개 외부 저장소에 접근하기 위해서는 인증 수단으로 [엑세스 토큰](https://docs.gitlab.com/ee/user/profile/personal%5Faccess%5Ftokens.html?ref=popit.kr)을 사용할 수 있습니다. 엑세스 토큰은 개인 설정 페이지에서 발급할 수 있습니다. 아래는 [Gitlab](https://about.gitlab.com/?ref=popit.kr)의 개인 설정 페이지로 다른 유명 외부 저장소들도 개인 설정 페이지에서 알맞은 메뉴를 찾을 수 있을 것입니다.

![Screenshot from 2020-03-13 11-37-10](https://www.popit.kr/content/images/wp/2020/03/Screenshot-from-2020-03-13-11-37-10-600x458.png)

##### 엑세스 토큰 발급 페이지 예시

엑세스 토큰을 발급할 때 저장소 읽기 권한을 꼭 선택하여야 합니다.

## Git 설정

비공개 외부 저장소 경로에 대해 Git 작업이 발생하면 자신의 아이디와 발급한 토큰이 인증 영역에 추가된 경로가 대신 사용되게 하여 인증을 통과하게 만듭니다. --global 옵션으로 전역으로 설정해야 고 모듈에도 적용됩니다.  

```sh
git config --global --add url.https://id:token@gitlab.my-company.com.insteadof https://gitlab.my-company.com
```

## 환경 변수 설정

[GOPRIVATE](https://golang.org/cmd/go/?ref=popit.kr#hdr-Module%5Fconfiguration%5Ffor%5Fnon%5Fpublic%5Fmodules) 환경 변수를 사용해 비공개 외부 저장소에 있는 모듈에 대해서는 프록시 서버와 체크섬 서버를 사용하지 않고 Git 작업만 수행되도록 합니다.  

```sh
GOPRIVATE=gitlab.my-company.com go get gitlab.my-company.com/popit/go-module
```

## 참조 문서

- [고 모듈로 비공개 외부 저장소에 접근하기](https://medium.com/cloud-native-the-gathering/go-modules-with-private-git-repositories-dfe795068db4?ref=popit.kr)

---

\[1\] [공식 위키](https://github.com/golang/go/wiki/Modules?ref=popit.kr#when-should-i-use-the-replace-directive)에서는 "on-disk location of modules"로 소개되어 있습니다.

\[2\] [유사 버전](https://tip.golang.org/cmd/go/?ref=popit.kr#hdr-Pseudo%5Fversions)인 모듈이 될 수도 있고 심지어 [버전 관리 시스템](https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84%5F%EA%B4%80%EB%A6%AC?ref=popit.kr)을 사용하지 않는 모듈이어도 [상관없습니다.](https://github.com/golang/go/wiki/Modules?ref=popit.kr#can-i-work-entirely-outside-of-vcs-on-my-local-filesystem)

\[3\] 만약 도메인에 포트가 포함된다면 해당 외부 저장소는 사용할 수 없습니다. 모듈 경로에 콜론(:)을 포함할 수 없기 때문입니다.

\[4\] [메이저 버전 x가 2 이상이라면 /x를 모듈 경로 끝에 명시하여야 합니다.](https://github.com/golang/go/wiki/Modules?ref=popit.kr#semantic-import-versioning)