모듈 개발하고 게시하기
모듈 개발하고 게시하기
관련 있는 패키지들을 모아 **모듈(module)**로 묶고, 그 모듈을 게시해서 다른 개발자들이 쓸 수 있게 만들 수 있습니다. 이 글은 모듈을 개발하고 게시하는 전반적인 흐름을 설명합니다. 모듈을 개발·게시·사용하려면 여러 도구와 규칙을 함께 쓰게 되는데, 각각이 어떤 역할을 하는지 하나씩 짚어 볼게요.
출처: Go 공식 문서
모듈을 개발하고, 게시하고, 사용하기 위해 우리는 이런 것들을 활용합니다.
- 워크플로 — 모듈을 개발·게시하고 시간이 지나며 새 버전으로 개정하는 흐름. 모듈 개발·게시 워크플로 참고.
- 설계 관행 — 모듈 사용자가 모듈을 이해하고 새 버전으로 안정적으로 업그레이드하도록 돕는 설계 방식. 설계와 개발 참고.
- 분산 게시 시스템 — 모듈을 게시하고 그 코드를 가져오는 탈중앙화 시스템. 내 저장소에서 모듈을 사용 가능하게 만들고 버전 번호를 붙여 게시합니다. 분산 게시 참고.
- 패키지 검색 엔진이자 문서 브라우저(pkg.go.dev) — 개발자가 모듈을 찾아볼 수 있는 곳. 패키지 발견 참고.
- 모듈 버전 번호 관례 — 모듈을 사용하는 개발자에게 안정성과 하위 호환성 기대치를 전달하는 규칙. 버전 관리 참고.
- Go 도구들 — 다른 개발자가 의존성을 관리(모듈 소스 가져오기, 업그레이드 등)하기 쉽게 만드는 도구. 'Managing dependencies' 참고.
참고로, 단순히 남이 만든 패키지를 사용하는 데만 관심이 있다면 이 글은 적합하지 않아요. 그럴 땐 'Managing dependencies'를 보는 게 맞습니다. 또 모듈 개발의 기초를 튜토리얼로 배우고 싶다면 "Tutorial: Create a Go module"을 추천합니다.
워크플로: 모듈 개발과 게시
모듈을 남에게 게시하고 싶다면, 그 모듈을 쓰기 쉽게 만들어 주는 몇 가지 관례를 따르게 됩니다. 전반적인 과정은 다음과 같아요. 각 단계의 자세한 내용은 "Module release and versioning workflow"에서 더 설명합니다.
- 모듈에 포함할 패키지들을 설계하고 코드를 작성합니다.
- Go 도구로 다른 사람도 접근할 수 있게 하는 관례에 따라 코드를 저장소에 커밋합니다.
- 모듈을 게시해서 개발자들이 발견할 수 있게 만듭니다.
- 시간이 지나며, 각 버전의 안정성과 하위 호환성을 알려 주는 버전 번호 관례를 써서 모듈을 개정합니다.
설계와 개발
모듈 안의 함수와 패키지가 하나의 일관된 덩어리를 이루면 개발자들이 그 모듈을 찾고 쓰기 더 쉬워집니다. 모듈의 공개 API를 설계할 때는 기능을 집중적이고 뚜렷하게 유지하려고 노력해 보세요.
또한 하위 호환성을 염두에 두고 모듈을 설계·개발하면, 사용자가 자기 코드의 변동을 최소화하면서 업그레이드하기 쉬워집니다. 코드에서 특정 기법을 쓰면 하위 호환성을 깨뜨리는 버전을 내지 않을 수 있어요. 그 기법들에 대해서는 Go 블로그의 "Keeping your modules compatible" 글을 참고하세요.
모듈을 게시하기 전에는 replace 지시문을 써서 로컬 파일 시스템에서 그 모듈을 참조할 수 있습니다. 그러면 모듈이 아직 개발 중일 때도 그 모듈의 함수를 호출하는 클라이언트 코드를 쓰기 편해져요. 자세한 내용은 "Module release and versioning workflow"의 "Coding against an unpublished module" 부분을 보세요.
분산 게시
Go에서 모듈을 게시한다는 것은, 저장소에 있는 코드에 태그를 달아 다른 개발자들이 쓸 수 있게 만드는 일입니다. 중앙 서비스에 모듈을 올릴 필요가 없어요. 왜냐하면 Go 도구가 모듈 경로(스킴을 뺀 URL 형태)로 위치를 찾아 내 저장소에서 직접, 또는 프록시 서버에서 모듈을 내려받을 수 있기 때문입니다.
개발자들이 코드에서 패키지를 import한 뒤엔 Go 도구(go get 명령 포함)를 써서 그 모듈의 코드를 내려받아 컴파일에 사용합니다. 이런 모델을 지원하려면, Go 도구가 (다른 개발자를 대신해) 내 저장소에서 모듈 소스를 가져올 수 있게 해 주는 관례와 모범 사례를 따르면 됩니다. 예를 들어 Go 도구는 우리가 지정한 모듈 경로와, 릴리스용으로 태그를 단 모듈 버전 번호를 함께 사용해서 그 모듈을 찾아 사용자에게 내려줍니다.
소스와 게시 관례·모범 사례에 대해서는 "Managing module source"를, 모듈 게시의 단계별 절차는 "Publishing a module"을 참고하세요.
패키지 발견
모듈을 게시하고 누군가 Go 도구로 가져가면, 그 모듈은 Go 패키지 발견 사이트인 pkg.go.dev에 나타납니다. 개발자들은 그 사이트에서 검색해서 모듈을 찾고 문서를 읽을 수 있어요.
모듈을 쓰기 시작하려면 개발자는 모듈에서 패키지를 import한 다음 go get 명령을 실행해 컴파일할 소스 코드를 내려받습니다. 개발자들이 모듈을 찾고 사용하는 방법에 대해서는 'Managing dependencies'를 참고하세요.
버전 관리
시간이 지나며 모듈을 개정·개선하면서, 각 버전의 안정성과 하위 호환성을 전달하도록 설계된 버전 번호(시맨틱 버저닝 모델 기반)를 부여합니다. 이러면 모듈을 쓰는 개발자들이 모듈이 안정적인지, 업그레이드에 큰 동작 변화가 포함될 수 있는지를 판단할 수 있어요. 모듈의 버전 번호는 저장소에서 모듈 소스에 그 번호로 태그를 달아 표시합니다.
메이저 버전 업데이트 개발에 대해서는 "Developing a major version update"를, Go 모듈에서 시맨틱 버저닝 모델을 쓰는 법에 대해서는 "Module version numbering"을 참고하세요.
더 알아보기 (Learn more)
- 모듈 전체 워크플로의 흐름을 이어서 보려면 "Module release and versioning workflow" 문서를 확인하세요.
- 시맨틱 버저닝과 버전 번호의 의미는 "Module version numbering"을 보세요.
- 저장소에 모듈 소스를 구성하는 관례는 "Managing module source"를 참고하세요.