패키지 구조

지금까지 우리는 하나의 파일 안에서 모든 코드를 작성했습니다. 하지만 기억하시나요? 우리가 매번 코드 맨 위에 적었던 package main을요.

Go는 처음부터 패키지를 강제하는 언어입니다. 파일이 하나여도 반드시 패키지 선언이 있어야 합니다. 이제 그 이유와 의미를 제대로 알아봅시다.


package main의 의미

package main

이 한 줄은 “이 파일은 main 패키지에 속합니다”라는 뜻입니다.

Go에서 main 패키지는 특별합니다. Go가 프로그램을 실행할 때, main 패키지에서 main() 함수를 찾아서 시작합니다. 프로그램의 “정문”인 셈이죠.

package main

func main() {
    // 여기서부터 프로그램이 시작됩니다
}

import의 의미

우리가 fmt.Println()을 사용할 때마다 적었던 import "fmt"도 이제 이해할 수 있습니다.

import "fmt"

fmt는 Go가 미리 만들어 놓은 표준 패키지 중 하나입니다. 출력, 입력, 문자열 포맷팅 등을 도와주는 도구 상자죠.

import는 “이 패키지를 가져다 쓰겠습니다”라는 뜻입니다.

여러 패키지를 동시에 가져올 수도 있습니다:

import (
    "fmt"
    "math"
    "strings"
)

GoLand에서는 사용하는 패키지를 자동으로 import 해주고, 사용하지 않는 import는 자동으로 삭제해줍니다!


나만의 패키지 만들기

프로그램이 커지면, 코드를 여러 패키지로 나눌 수 있습니다.

my_project/
├── go.mod              ← 프로젝트 설정 파일
├── main.go             ← main 패키지 (시작점)
├── calculator/
│   └── calc.go         ← calculator 패키지
└── greeting/
    └── hello.go        ← greeting 패키지

calculator/calc.go 파일:

package calculator

func Add(a int, b int) int {
    return a + b
}

여기서 중요한 규칙이 있습니다: 함수 이름이 대문자로 시작하면 다른 패키지에서 사용할 수 있습니다.

  • Add → 다른 패키지에서 사용 가능 (공개)
  • add → 같은 패키지에서만 사용 가능 (비공개)

이것이 Go만의 독특한 방식입니다. 다른 언어들은 public, private 같은 키워드를 쓰지만, Go는 대소문자로 결정합니다.

main.go에서 사용하기:

package main

import (
    "fmt"
    "my_project/calculator"
)

func main() {
    result := calculator.Add(3, 5)
    fmt.Println(result) // 8
}

go.mod 파일

Go 프로젝트의 시작점은 go.mod 파일입니다. 이 파일이 “이것은 하나의 Go 프로젝트입니다”라고 선언합니다.

module my_project

go 1.21
  • module: 이 프로젝트의 이름 (패키지를 import할 때 사용)
  • go 1.21: 사용하는 Go 버전

GoLand에서 새 프로젝트를 만들면 자동으로 생성됩니다.


Go의 표준 패키지

Go는 아주 풍부한 표준 패키지를 제공합니다:

패키지설명
fmt출력, 입력, 포맷팅
math수학 함수
strings문자열 처리
os운영체제 관련 기능
net/http웹 서버, HTTP 통신
encoding/jsonJSON 데이터 처리

이 표준 패키지만으로도 웹 서버를 만들 수 있다는 것이 Go의 큰 강점입니다.


실제 프로젝트는 이렇게 생겼습니다

my_api/
├── go.mod
├── main.go                  ← 프로그램 시작점
├── handler/                 ← 요청을 처리하는 코드
│   ├── user.go
│   └── product.go
├── model/                   ← 데이터 구조 정의
│   ├── user.go
│   └── product.go
└── util/                    ← 도구 모음
    └── helper.go

이렇게 역할별로 패키지를 나누면, “유저 요청 처리는 handler 패키지에, 데이터 구조는 model 패키지에 있겠구나!” 하고 바로 찾을 수 있습니다.


외부 패키지 사용하기

다른 개발자가 만든 패키지도 가져다 쓸 수 있습니다. 터미널에서:

go get github.com/gin-gonic/gin

이렇게 하면 go.mod에 자동으로 추가되고, 코드에서 바로 사용할 수 있습니다.


정리하자면:

  • package main = 프로그램의 시작점
  • import = 다른 패키지를 가져다 쓰기
  • 대문자 시작 = 다른 패키지에서 사용 가능 (Go만의 규칙)
  • go.mod = 프로젝트의 설정 파일
  • go get = 외부 패키지를 설치하는 명령어

Go의 패키지 시스템은 단순하면서도 강력합니다. 이 규칙을 알고 나면, Go로 무엇이든 만들 준비가 된 것입니다!