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 패키지의 특징

  1. 소문자로 시작하는 식별자(함수, 변수 등)는 패키지 내부에서만 접근 가능 (비공개)
  2. 대문자로 시작하는 식별자는 외부에서 접근 가능 (공개)
  3. 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 모듈의 장점

  1. 프로젝트별 의존성 분리: 다른 프로젝트 간 라이브러리 버전 충돌이 줄어든다.
  2. 버전 명시적 관리: go.mod 파일에 정확한 버전을 기록해, 재현 가능성(Reproducibility)을 보장한다.
  3. VCS(버전 관리 시스템)와 통합: GitHub, GitLab 등의 리포지토리를 바로 모듈 경로로 사용 가능.

2.3 모듈 사용 예시

  1. 모듈 초기화위 명령어를 실행하면 현재 디렉터리에 go.mod 파일이 생성된다.
  2. go mod init myproject
  3. 의존성 추가의존성 라이브러리를 설치하면 go.mod와 go.sum 파일이 자동 업데이트된다.
  4. go get github.com/some/dependency@v1.2.3
  5. 빌드/테스트모듈 환경에서 자동으로 의존성을 불러와 빌드와 테스트를 진행한다.
  6. 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 워크스페이스 사용 시나리오

  1. 로컬에서 동시 개발:
    • A 모듈이 B 모듈에 의존하고 있는데, B 모듈을 로컬에서 수정하면서 A 모듈을 테스트하고 싶을 때
    • 예전에는 B 모듈을 별도로 버전 태깅 후 다시 go get 해야 했지만, 워크스페이스를 사용하면 로컬 경로를 그대로 참조 가능
  2. 의존성 충돌 해결:
    • 여러 프로젝트가 같은 의존성 라이브러리에 의존하되, 서로 다른 버전을 쓰고 있는 상황에서, 로컬에서 직접 테스트하며 버전을 맞춰볼 수 있음
  3. 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. 종합 정리

  1. 패키지(Package)
    • Go 코드의 논리적/물리적 묶음
    • package 키워드로 정의, 같은 디렉터리 내 소스 파일은 같은 패키지
  2. 모듈(Module)
    • Go 1.11부터 도입된 의존성 관리 단위
    • go.mod 파일을 통해 버전, 의존성 정보 관리
    • 프로젝트별 독립적인 버전 관리를 가능하게 함
  3. 워크스페이스(Workspace)
    • Go 1.18부터 지원되는 기능
    • 여러 모듈을 하나로 묶어 개발, 로컬 의존성 수정 시 편리
    • go work 명령어로 go.work 파일 생성

이 세 가지 개념은 서로 계층적으로 얽혀 있다. **“패키지”**는 가장 작은 코드 묶음, **“모듈”**은 패키지들의 모음이자 의존성 관리 단위, 그리고 **“워크스페이스”**는 여러 모듈을 한 번에 다룰 수 있는 상위 개념이다.

최신 Go 환경에서는 모듈이 기본이며, 여러 모듈을 동시에 개발해야 할 경우 워크스페이스를 적극 활용해보자.


마무리

  • Go 패키지: 소스 파일을 묶는 가장 기본적인 단위
  • Go 모듈: 프로젝트 의존성을 명시적으로 관리하기 위한 단위 (Go 1.11+ 표준)
  • Go 워크스페이스: 여러 모듈을 동시에 개발할 수 있도록 도와주는 기능 (Go 1.18+)

이해하기 쉽게 요약하자면, “패키지 < 모듈 < 워크스페이스” 구조라고 볼 수 있다.

 


추가 참고 자료

728x90
반응형