Go 모듈을 외부 의존성 없이 로컬에서만 사용하여 개발 프로젝트를 구성하는 방법을 단계별로 설명 합니다. 설명을 위한 예제에서는 로컬에 있는 ~/workspace 디렉토리 아래에 프로젝트 디렉토리를 만들어 개발을 진행 합니다.
1. Go 설치
시스템의 패키지 목록을 최신 상태로 업데이트 하고, Go를 설치 합니다. 그리고 설치가 정상적으로 되었는지 확인 하여 설치를 마무리 합니다.
user:~$ sudo add-apt-repository ppa:longsleep/golang-backports
user:~$ sudo apt update
user:~$ sudo apt install golang
user:~$ go version
2. 작업 디렉토리 생성
Go 개발을 위한 작업 공간 디렉토리인
~/workspace
를 생성합니다.
프로젝트는 Go 모듈을 사용합니다. 이 방법은 전통적인 GOPATH 구조보다 더 유연하게 프로젝트를 관리할 수 있습니다. 모듈 개념에 대한 상세한 내용은 프로젝트를 구성하면서 설명 하겠습니다.
user:~$ mkdir -p ~/workspace
3. Go 환경 설정
Go 개발에 필요한 환경 변수를 설정합니다. Go 모듈을 사용할 경우 GOPATH는 필수가 아니지만, 일부 도구나 패키지를 사용할 때 필요 할 수 있습니다.
~/.bashrc에 환경을 설정하여 재부팅시에도 설정이 시스템에 적용 될 수 있도록 합니다. 편집기로 설정파일 마지막에 Go 환경변수를 등록 합니다. 그리고 source 명령을 통해 .bashrc를 적용해 줍니다. 재부팅시에는 자동으로 적용 됩니다.
user:~$ vi ~/.bashrc
# Go Env variables
export GOPATH=$HOME/workspace
export PATH=$PATH:$GOPATH/bin
user:~$ source ~/.bashrc
- GOPATH는 Go 작업 공간의 경로를 지정합니다.
- GOPATH/bin을 PATH에 추가하면 Go로 설치한 바이너리를 터미널에서 직접 실행할 수 있습니다.
- apt로 설치한 Go의 바이너리는 이미 시스템 PATH에 포함되어 있을 가능성이 높습니다. 따라서 GOPATH/bin만 PATH에 추가하면 됩니다.
4. 프로젝트 구조 생성
Go 프로젝트를 위한 표준적인 디렉토리 구조를 생성합니다.
user:~$ mkdir -p ~/workspace/myapp/{bin,cmd,internal,pkg,configs,scripts}
- bin/: 빌드된 실행 파일을 저장하는 디렉토리입니다.
- cmd/: 애플리케이션의 진입점(예: main 패키지)을 저장합니다.
- internal/: 내부 패키지를 저장하며, 외부에서는 접근할 수 없습니다.
- pkg/: 재사용 가능한 패키지를 저장합니다.
- configs/: 설정 파일을 저장합니다.
- scripts/: 빌드, 배포 등 스크립트를 저장합니다.
5. Go 모듈 설정
Golang에서 module은 프로그램의 의존성을 관리하는 기본적인 단위입니다. 모듈 시스템은 Go 1.11에서 도입되어 이전의 GOPATH 기반 프로젝트 구조보다 훨씬 더 편리하고 강력한 의존성 관리 기능을 제공합니다. 모듈은 의존성 충돌을 방지하고, 버전을 지정하며, 여러 개발자가 동일한 코드베이스에서 일관성 있게 작업할 수 있도록 돕습니다.
* 모듈의 주요 개념
1. 모듈 (Module) : 모듈은 패키지 그룹을 포함하는 최상위 프로젝트 단위로, go.mod 파일을 통해 관리됩니다. 각 모듈은 고유한 경로와 버전을 가지며, 보통 버전 관리 시스템(Git)과 함께 사용됩니다.
2. go.mod 파일 : 모듈의 설정 및 의존성을 정의하는 파일입니다. Go 모듈을 생성하면 이 파일이 자동으로 생성되며, 해당 모듈의 이름, Go 버전, 의존하는 외부 패키지 및 버전 정보를 포함합니다.
3. go.sum 파일 : go.mod 파일의 의존성 해시값을 기록한 파일로, 의존성의 무결성을 확인하는 데 사용됩니다. 이 파일을 통해 의존성의 버전이 변경되지 않았음을 보장합니다.
4. 패키지 (Package) : 모듈 내부의 코드를 그룹화하는 단위입니다. 모듈은 여러 패키지를 포함할 수 있으며, 각 패키지는 별도의 폴더로 나뉩니다. 패키지를 가져오기(import)하여 다른 패키지나 모듈에서 사용할 수 있습니다.
외부(예: GitHub)를 사용하지 않고 로컬에서 모듈을 관리하는 방법으로 설명합니다. Go 모듈은 기본적으로 로컬 및 원격 모듈을 모두 지원하므로, 로컬 모듈을 사용하는 것은 매우 간단합니다.
프로젝트의 루트 디렉토리에서 Go 모듈을 초기화합니다. 이는 프로젝트 전체에서 사용할 모듈 경로를 설정합니다.
프로젝트의 루트 디렉토리에서 Go 모듈을 초기화합니다. 이는 프로젝트 전체에서 사용할 모듈 경로를 설정합니다.
user:~$ cd ~/workspace/myapp
user:~$ go mod init myapp
go.mod 파일이 프로젝트 루트(~/workspace/myapp/go.mod)에 생성됩니다.
6. 내부 패키지 생성
internal 디렉토리에 내부 패키지를 생성예제를 만들어 보겠습니다. 필요한 기능은 이 방법으로 생성하면 됩니다.
user:~$ mkdir -p internal/util
internal/util/util.go 파일 생성.
package util
import "fmt"
// SayHello prints a greeting message
func SayHello(name string) {
fmt.Printf("Hello, %s!\n", name)
}
7. 메인 패키지 생성
cmd/main.go 파일 생성.
package main
import "myapp/internal/util"
func main() {
util.SayHello("Go Developer")
}
import “myapp/internal/util”은 go.mod 파일에서 설정한 모듈 이름(myapp)을 기준으로 내부 패키지를 참조합니다. 모듈 초기화를 프로젝트 루트에서 했던 이유는 이것 때문 입니다.
8. 실행 및 컴파일
빌드 없이 프로그램을 즉시 실행할수 있습니다.
user:~$ cd ~/workspace/myapp
user:~/workspace/myapp$ go run ./cmd
프로그램을 컴파일 하여 빌드할수 있습니다. bin 디렉토리에 myapp 실행 바이러니가 생성 됩니다.
user:~/workspace/myapp$ go build -o bin/myapp ./cmd
빌드된 실행 파일을 실행할수 있습니다.
user:~/workspace/myapp$ bin/myapp
9. Makefile 사용
빌드, 테스트, 클린 등 다양한 작업을 자동화하기 위해 Makefile을 사용할 수 있습니다.
~/workspace/myapp/Makefile 생성
BINARY_NAME=myapp
BUILD_DIR=bin
.PHONY: all build run clean
all: build
build:
go build -o $(BUILD_DIR)/$(BINARY_NAME) ./cmd
run: build
$(BUILD_DIR)/$(BINARY_NAME)
clean:
rm -f $(BUILD_DIR)/$(BINARY_NAME)
* 사용 방법:
> 빌드: make build
> 실행: make run
> 클린: make clean