Go는 패키지(package)(디렉터리 안의 소스 파일 모음)와 모듈(module)(버전 관리된 의존성을 가진 패키지 모음)로 코드를 구성합니다. 둘이 함께 프로젝트를 구조화하고 의존성을 관리합니다.
패키지 — 관련 코드의 디렉터리
go
main
mathutil
{ a + b }
{}
한 디렉터리의 모든 파일은 하나의 패키지에 속합니다. 대문자 표기가 가시성을 제어합니다: 대문자 이름은 공개(패키지 간 public), 소문자는 패키지 전용입니다.
import (
"fmt" // 표준 라이브러리
"strings"
"github.com/user/repo/mathutil" // 서드파티 또는 로컬 모듈 패키지
)
fmt.Println(strings.ToUpper("hi"))
mathutil.Add(2, 3) // package.Name 으로 공개 이름 사용
go mod init github.com/user/myapp # 모듈 생성 → go.mod 생성
go get github.com/gin-gonic/gin # 의존성 추가(go.mod에 기록)
go mod tidy # 누락 추가 & 미사용 제거
go build # 모듈의 의존성으로 빌드
go.mod — 모듈 경로, Go 버전, 직접 의존성(+ 버전)을 선언
go.sum — 의존성의 암호학적 체크섬(무결성/보안)
모듈(Go 1.11에서 도입)은 의존성 관리의 단위입니다 — go.mod가 정확한 의존성 버전을 나열하여 빌드를 재현 가능하게 만듭니다. go.sum은 의존성 무결성을 검증합니다.
package main
func init() { // 패키지 로드 시 자동 실행(main 이전)
// 설정
}
func main() { // 실행 파일의 진입점(package main만)
}
myapp/
go.mod
main.go package main
internal/ 여기의 패키지는 이 모듈 전용(외부에서 임포트 불가)
pkg/ 또는 기타 디렉터리/ 재사용 가능한 패키지
internal/ 디렉터리는 특별합니다 — 그 안의 패키지는 같은 모듈 내에서만 임포트할 수 있어, 모듈 수준에서 캡슐화를 강제합니다.
패키지와 모듈은 Go 프로젝트가 구조화되고 의존성이 관리되는 방식입니다 — 실제 프로젝트에 필수적입니다.
패키지(파일들의 디렉터리, 대문자 기반 공개/비공개 가시성, 특별한 main 패키지)를 이해하는 것은 코드를 구성하고 공개 API를 제어하는 데 기본입니다.
모듈(go mod, go.mod/go.sum)은 재현 가능하고 버전 관리되며 무결성이 검증된 의존성 관리를 제공합니다 — 예전 GOPATH 방식을 대체한 현대 표준입니다.
임포트 시스템, 모듈 전용 코드를 위한 internal/ 관례, 도구(go mod init/tidy, go get)를 아는 것은 Go 프로젝트를 빌드, 공유, 유지보수하는 데 필요하며 Go 생태계에 대한 실무적 능숙함을 반영합니다.