Go의 종속성 관리 소개
종속성 관리는 프로젝트가 의존하는 라이브러리 및 패키지의 버전을 관리하는 데 도움이 되므로 모든 소프트웨어 프로젝트의 중요한 측면입니다. Go(Golang) 에서 종속성 관리는 버전 관리 문제를 더 쉽게 해결하고 다른 패키지와의 호환성을 유지하며 전체 개발 프로세스를 간소화하여 Go 프로젝트를 재현하고 유지 관리할 수 있도록 합니다.
Go 모듈 이전에는 Go의 종속성 관리가 덜 간소화되었습니다. 개발자는 종종 dep
, glide
또는 govendor
와 같은 도구를 사용하여 종속성을 관리합니다. 이러한 도구는 유용했지만 공식 Go 프로젝트의 일부가 아니었기 때문에 일부 개발자가 Go를 언어로 채택하는 데 마찰이 생겼습니다.
Go 모듈의 시대
2018년에 Go 팀은 Go 프로젝트의 종속성 관리를 위한 새로운 표준인 "모듈" 개념을 도입했습니다. 모듈은 함께 버전이 지정된 관련 패키지 모음으로, 코드베이스에 필요한 모든 종속성을 제공합니다. Go 1.11에 Go 모듈이 도입되면서 종속성 관리가 더 단순해지고 다양해졌으며 Go 프로젝트에서 공식적으로 지원되었습니다. Go 모듈은 다음과 같은 기능을 도입했습니다.
- Semantic Versioning(SemVer)을 사용한 종속성 버전 관리
- 간소화된 종속성 관리 명령(예:
go get
,go mod tidy
) - 자세한 종속성 정보가 포함된 매니페스트 파일(
go.mod
) 자동 생성 - 필요한 종속성의 자동 다운로드 및 캐싱
Go 모듈을 사용하면 이전에 Go 개발의 제약이었던 $GOPATH
디렉토리에 더 이상 코드를 배치할 필요가 없습니다. 이 새로운 시스템은 보다 유연한 프로젝트 구조를 가능하게 하여 다른 리포지토리 간에 전환할 때 Go 프로젝트에서 작업하기가 더 쉬워집니다.
Go 모듈 프로젝트 설정
Go 모듈을 시작하는 것은 간단합니다. 새로운 Go 모듈 프로젝트를 설정하려면 아래 단계를 따르세요.
- 먼저 시스템에 Go 버전 1.11 이상이 설치되어 있는지 확인하십시오. 터미널에서 go version을 실행하여
go version
확인할 수 있습니다. - 원하는 위치로 이동하고 설명이 포함된 이름(예:
my-go-project
으로 새 프로젝트 폴더를 만듭니다. - 명령줄에서 새로 만든 폴더로 이동합니다.
go mod init
명령과 모듈 경로를 차례로 실행하여 새 Go 모듈을 초기화합니다. 예를 들어 GitHub에서 프로젝트를 호스팅하려는 경우go mod init github.com/your-username/my-go-project
실행할 수 있습니다. 이 명령은 프로젝트 폴더 내에go.mod
라는 새 파일을 생성합니다.
go.mod
파일은 Go 모듈 프로젝트의 핵심입니다. 이름과 같은 모듈에 대한 메타데이터를 포함하고 필요한 모든 종속성을 나열합니다. Go 프로젝트의 수명 주기 동안 go.mod
파일과 상호 작용하여 종속성을 관리합니다. 이제 Go 모듈 프로젝트가 설정되었으므로 Go 모듈 시스템을 사용하여 종속성을 추가하고 관리할 준비가 되었습니다.
Go 모듈 내 종속성 관리
Go 모듈은 프로젝트의 종속성을 관리하기 위한 간단하고 효과적인 접근 방식을 제공합니다. 특정 종속성 버전을 추가, 업데이트 또는 제거할 수 있으므로 프로젝트 및 다른 패키지와의 상호 작용에 대한 제어를 유지할 수 있습니다. 이 섹션에서는 Go 모듈 프로젝트 내에서 종속성을 관리하는 프로세스를 안내합니다.
종속성 추가
새 종속성을 추가하려면 Go 코드에서 원하는 패키지를 가져오기만 하면 됩니다. 예를 들어 github.com/gorilla/mux
프로젝트에 추가하려면 다음과 같이 가져오세요.
가져오기( "github.com/gorilla/mux" )
다음에 go build
또는 go test
실행할 때 Go는 필요한 패키지를 자동으로 다운로드하고 go.mod
및 go.sum
파일을 업데이트하며 지정된 패키지를 사용하도록 프로젝트를 구성합니다. 또는 go get
명령을 사용하여 새 종속성을 명시적으로 추가할 수 있습니다.
github.com/gorilla/mux로 이동
이렇게 하면 패키지를 가져올 뿐만 아니라 프로젝트의 go.mod
및 go.sum
파일도 업데이트됩니다.
종속성 업데이트
특정 종속성을 새 버전으로 업데이트하려면 go get
명령 뒤에 패키지 가져오기 경로와 원하는 버전 번호를 사용합니다.
github.com/gorilla/[email protected]으로 이동
이 명령은 패키지의 새 버전으로 go.mod
파일을 업데이트하고 해당 소스 코드를 다운로드합니다. 업데이트된 패키지에 주요 변경 사항이 도입된 경우 이에 따라 코드를 조정해야 할 수 있습니다.
종속성 제거
프로젝트에서 종속성을 제거하려면 먼저 소스 코드에서 해당 import 문을 삭제합니다. 그런 다음 go mod tidy
명령을 실행하여 go.mod
파일을 정리합니다.
모드 깔끔한 이동
이 명령은 go.mod
파일에서 사용하지 않는 종속성을 제거하고 프로젝트를 깨끗하고 체계적으로 유지하도록 합니다.
시맨틱 버전 관리 및 Go 모듈
SemVer(Semantic Versioning)는 소프트웨어 릴리스에 고유한 버전 번호를 할당하는 널리 채택된 버전 관리 시스템입니다. Major.Minor.Patch(예: 1.2.3)의 세 부분으로 된 번호 매기기 형식을 사용합니다. SemVer에서:
- 주요 버전 변경은 주요 변경 사항을 나타내며 수동 코드 조정이 필요합니다.
- 마이너 버전 변경은 이전 버전과의 호환성을 유지하면서 새로운 기능을 도입합니다.
- 패치 버전 변경에는 버그 수정 및 사소한 성능 개선이 포함되며 이전 버전과도 호환됩니다.
Go Modules는 Semantic Versioning을 통합하여 종속성 버전 관리를 처리하므로 개발자가 업데이트, 이전 버전과의 호환성 및 브레이킹 체인지를 보다 쉽게 관리할 수 있습니다. Go 모듈로 종속성 버전을 지정할 때 버전 범위 또는 특정 버전 번호를 사용할 수 있습니다. 예: - 최신 안정 버전의 패키지를 가져오려면 버전 번호 없이 패키지 가져오기 경로를 사용하십시오: go get github.com/gorilla/mux
. - 특정 버전을 가져오려면 @
기호 뒤에 버전 번호를 추가하세요: go get github.com/gorilla/[email protected]
. - 특정 주 버전 내에서 최신 부 또는 패치 업데이트를 가져오려면 ^
(캐럿) 기호를 사용하십시오: go get github.com/gorilla/mux@^v1.0.0
.
일반적인 Go 모듈 명령 및 용도
다음은 가장 일반적으로 사용되는 Go Modules 명령과 해당 사용 시나리오 중 일부입니다.
모드 초기화로 이동
go mod init
현재 디렉터리 내에서 새 Go 모듈 프로젝트를 초기화합니다. 모듈, 해당 종속성 및 버전 제약 조건에 대한 정보가 포함된 go.mod
파일을 생성합니다.
go mod init example.com/myproject
example.com/myproject
모듈의 경로로 바꿉니다.
가다
go get
은 종속성을 추가, 업데이트 또는 제거하는 데 사용되는 다목적 명령입니다. 패키지 가져오기 경로를 제공하고 필요에 따라 버전 번호 또는 범위를 입력합니다.
github.com/gorilla/[email protected]으로 이동
이 명령은 github.com/gorilla/mux
패키지를 v1.8.0 버전으로 추가하거나 업데이트합니다.
모드 깔끔한 이동
go mod tidy
go.mod
파일에서 사용하지 않는 종속성을 제거하고 프로젝트 소스 코드의 import 문을 반영하도록 업데이트합니다.
모드 깔끔한 이동
원치 않는 종속성에 대한 가져오기 문을 제거한 후 이 명령을 실행합니다.
모드 그래프로 이동
go mod graph
프로젝트의 종속성 트리를 표시하여 직접 및 간접 종속성을 모두 읽을 수 있는 형식으로 보여줍니다. 이 명령은 복잡한 종속성 문제를 디버깅할 때 유용할 수 있습니다.
모드 그래프로 이동
모드 확인하러 가기
go mod verify
go.sum
파일에 나열된 종속성의 무결성을 확인합니다. 종속성의 체크섬이 기록된 값과 일치하지 않으면 명령이 오류를 보고합니다.
모드 확인하러 가기
종속성 충돌 해결
프로젝트가 공유 종속성에 대한 버전 요구 사항이 다른 여러 패키지에 종속되는 경우 종속성 충돌이 발생할 수 있습니다. Go 모듈은 go.mod
파일의 replace
및 exclude
지시문을 사용하여 이러한 충돌을 처리하는 기본 제공 메커니즘을 제공합니다.
교체 지시어
replace
지시문을 사용하면 모듈 버전을 다른 버전으로 변경하거나 로컬 경로에 매핑할 수 있습니다. 이는 원격 리포지토리에 커밋하기 전에 특정 버전, 분기된 프로젝트 또는 로컬 변경 사항을 테스트해야 하는 상황에서 유용할 수 있습니다. replace 지시문을 사용하려면 go.mod
파일에 다음 줄을 추가합니다.
교체 example.com/original/module v1.2.3 => example.com/new/module v1.4.0
이는 example.com/original/module
버전 v1.2.3
을 example.com/new/module
버전 v1.4.0
으로 대체합니다. 모듈을 로컬 경로로 바꿀 수도 있습니다.
교체 example.com/original/module v1.2.3 => ../local/path/to/new/module
제외 지시어
exclude
지시문을 사용하여 모듈의 특정 버전이 프로젝트에서 사용되는 것을 방지할 수 있습니다. 이는 특정 버전에 호환성 문제나 보안 취약성이 있음을 알고 있을 때 유용합니다. 모듈 버전을 제외하려면 go.mod
파일에 다음 행을 추가하십시오.
example.com/target/module v1.2.3 제외
이러한 변경 사항을 적용한 후 go mod tidy
실행하여 go.sum
파일을 업데이트하고 종속성 트리를 다시 계산해야 합니다.
Private Go 모듈 및 저장소 관리
비공개 Go 모듈 및 리포지토리로 작업하는 것은 공개 모듈로 작업하는 것과 유사하지만 적절한 인증 및 개인정보 보호를 보장하기 위한 몇 가지 추가 단계가 있습니다.
GOPRIVATE 구성
공용 서버에 대한 가져오기 경로 유출을 방지하려면 GOPRIVATE
환경 변수를 구성하십시오. 이 변수는 개인 저장소에 대한 가져오기 경로 패턴의 쉼표로 구분된 목록을 지정합니다.
go env -w GOPRIVATE=example.com/private/path/*
액세스 토큰 사용
프라이빗 리포지토리를 사용하려면 일반적으로 GitHub 또는 GitLab과 같은 소스 코드 호스팅 서비스로 인증해야 합니다. 적절한 권한(예: GitHub의 repo
범위)이 있는 개인용 액세스 토큰을 만듭니다. 액세스 토큰을 만드는 구체적인 단계는 호스팅 서비스 설명서를 참조하세요. 액세스 토큰을 얻은 후 인증을 위한 환경 변수를 구성합니다. VCS 서비스에 따라 적절한 환경 변수를 사용하십시오.
내보내기 GIT_TERMINAL_PROMPT=0 내보내기 GITHUB_TOKEN=YOUR_ACCESS_TOKEN
이렇게 하면 go
명령이 개인 리포지토리를 Go 모듈로 다운로드하고 인증할 수 있습니다. 여러 VCS 서비스로 작업하는 경우 필요에 따라 별도의 환경 변수를 정의하여 각각에 대한 개별 액세스 토큰을 구성할 수 있습니다.
이전 종속성 관리 시스템에서 마이그레이션
Go Modules 이전에는 Dep, glide 또는 맞춤형 벤더 디렉토리 솔루션과 같은 다양한 종속성 관리 시스템이 있었습니다. 이러한 시스템을 계속 사용하고 있다면 Go 모듈로 마이그레이션하여 최신 상태를 유지하고 최신 Golang 종속성 관리의 이점을 누릴 때입니다. 이전 종속성 관리 시스템에서 Go 모듈로 마이그레이션하려면 다음 단계를 따르세요.
- 필요한 경우 이전 상태로 되돌릴 수 있도록 원래 프로젝트의 백업을 만듭니다.
- 기존 종속성 관리 파일(예:
Gopkg.toml
또는Gopkg.lock
)을 제거합니다. - 터미널에서 프로젝트의 루트로 이동하고
go mod init
실행하여 새go.mod
파일을 만듭니다. 또한 이전 종속성 파일(있는 경우)을 Go 모듈 항목으로 변환하려고 시도합니다. go mod tidy
실행하여go.mod
파일을 이전 시스템의 종속 항목으로 채웁니다. 이 명령은 필요한 패키지만 종속성 트리의 일부가 되도록 합니다.- 이 시점에서
go.mod
파일을 조정하여 종속성 충돌을 해결하거나 특정 버전을 적용해야 할 수 있습니다. 이러한 문제를 처리하기 위해 필요에 따라replace
및exclude
지시문을 사용하십시오. - 프로젝트가 여전히 예상대로 테스트를 빌드하고 통과하는지 확인합니다.
이러한 단계를 따르면 이제 프로젝트가 Go 모듈과 함께 작동하여 종속성 관리를 간소화하고 장기적으로 유지 관리가 더 쉬워집니다. 남아 있는 문제는 go.mod
파일을 조정하거나 가져오기 경로가 올바른 형식을 따르는지 확인하여 해결해야 합니다.
AppMaster: Golang 기반 애플리케이션 개발 가속화
Go 모듈 및 종속성 관리 모범 사례를 일일 워크플로에 통합하는 것은 유지 관리 및 확장 가능한 Golang 기반 소프트웨어 프로젝트를 보장하는 데 중요합니다. 하지만 Golang의 기능을 활용하면서 전체 애플리케이션 개발 프로세스를 가속화할 수 있다면 어떨까요?
시각적 개발 환경을 사용하여 Golang 기반 백엔드 애플리케이션 생성에 중점을 둔 포괄적인 코드 없는 플랫폼인 AppMaster.io를 시작하십시오. 백엔드 애플리케이션 외에도 AppMaster 사용하면 개발 프로세스를 간소화하도록 설계된 통합 접근 방식을 사용하여 웹 및 모바일 애플리케이션을 만들 수 있습니다.
AppMaster 통해 사용자는 시각적 UI를 통해 데이터 모델 (데이터베이스 스키마)을 생성하고, 비즈니스 프로세스를 설계하고, REST API 및 WebSocket endpoints 정의할 수 있습니다. 웹 애플리케이션은 완전한 대화형 사용자 경험을 위해 웹 비즈니스 프로세스 디자이너와 함께 끌어서 놓기 인터페이스를 사용하여 생성됩니다. 모바일 애플리케이션은 모바일 비즈니스 프로세스 디자이너 및 UI 디자인 기능을 사용하여 유사하게 디자인됩니다.
AppMaster 의 플랫폼은 청사진을 가져오고 '게시' 버튼을 누르면 애플리케이션에 대한 소스 코드를 생성합니다. 애플리케이션을 컴파일하고, 테스트를 실행하고, Docker 컨테이너 (백엔드 애플리케이션용)에 압축하고, 모든 것을 클라우드에 배포합니다. 이 모든 작업이 몇 초 만에 이루어집니다.
백엔드 애플리케이션은 Golang(Go)을 사용하여 생성되며 Golang이 제공하는 성능, 단순성 및 유지 관리의 이점을 활용합니다. 웹 애플리케이션은 Vue3 프레임워크와 JavaScript/TypeScript를 사용하여 생성되는 반면, 모바일 애플리케이션은 AppMaster 서버 기반 프레임워크, Android용 Kotlin 및 Jetpack Compose, iOS 애플리케이션용 SwiftUI 사용합니다.
강력한 AppMaster 플랫폼 덕분에 코딩 경험이 없는 사람도 서버 백엔드, 웹사이트, 고객 포털 및 기본 모바일 애플리케이션을 포함하는 완벽하고 확장 가능한 소프트웨어 솔루션을 만들 수 있습니다. AppMaster 전체 소프트웨어 개발 프로세스의 속도를 높일 뿐만 아니라 요구 사항이 수정될 때마다 처음부터 애플리케이션을 생성하여 기술적 부채를 완전히 제거합니다.
소프트웨어 개발 요구 사항을 위해 no-code 플랫폼, 특히 Golang의 이점을 활용하는 플랫폼을 채택하는 것을 고려하고 있다면 AppMaster 목록의 맨 위에 있어야 합니다. 무료 계정 에 가입하고 10배 더 빠르고 3배 더 비용 효율적인 솔루션으로 애플리케이션 개발의 미래를 탐색하십시오.