본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 프로젝트를 진행하기 위한 폴더 구조는 어떻게 구성하나요?

by 밝음의기둥 2025. 1. 22.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 프로젝트를 진행하기 위한 폴더 구조는 어떻게 구성하는지 간략히 알아보았습니다.


질문 >

Go 에서 프로젝트를 진행하기 위한 폴더 구조는 어떻게 구성하나요?

답변 >

Go에서 프로젝트를 구성할 때는 유지 보수성과 확장성을 고려한 폴더 구조를 설계하는 것이 중요합니다. 일반적으로 Go 커뮤니티에서 널리 사용되는 폴더 구조는 Go Modules를 활용하여 모듈화와 패키지 관리를 쉽게 합니다. 아래는 기본적인 폴더 구조와 각 디렉토리의 역할입니다.


1. Go 프로젝트 폴더 구조의 예

myproject/
├── cmd/
│   └── app/
│       ├── main.go
├── internal/
│   ├── service/
│   │   └── logic.go
│   ├── repository/
│   │   └── data_access.go
│   └── config/
│       └── config.go
├── pkg/
│   └── utils/
│       └── helper.go
├── api/
│   ├── v1/
│   │   └── api.proto
├── migrations/
│   └── 20250101_init.sql
├── scripts/
│   └── setup.sh
├── configs/
│   ├── config.yaml
├── build/
│   └── Dockerfile
├── tests/
│   ├── integration/
│   │   └── service_test.go
│   └── unit/
│       └── logic_test.go
├── vendor/
├── go.mod
├── go.sum
└── README.md


2. 각 디렉토리의 역할

2.1. cmd/

  • 애플리케이션의 진입점을 포함하는 디렉토리.
  • 각 실행 파일은 하위 디렉토리로 나누고, main.go를 포함.
  • 예:
    • cmd/app/main.go: 애플리케이션의 실행 로직.

2.2. internal/

  • 프로젝트 내부에서만 사용할 코드를 포함.
  • 외부 패키지가 이 코드를 임포트하지 못하도록 Go 컴파일러가 제한.
  • 서브 디렉토리 구조:
    • service/: 비즈니스 로직.
    • repository/: 데이터베이스 접근 레이어.
    • config/: 설정 관리 코드.

2.3. pkg/

  • 외부에서도 재사용 가능한 라이브러리를 포함.
  • 프로젝트 내부에서 뿐만 아니라 다른 프로젝트에서도 사용할 수 있는 유틸리티 코드를 작성.
  • 예:
    • pkg/utils/helper.go: 헬퍼 함수 모음.

2.4. api/

  • gRPC, REST API, 또는 OpenAPI와 관련된 파일을 포함.
  • 예:
    • api/v1/api.proto: Protocol Buffers 정의 파일.

2.5. migrations/

  • 데이터베이스 마이그레이션 스크립트를 저장.
  • 마이그레이션 도구(예: goose, golang-migrate)와 함께 사용.
  • 예:
    • migrations/20250101_init.sql: 초기 테이블 생성 스크립트.

2.6. scripts/

  • 프로젝트 빌드, 초기화, 배포를 자동화하는 스크립트.
  • 예:
    • scripts/setup.sh: 초기 설정 스크립트.

2.7. configs/

  • 설정 파일을 저장하는 디렉토리.
  • JSON, YAML, TOML 등 다양한 포맷으로 환경 설정 정보를 관리.
  • 예:
    • configs/config.yaml: 애플리케이션 설정.

2.8. build/

  • 배포 관련 파일.
  • Dockerfile, 패키징 스크립트 등을 포함.
  • 예:
    • build/Dockerfile: Docker 이미지 빌드 파일.

2.9. tests/

  • 통합 테스트와 단위 테스트를 포함.
  • 서브 디렉토리 구조:
    • tests/unit/: 단위 테스트.
    • tests/integration/: 통합 테스트.

2.10. vendor/

  • 외부 의존성을 저장하는 디렉토리.
  • go mod vendor 명령으로 생성되며, 의존성 고정 및 독립성을 위해 사용.

2.11. go.mod와 go.sum

  • go.mod: 프로젝트의 모듈 정의 및 의존성 관리.
  • go.sum: 의존성 체크섬 정보.

3. 프로젝트 폴더 구조 설계 시 고려 사항

  1. 모듈성과 캡슐화:
    • internal/을 활용하여 외부에 노출되지 않는 코드를 보호.
  2. 테스트 가능성:
    • tests/ 디렉토리를 활용해 체계적으로 테스트 작성.
  3. 재사용성:
    • 공통 유틸리티를 pkg/에 작성하여 다른 프로젝트에서도 사용 가능.
  4. 배포 준비:
    • build/와 scripts/ 디렉토리를 활용해 CI/CD를 지원.

4. 실제 적용 예

  • CLI 도구: 단일 실행 파일 프로젝트는 간소화된 구조 사용.
mycli/
├── cmd/
│   └── main.go
├── pkg/
│   └── utils.go
├── go.mod
├── go.sum
└── README.md

  • 웹 서버: 복잡한 애플리케이션은 완전한 폴더 구조 사용.
mywebapp/
├── cmd/
├── internal/
├── api/
├── configs/
├── build/
├── tests/
├── go.mod
└── README.md


5. 결론

Go 프로젝트의 폴더 구조는 프로젝트의 규모, 목적, 팀의 요구 사항에 따라 달라질 수 있습니다. 위에서 제안한 구조는 일반적으로 널리 사용되는 관례를 따르며, 이를 기반으로 프로젝트의 요구 사항에 맞게 커스터마이징하면 됩니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형