소개
이 실습에서는 Go 에서 의존성을 관리하는 두 가지 방식인 GOPATH 와 Go 모듈 (Go Modules) 에 대해 알아봅니다. 이는 Go 프로젝트를 효과적으로 구성하고 관리하는 데 필수적인 개념입니다.
학습 포인트:
- GOPATH
- GOROOT
- Go 모듈
이 실습에서는 Go 에서 의존성을 관리하는 두 가지 방식인 GOPATH 와 Go 모듈 (Go Modules) 에 대해 알아봅니다. 이는 Go 프로젝트를 효과적으로 구성하고 관리하는 데 필수적인 개념입니다.
학습 포인트:
이 단계에서는 제공된 압축 파일을 해제하여 실습 환경을 준비합니다.
먼저 터미널을 열고 다음 명령어를 입력하여 프로젝트 디렉터리로 이동합니다.
cd ~/project
현재 디렉터리에 있는 helloWorld.tar.gz 파일의 압축을 풉니다.
tar -xzf helloWorld.tar.gz
압축 해제가 완료되면 helloWorld 폴더가 생성되었는지 확인합니다.
ls helloWorld
압축이 정상적으로 해제되었다면 helloWorld 디렉터리의 내용이 표시됩니다.
Go 1.11 버전 이전에는 모든 Go 코드를 저장하기 위해 GOPATH라고 불리는 특정 작업 공간을 사용했습니다. 이 단계에서는 GOPATH 가 어떻게 작동하는지 이해해 봅니다.
GOROOT는 Go 가 설치된 디렉터리로, Go 도구들과 표준 라이브러리 패키지들이 포함되어 있습니다.GOPATH는 사용자의 개인 Go 코드가 머무는 곳으로, 다음 세 개의 디렉터리를 포함합니다.
현재 설정된 GOPATH와 GOROOT를 확인하려면 다음 명령어를 실행하세요.
## GOPATH 디렉터리 확인
go env | grep GOPATH
## GOROOT 디렉터리 확인
go env | grep GOROOT
이 명령어들은 현재 시스템에 설정된 GOPATH와 GOROOT 경로를 보여줍니다.
Go 1.11 에서 도입되고 Go 1.13 부터 기본으로 활성화된 Go 모듈은 다음과 같은 두 가지 주요 문제를 해결하기 위해 만들어졌습니다.
GOPATH/src 디렉터리 내부에 두어야 했습니다. Go 모듈을 사용하면 시스템의 어느 곳에나 코드를 저장할 수 있습니다.이 단계에서는 새 프로젝트를 위한 Go 모듈을 초기화해 보겠습니다.
testHello라는 이름의 새 프로젝트 디렉터리를 생성합니다.
cd ~/project
mkdir testHello
testHello 디렉터리로 이동합니다.
cd testHello
이 프로젝트를 위한 Go 모듈을 초기화합니다.
go mod init testHello
출력 결과는 다음과 같아야 합니다.
go: creating new go.mod: module testHello
testHello 폴더 안에 다음과 같은 내용으로 testHello.go 파일을 생성합니다.
touch testHello.go
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
이제 Go 모듈을 사용하여 testHello 프로젝트를 초기화하고 간단한 Go 프로그램을 추가했습니다.
이 단계에서는 Go 프로젝트에서 다른 모듈을 가져와 사용하는 방법을 시연합니다.
helloWorld 폴더의 helloWorld 패키지는 이미 Go 모듈로 초기화되어 있습니다. 마찬가지로 Go 모듈을 사용하는 test 패키지는 helloWorld 패키지의 Say 함수를 임포트합니다.
이를 확인하기 위해 다음 과정을 수행하세요.
먼저 helloWorld와 test 디렉터리의 구조를 살펴봅니다.
helloWorld
├── go.mod
└── helloWorld.go
test
├── go.mod
└── test.go
다음으로 test/go.mod 파일을 엽니다. 다음과 같은 내용을 확인할 수 있습니다.
module test
go 1.15
require "helloWorld" v0.0.1
replace "helloWorld" => "../helloWorld"
replace 지시어는 Go 에게 외부 저장소에서 패키지를 가져오는 대신 로컬 경로인 ../helloWorld를 사용하도록 지시합니다. require 지시어는 test 패키지가 helloWorld 패키지의 v0.0.1 버전에 의존하고 있음을 명시합니다.
| 파라미터 | 설명 |
|---|---|
| module | 패키지 이름을 지정합니다 |
| require | 의존성 패키지를 지정합니다 |
| replace | 의존성 경로를 교체합니다 |
| exclude | 의존성에서 제외합니다 |
test 패키지의 test.go 파일을 실행해 봅니다.
cd ~/project/test
go run test.go
출력 결과는 다음과 같아야 합니다.
hello, world
Go 에서는 원격 패키지를 쉽게 임포트할 수 있습니다. GitHub 에 있는 원격 패키지를 사용하여 이를 확인해 보겠습니다.
remoteModule 디렉터리를 생성합니다.
cd ~/project
mkdir remoteModule
cd remoteModule
Go 모듈을 초기화합니다.
go mod init remoteModule
remoteModule 폴더 안에 다음과 같은 내용으로 remote.go 파일을 생성합니다.
touch remote.go
package main
import (
"github.com/labex-labs/golang-dev-code/chap02module"
)
func main() {
chap02module.StringTobase64("miiy")
}
이 프로그램은 GitHub 에서 chap02module 패키지를 임포트하고 해당 패키지의 StringTobase64 함수를 사용합니다.
다음 명령어들을 사용하여 remote.go 파일을 실행합니다.
go get github.com/labex-labs/golang-dev-code/chap02module
go run -v remote.go
팁: 무료 사용자는 외부 인터넷 접속이 제한되어 이 명령어를 실행할 수 없습니다. 인터넷 접속이 필요한 경우 Pro 플랜으로 업그레이드하세요.
go get 명령어는 GitHub 에서 chap02module 패키지를 다운로드하여 모듈 캐시에 저장합니다. 다운로드가 완료되면 go run 명령어가 프로그램을 실행합니다.
이 단계에서는 원격 모듈의 Hello 함수를 사용하는 새 파일을 만들어 학습한 내용을 테스트해 봅니다.
remoteModule2 폴더를 생성합니다.
cd ~/project
mkdir remoteModule2
cd remoteModule2
Go 모듈을 초기화합니다.
go mod init remoteModule2
다음과 같은 내용으로 remote2.go 파일을 생성합니다.
touch remote2.go
package main
import (
"github.com/labex-labs/golang-dev-code/chap02module"
)
func main() {
chap02module.Hello()
}
프로그램을 실행합니다.
go get github.com/labex-labs/golang-dev-code/chap02module
go run remote2.go
출력 결과는 다음과 같아야 합니다.
hello
이 실습을 통해 다음 내용을 학습했습니다.
GOPATH와 GOROOT 디렉터리의 의미와 용도이제 Go 프로젝트에서 Go 모듈을 사용하여 의존성을 능숙하게 관리할 수 있을 것입니다.