티스토리 뷰

반응형

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. 패키지로 파일 분리하는 이유

  1. 책임 분리 (Separation of Concern)
    • 예: handler → HTTP 처리 / service → 비즈니스 로직 / repository → DB 처리
  2. 유지보수 용이
    • 기능이 많아질수록 파일 크기가 커지므로 역할 단위로 분리 필요
  3. 테스트 및 재사용성 향상
    • 서비스 로직과 핸들러를 분리하면 단위 테스트 작성이 쉬움

✅ 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 서버 구현을 다루겠습니다.


 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함
반응형