Go 핵심 명령어 마스터하기: run, build, install, get
Olivia Novak
Dev Intern · Leapcell

Go의 단순성과 효율성은 언어 설계뿐만 아니라 강력하고 직관적인 명령줄 도구에도 있습니다. 모든 Go 개발자에게 go run
, go build
, go install
, go get
에 대한 확실한 이해는 기본적인 것입니다. 이 명령어들은 빠른 프로토타이핑부터 배포 및 종속성 관리까지 Go 개발 워크플로우의 중추를 형성합니다. 실질적인 예제와 함께 각각을 자세히 살펴보겠습니다.
1. go run
: 빠른 프로토타이퍼
go run
명령어는 특히 개발 초기 단계와 빠른 스크립트 작성에서 Go 개발자들이 가장 자주 사용하는 명령어라고 할 수 있습니다. 이 명령어는 현재 디렉토리에 실행 파일을 생성하지 않고 지정된 Go 소스 파일을 컴파일하고 실행합니다. 따라서 빠른 반복 및 테스트에 매우 편리합니다.
작동 방식:
go run
을 실행하면 Go는 내부적으로 소스 코드를 임시 실행 파일로 컴파일한 다음 실행합니다. 완료 후 이 임시 실행 파일은 제거됩니다.
구문:
go run [빌드 플래그] [패키지]
일반적인 사용 사례:
- 간단한 스크립트 실행: 빠르고 일회성 작업 또는 작은 코드 조각 테스트.
- 빠른 프로토타이핑: 중간 단계의 바이너리 빌드 없이 코드 변경 사항의 즉각적인 출력을 보고 싶을 때.
예제 1: 단일 파일 실행
hello.go
라는 파일이 있다고 가정해 봅시다:
// hello.go package main import "fmt" func main() { fmt.Println("Hello Go World!") }
이 파일을 실행하려면 다음을 실행하면 됩니다:
go run hello.go
출력:
Hello Go World!
예제 2: 패키지의 여러 파일 실행
main
패키지가 여러 파일에 걸쳐 분할되어 있다면 go run
도 이를 처리할 수 있습니다.
main.go
와 util.go
가 같은 디렉토리에 있다고 가정해 봅시다:
// main.go package main import "fmt" func main() { fmt.Println("Result of calculation:", calculateSum(5, 3)) }
// util.go package main func calculateSum(a, b int) int { return a + b }
이 프로그램을 실행하려면:
go run main.go util.go
또는 현재 디렉토리의 main 패키지를 실행하는 더 관용적인 방법:
go run .
출력:
Result of calculation: 8
중요 참고 사항: go run
은 개발에 훌륭하지만, 영구적인 실행 파일을 생성하지 않기 때문에 배포 시나리오에는 적합하지 않습니다. 배포에는 go build
또는 go install
이 적절한 선택입니다.
2. go build
: 배포용 컴파일
go build
명령어는 Go 패키지와 종속성을 컴파일하는 데 사용됩니다. go run
과 달리 배포 및 독립적으로 실행할 수 있는 실행 가능한 바이너리 파일(또는 패키지 아카이브)을 생성합니다.
작동 방식:
go build
는 Go 소스 코드를 컴파일합니다. 패키지가 main
패키지인 경우 실행 파일을 생성합니다. 라이브러리 패키지인 경우 컴파일된 패키지 아카이브(예: .a
파일)를 빌드 캐시(일반적으로 GOCACHE
)에 캐싱하여 후속 빌드를 더 빠르게 만듭니다.
구문:
go build [빌드 플래그] [패키지]
일반적인 사용 사례:
- 실행 가능한 바이너리 생성: 애플리케이션 배포용.
- 크로스 컴파일: 다른 운영 체제 및 아키텍처용 바이너리 생성.
- 컴파일 테스트: 실제로 실행하지 않고 코드가 컴파일되는지 확인.
예제 1: 간단한 실행 파일 빌드
이전의 hello.go
를 사용하여:
// hello.go package main import "fmt" func main() { fmt.Println("Hello Go World!") }
실행 파일을 빌드하려면:
go build hello.go
이렇게 하면 현재 디렉토리에 hello
(Linux/macOS) 또는 hello.exe
(Windows)라는 실행 파일이 생성됩니다. 그런 다음 직접 실행할 수 있습니다:
./hello
출력:
Hello Go World!
예제 2: 출력 이름 지정 (-o
)
-o
플래그를 사용하여 출력 실행 파일의 이름을 지정할 수 있습니다.
go build -o myapp hello.go
이제 실행 파일의 이름은 myapp
입니다.
./myapp
출력:
Hello Go World!
예제 3: 크로스 컴파일
Go의 가장 강력한 기능 중 하나는 크로스 컴파일에 대한 내장 지원입니다. GOOS
및 GOARCH
환경 변수를 설정하여 다른 대상 플랫폼(OS 및 아키텍처)에 대한 바이너리를 쉽게 빌드할 수 있습니다.
macOS 머신에서 ARM 64비트 아키텍처(예: Raspberry Pi)의 Linux용 hello.go
를 빌드하려면:
GOOS=linux GOARCH=arm64 go build -o hello_linux_arm64 hello.go
이렇게 하면 Linux ARM64 시스템에서 실행할 수 있는 hello_linux_arm64
라는 실행 파일이 생성됩니다.
모듈 빌드:
Go 모듈 내에서 작업할 때 인수가 제공되지 않으면 go build
는 기본적으로 현재 디렉토리의 패키지를 빌드합니다.
# 모듈 루트에서 main.go가 있다고 가정 go build
이렇게 하면 현재 디렉토리의 main 패키지가 빌드되고 실행 파일이 현재 디렉토리에 배치됩니다.
3. go install
: 바이너리 및 패키지 설치
go install
명령어는 go build
와 유사하지만 중요한 차이점이 있습니다. 컴파일된 실행 파일 또는 패키지 아카이브를 Go 환경의 표준 위치, 특히 $GOPATH/bin
( $GOBIN
이 설정되지 않은 경우) 또는 GOBIN
환경 변수로 지정된 경로에 배치합니다. 이는 시스템의 PATH에 전역적으로 사용할 수 있도록 하고 싶은 명령줄 도구나 라이브러리를 설치하는 데 이상적입니다.
작동 방식:
go install
은 먼저 패키지를 컴파일합니다. main
패키지인 경우 결과 실행 바이너리를 GOBIN
디렉토리로 이동합니다. 라이브러리 패키지인 경우 컴파일된 패키지 아카이브를 Go 모듈 캐시 내의 pkg
디렉토리에 설치합니다.
구문:
go install [빌드 플래그] [패키지]
일반적인 사용 사례:
- 명령줄 도구 설치: Go 프로그램을 시스템 명령으로 사용하려는 경우(예:
golangci-lint
,delve
). - 전역 유틸리티 관리: 다양한 Go 기반 도구를 쉽게 액세스할 수 있도록 유지.
- 종속성 빌드 및 캐싱: 라이브러리 패키지의 경우
go install
은 후속go build
명령을 더 빠르게 만들기 위해 컴파일하고 캐싱합니다.
예제 1: 명령줄 도구 설치
greeter.go
라는 간단한 도구를 만들어 보겠습니다:
// greeter.go package main import ( "fmt" "os" ) func main() { if len(os.Args) < 2 { fmt.Println("Usage: greeter <name>") return } name := os.Args[1] fmt.Printf("Greetings, %s!\n", name) }
이 도구를 설치하려면:
go install greeter.go
설치 후 greeter
실행 파일은 $GOPATH/bin
또는 $GOBIN
디렉토리에 있게 됩니다. 이 디렉토리가 시스템의 PATH
에 포함되어 있는지 확인하십시오.
이제 터미널 어디에서나 실행할 수 있습니다:
greeter Alice
출력:
Greetings, Alice!
예제 2: 원격 저장소에서 설치 (Go 모듈)
Go 모듈을 사용하면 go install
은 외부 저장소에서 직접 GOBIN
으로 실행 파일을 설치하는 선호되는 방법입니다. 이를 통해 저장소를 수동으로 복제할 필요가 없습니다.
go install github.com/spf13/cobra@latest
이 명령은 cobra
모듈을 가져와 main 패키지를 컴파일하고 실행 파일(아마도 cobra
라고 함)을 GOBIN
디렉토리에 배치합니다. @latest
접미사는 Go에 최신 안정 버전 가져오기를 지시합니다. 특정 버전 태그(예: @v1.2.3
)를 지정할 수도 있습니다.
go build
와 go install
의 차이점:
go build
는 실행 파일을 현재 디렉토리(또는-o
로 지정됨)에 배치합니다.go install
은 실행 파일을$GOBIN
(또는$GOPATH/bin
)에 배치합니다.go install
은 컴파일된 패키지를 빌드 캐시에 설치하여 해당 패키지에 의존하는 후속go build
명령을 더 빠르게 만듭니다.
4. go get
: 종속성 관리 (레거시 및 최신)
Go 모듈 도입으로 go get
명령어는 크게 발전했습니다.
Go 모듈 이전 (GOPATH
모드):
이전 GOPATH
모드에서 go get
은 주로 원격 저장소에서 패키지를 $GOPATH/src
디렉토리로 다운로드하고 설치하는 데 사용되었습니다. 또한 종속성을 재귀적으로 다운로드하여 관리했습니다.
Go 모듈 사용 시 (최신 방식):
Go 모듈(Go 1.11에 도입, Go 1.16부터 기본값)을 사용하면 go get
의 역할이 변경되었습니다. 이제 주요 기능은 다음과 같습니다.
go.mod
파일에 종속성을 추가, 업그레이드 또는 다운그레이드합니다.go.mod
및go.sum
파일을 동기화합니다.
작동 방식 (Go 모듈):
모듈 내에서 go get
을 실행하면 go.mod
및 go.sum
파일을 원하는 종속성 버전으로 업데이트합니다. 그런 다음 필요한 모듈을 모듈 캐시(일반적으로 $GOPATH/pkg/mod
)로 가져옵니다. 후속 go build
, go run
또는 go test
명령은 이러한 캐시된 종속성을 자동으로 사용합니다.
구문:
go get [빌드 플래그] [패키지]
일반적인 사용 사례 (Go 모듈):
- 새 종속성 추가: 새로운 외부 패키지를 사용하려고 할 때.
- 종속성 업그레이드: 기존 패키지의 최신 호환 버전 가져오기.
- 종속성 다운그레이드: 이전 버전으로 되돌리기.
- 사용하지 않는 종속성 정리: 일반적으로
go mod tidy
로 처리됩니다.
예제 1: 새 종속성 추가
go mod init
으로 초기화된 Go 모듈이 있다고 가정합니다.
mkdir mymodule cd mymodule go mod init mymodule
이제 rsc.io/quote
와 같은 외부 라이브러리를 사용하는 main.go
를 만들어 보겠습니다.
// main.go package main import ( "fmt" "rsc.io/quote" // 이 종속성은 아직 go.mod에 없습니다. ) func main() { fmt.Println(quote.Go()) }
go run main.go
또는 go build
를 시도하면 Go는 누락된 종속성을 감지하고 go mod tidy
를 실행하거나 자동으로 go get
을 시도하도록 안내합니다.
명시적으로 추가(및 가져오기)하려면:
go get rsc.io/quote
이 명령 후 go.mod
파일이 업데이트되어 다음과 같이 보일 것입니다.
module mymodule go 1.22 require rsc.io/quote v1.5.0 // 또는 유사한 버전
그런 다음 go.sum
파일이 암호화된 체크섬으로 생성/업데이트됩니다. 이제 프로그램을 실행할 수 있습니다:
go run main.go
출력:
Don't communicate by passing memory, share memory by communicating.
예제 2: 종속성 업그레이드
기존 종속성을 최신 호환 버전으로 업그레이드하려면:
go get rsc.io/quote@latest
이렇게 하면 go.mod
및 go.sum
파일이 최신 안정 릴리스를 가리키도록 업데이트됩니다.
예제 3: 종속성 다운그레이드 또는 버전 지정
특정 버전이 필요한 경우:
go get rsc.io/quote@v1.5.2
go get
과 go install
에 대한 참고 사항:
앞서 언급했듯이 go install
은 명령줄 도구를 "가져와 설치"하는 데 선호되는 방법입니다. 이전에는 go get
도 이 작업을 수행할 수 있었지만(특히 GOPATH
모드에서), go install
은 모호성이 적고 도구 설치를 위해 모듈 시스템과 더 잘 통합됩니다.
예를 들어 delve
(Go 디버거)를 설치하려면:
go install github.com/go-delve/delve/cmd/dlv@latest
이는 go get github.com/go-delve/delve/cmd/dlv
보다 일반적으로 선호됩니다.
결론
go run
, go build
, go install
, go get
명령어는 Go 개발 도구 모음의 기둥입니다.
- 빠른 실행 및 개발 반복에는
go run
을 사용합니다. - 애플리케이션용 배포 가능한 실행 파일을 만들려면
go build
를 사용합니다. - Go 프로그램을 시스템 전체 도구로 설치하거나 라이브러리 패키지를 캐싱하려면
go install
을 사용합니다. - 정확한 버전과 재현 가능한 빌드를 보장하면서 프로젝트의 종속성을 관리하려면
go get
(Go 모듈 내에서)을 사용합니다.
이러한 명령어를 숙달하면 Go 개발자는 첫 번째 코드 작성부터 강력한 애플리케이션 배포까지 프로젝트를 효율적으로 관리할 수 있습니다. 이는 Go의 단순성과 효율성 철학을 구현하며 명확하고 간결한 명령어를 통해 강력한 기능을 제공합니다.