project
Go 모듈과 패키지 관리 이해하기 – 실전 프로젝트 구조의 시작
octo54
2025. 4. 2. 13:06
반응형
Go 모듈과 패키지 관리 이해하기 – 실전 프로젝트 구조의 시작
Go는 모듈 기반 프로젝트 구조를 지원합니다. 이는 외부 라이브러리 관리뿐 아니라 대규모 프로젝트에서의 패키지 구조화에 필수입니다.
이 글에서는 Go 모듈 시스템의 이해부터, 실무에서 자주 쓰는 패키지 구조 분리 방법까지 안내합니다.
✅ 1. Go Modules란?
Go 1.11부터 도입된 Go Modules는 패키지 버전 관리 시스템입니다.
이전의 GOPATH 방식보다 훨씬 편리하며, 요즘 대부분의 Go 프로젝트는 Go Modules를 사용합니다.
🔧 모듈 초기화
go mod init github.com/yourname/go-admin-api
📁 go.mod 파일 예시
module github.com/yourname/go-admin-api
go 1.21
require (
github.com/gorilla/mux v1.8.0
gorm.io/gorm v1.25.4
)
🔍 외부 패키지 설치
go get github.com/gorilla/mux
✅ 2. Go 프로젝트 기본 디렉토리 구조
반응형
go-admin-api/
├── cmd/ # main.go 위치
├── internal/ # 내부 도메인 로직 (Handler, Service 등)
│ ├── user/
│ │ ├── handler.go
│ │ ├── service.go
│ │ └── repository.go
├── config/ # 환경 설정
├── pkg/ # 외부로 노출 가능한 공통 유틸
├── models/ # DB 모델 정의
├── router/ # 라우팅 설정
└── go.mod
💡 internal/과 pkg/ 디렉토리 구분은 관습적입니다. 외부 노출 여부에 따라 구분하며, internal은 외부에서 import 불가능합니다.
✅ 3. 패키지로 파일 분리하는 이유
- 책임 분리 (Separation of Concern)
- 예: handler → HTTP 처리 / service → 비즈니스 로직 / repository → DB 처리
- 유지보수 용이
- 기능이 많아질수록 파일 크기가 커지므로 역할 단위로 분리 필요
- 테스트 및 재사용성 향상
- 서비스 로직과 핸들러를 분리하면 단위 테스트 작성이 쉬움
✅ 4. 실전 예시: 유저 도메인 분리
📁 internal/user/handler.go
func GetUsers(w http.ResponseWriter, r *http.Request) {
users, err := service.GetAllUsers()
if err != nil {
http.Error(w, "error", http.StatusInternalServerError)
return
}
json.NewEncoder(w).Encode(users)
}
📁 internal/user/service.go
func GetAllUsers() ([]models.User, error) {
return repository.FetchUsers()
}
📁 internal/user/repository.go
func FetchUsers() ([]models.User, error) {
var users []models.User
result := db.Find(&users)
return users, result.Error
}
✅ 5. 실전 팁: go mod tidy를 습관화
go mod tidy
- 사용하지 않는 모듈 삭제
- 필요한 의존성 자동 추가
✅ 마무리
Go Modules는 Go 프로젝트 관리의 필수 요소입니다.
여기까지 구조화하면, 이후 라우팅, DB, 인증 등의 기능을 추가할 준비가 끝난 셈입니다.
다음 글에서는 net/http를 활용한 간단한 REST API 서버 구현을 다루겠습니다.