본문 바로가기
Programing/Go

golang 디렉토리 기본 구조

by 멍멍돌이야 2024. 6. 13.
반응형

Go 언어(Golang)에서 디렉토리 구조를 설계할 때는 프로젝트의 크기와 복잡도, 팀의 작업 방식 등을 고려해야 합니다. 일반적으로 다음과 같은 가이드라인을 따를 수 있습니다.

 

1. 기본 구조

초기에는 간단한 프로젝트 구조로 시작할 수 있습니다. 예를 들어:
myproject/
├── main.go
├── go.mod
└── go.sum

 

2. 기능별로 디렉토리 분리

프로젝트가 커지면, 기능별로 코드를 모듈화하여 디렉토리로 분리합니다:

myproject/
├── cmd/
│   └── myapp/
│       └── main.go
├── pkg/
│   ├── foo/
│   │   ├── foo.go
│   │   └── foo_test.go
│   └── bar/
│       ├── bar.go
│       └── bar_test.go
├── internal/
│   ├── api/
│   │   ├── api.go
│   │   └── api_test.go
│   └── db/
│       ├── db.go
│       └── db_test.go
├── go.mod
└── go.sum
 

 

3. 표준 디렉토리

Go 커뮤니티에서 자주 사용하는 표준 디렉토리 구조는 다음과 같습니다.

myproject/
├── cmd/                // 애플리케이션의 엔트리 포인트
│   └── myapp/
│       └── main.go
├── pkg/                // 외부 패키지들이 참조할 수 있는 라이브러리 코드
├── internal/           // 내부 패키지 (외부에 노출되지 않음)
│   ├── api/
│   └── db/
├── api/                // API 인터페이스 코드
├── web/                // 웹 애플리케이션 관련 코드
├── scripts/            // 빌드, 배포 스크립트
├── configs/            // 설정 파일들
├── docs/               // 프로젝트 문서
├── test/               // 테스트 코드
│   ├── integration/
│   └── unit/
├── go.mod
└── go.sum

 

4. 패키지 분리 기준

패키지를 분리할 때는 다음 기준을 참고합니다:

  • 재사용성: 여러 곳에서 사용할 수 있는 기능은 별도의 패키지로 분리합니다.
  • 응집성: 관련된 기능들은 하나의 패키지로 묶습니다.
  • 의존성 관리: 내부 패키지(internal)를 사용하여 외부 노출을 제어합니다.

 

5. 실제 예시

예를 들어, 웹 애플리케이션 프로젝트라면 다음과 같은 구조를 가질 수 있습니다:

mywebapp/
├── cmd/
│   └── server/
│       └── main.go
├── internal/
│   ├── handlers/
│   │   ├── user.go
│   │   └── user_test.go
│   └── middleware/
│       ├── auth.go
│       └── auth_test.go
├── pkg/
│   ├── config/
│   │   ├── config.go
│   │   └── config_test.go
│   └── logger/
│       ├── logger.go
│       └── logger_test.go
├── web/
│   ├── static/
│   └── templates/
├── go.mod
└── go.sum

 

이와 같은 구조를 통해 코드의 유지보수성과 확장성을 높일 수 있습니다. 초기에는 간단하게 시작하고, 프로젝트가 성장함에 따라 필요에 따라 디렉토리를 분리하고 구조를 확장해 나가는 것이 좋습니다.

728x90
반응형

댓글