programming/golang
Go 개발 환경 정복하기: 패키지, 모듈, 그리고 워크스페이스
jamie91
2025. 3. 10. 11:30
Go 언어를 사용해 프로젝트를 진행하다 보면, 패키지, 모듈, 그리고 워크스페이스라는 개념을 자주 접하게 된다.
이 글에서는 이 세 가지 개념을 각각 살펴보고, 최신 Go 개발 환경에서 어떻게 사용하는지 간단히 정리해보자.
1. Go 패키지(Package)
1.1 패키지란?
- Go에서 **패키지(package)**는 코드의 물리적, 논리적 묶음을 의미한다.
- 모든 Go 소스 파일은 반드시 package 키워드로 시작하며, 같은 디렉터리에 있는 소스 파일들은 같은 패키지로 묶인다.
// mypackage.go
package mypackage
func Hello() {
println("Hello from mypackage!")
}
1.2 패키지의 특징
- 소문자로 시작하는 식별자(함수, 변수 등)는 패키지 내부에서만 접근 가능 (비공개)
- 대문자로 시작하는 식별자는 외부에서 접근 가능 (공개)
- package main은 **프로그램의 시작점(엔트리 포인트)**을 가진 패키지이며, func main() 함수가 실행된다.
1.3 패키지 사용 예시
package main
import "myproject/mypackage"
func main() {
mypackage.Hello()
}
위와 같이 import 구문을 통해 원하는 패키지를 가져와 사용할 수 있다.
2. Go 모듈(Module)
2.1 모듈이란?
- *Go 모듈(module)**은 패키지들의 집합을 의미하며, Go 1.11부터 도입된 의존성 관리 방식이다.
- 기존에 사용되던 GOPATH 기반의 의존성 관리를 대체하여, 프로젝트별로 독립적인 의존성을 관리할 수 있도록 해준다.
- 모듈의 루트 디렉터리에는 go.mod 파일이 위치하며, 해당 파일에는 모듈의 경로, 의존성 정보 등이 기록된다.
module myproject
go 1.20
require (
github.com/some/dependency v1.2.3
)
2.2 모듈의 장점
- 프로젝트별 의존성 분리: 다른 프로젝트 간 라이브러리 버전 충돌이 줄어든다.
- 버전 명시적 관리: go.mod 파일에 정확한 버전을 기록해, 재현 가능성(Reproducibility)을 보장한다.
- VCS(버전 관리 시스템)와 통합: GitHub, GitLab 등의 리포지토리를 바로 모듈 경로로 사용 가능.
2.3 모듈 사용 예시
- 모듈 초기화위 명령어를 실행하면 현재 디렉터리에 go.mod 파일이 생성된다.
- go mod init myproject
- 의존성 추가의존성 라이브러리를 설치하면 go.mod와 go.sum 파일이 자동 업데이트된다.
- go get github.com/some/dependency@v1.2.3
- 빌드/테스트모듈 환경에서 자동으로 의존성을 불러와 빌드와 테스트를 진행한다.
- go build go test
3. Go 워크스페이스(Workspace)
3.1 워크스페이스란?
- *Go 워크스페이스(workspace)**는 여러 개의 모듈을 동시에 개발하거나, 의존성 모듈을 로컬에서 직접 수정해야 할 때 유용한 기능이다.
- Go 1.18부터 도입된 go work 명령어를 사용해, 여러 모듈을 하나의 워크스페이스로 묶을 수 있다.
- 워크스페이스 루트 디렉터리에는 go.work 파일이 생성되며, 내부에 여러 모듈의 경로가 정의된다.
go work init ./myproject ./anotherproject
위 명령을 실행하면 다음과 같은 go.work 파일이 생성된다:
go 1.20
use (
./myproject
./anotherproject
)
3.2 워크스페이스 사용 시나리오
- 로컬에서 동시 개발:
- A 모듈이 B 모듈에 의존하고 있는데, B 모듈을 로컬에서 수정하면서 A 모듈을 테스트하고 싶을 때
- 예전에는 B 모듈을 별도로 버전 태깅 후 다시 go get 해야 했지만, 워크스페이스를 사용하면 로컬 경로를 그대로 참조 가능
- 의존성 충돌 해결:
- 여러 프로젝트가 같은 의존성 라이브러리에 의존하되, 서로 다른 버전을 쓰고 있는 상황에서, 로컬에서 직접 테스트하며 버전을 맞춰볼 수 있음
- Monorepo 방식:
- 대규모 프로젝트를 한 리포지토리에 모듈별로 분리하여 관리할 때, 워크스페이스로 쉽게 연결 가능
3.3 워크스페이스 예시 구조
myworkspace
├── go.work
├── myproject
│ ├── go.mod
│ ├── main.go
└── anotherproject
├── go.mod
├── main.go
- myworkspace/go.work 파일에는 use ( ./myproject ./anotherproject )처럼 여러 모듈을 참조
- myworkspace 디렉터리에서 go run, go build 등을 실행하면 워크스페이스 내 모든 모듈이 올바르게 인식된다.
4. 종합 정리
- 패키지(Package)
- Go 코드의 논리적/물리적 묶음
- package 키워드로 정의, 같은 디렉터리 내 소스 파일은 같은 패키지
- 모듈(Module)
- Go 1.11부터 도입된 의존성 관리 단위
- go.mod 파일을 통해 버전, 의존성 정보 관리
- 프로젝트별 독립적인 버전 관리를 가능하게 함
- 워크스페이스(Workspace)
- Go 1.18부터 지원되는 기능
- 여러 모듈을 하나로 묶어 개발, 로컬 의존성 수정 시 편리
- go work 명령어로 go.work 파일 생성
이 세 가지 개념은 서로 계층적으로 얽혀 있다. **“패키지”**는 가장 작은 코드 묶음, **“모듈”**은 패키지들의 모음이자 의존성 관리 단위, 그리고 **“워크스페이스”**는 여러 모듈을 한 번에 다룰 수 있는 상위 개념이다.
최신 Go 환경에서는 모듈이 기본이며, 여러 모듈을 동시에 개발해야 할 경우 워크스페이스를 적극 활용해보자.
마무리
- Go 패키지: 소스 파일을 묶는 가장 기본적인 단위
- Go 모듈: 프로젝트 의존성을 명시적으로 관리하기 위한 단위 (Go 1.11+ 표준)
- Go 워크스페이스: 여러 모듈을 동시에 개발할 수 있도록 도와주는 기능 (Go 1.18+)
이해하기 쉽게 요약하자면, “패키지 < 모듈 < 워크스페이스” 구조라고 볼 수 있다.
추가 참고 자료
728x90
반응형