Go 및 CLI 애플리케이션 소개
Golang 이라고도 하는 Go는 Google에서 설계한 오픈 소스 프로그래밍 언어입니다. 단순성, 안전성 및 성능을 강조하므로 명령줄 인터페이스(CLI) 응용 프로그램을 구축하는 데 탁월한 선택입니다. CLI 애플리케이션은 일반적으로 시스템 관리, 자동화 및 스크립팅 작업에 사용되는 텍스트 기반 인터페이스를 통해 사용자가 상호 작용할 수 있는 도구입니다. Go는 다음을 제공하기 때문에 CLI 개발에 매우 적합합니다.
- 단순성: Go의 구문은 이해하고 작성하기 쉬우므로 개발자가 CLI 애플리케이션을 신속하게 구축하고 유지할 수 있습니다.
- 성능: Go는 컴파일되고 정적으로 유형이 지정된 언어입니다. 즉, 최적화된 바이너리 파일을 생성하여 빠르고 효율적인 CLI 애플리케이션을 생성합니다.
- 동시성 지원: Go는 고루틴 및 채널과 같은 기본 제공 동시성 기본 기능을 제공하여 원활한 병렬 처리 및 궁극적으로 더 빠르고 응답성이 뛰어난 CLI 애플리케이션을 가능하게 합니다.
- 정적 바이너리 컴파일: Go는 애플리케이션을 외부 종속성이 없는 단일 독립 실행형 바이너리로 컴파일하여 CLI 애플리케이션의 배포 및 배포를 용이하게 합니다.
- 강력한 표준 라이브러리: Go의 표준 라이브러리는 수많은 기본 제공 패키지를 제공하여 파일 작업, 네트워킹, 명령줄 인수 처리와 같은 일반적인 CLI 개발 작업을 간소화합니다.
이 기사에서는 환경 설정 및 애플리케이션 구성에서 명령줄 인수 처리 및 타사 패키지 활용에 이르기까지 Go를 사용하여 CLI 애플리케이션을 개발하는 데 필요한 기본 사항을 알아봅니다.
시작하기: Go 설치 및 환경 설정
Go로 CLI 애플리케이션 작성을 시작하려면 먼저 시스템에 Go 프로그래밍 언어를 설치해야 합니다.
- 공식 Go 다운로드 페이지를 방문하여 플랫폼(Windows, macOS 또는 Linux)에 적합한 바이너리 패키지를 선택하고 설치 지침을 따르십시오.
- 설치가 완료되면 터미널에서
go version
실행하여 Go가 올바르게 설치되었는지 확인합니다. 이 명령은 설치된 Go 버전을 표시해야 합니다. - Go 작업 공간의 위치(Go 프로젝트 및 종속 항목이 저장될 위치)를 결정하는
GOPATH
및 Go 설치 디렉터리를 가리키는GOROOT
포함하여 Go에 필요한 환경 변수를 구성합니다. -
go
명령이 시스템의PATH
변수에 있는지 확인하십시오. 이를 통해 모든 디렉터리에서 Go 명령을 실행할 수 있습니다.
Go가 설치되고 환경이 구성되면 첫 번째 CLI 애플리케이션 빌드를 시작할 준비가 된 것입니다.
CLI 애플리케이션 구조화: 패키지 및 모듈
CLI 애플리케이션을 올바르게 구조화하는 것은 코드가 구성되고 탐색하기 쉽도록 유지 관리 및 확장성에 필수적입니다. Go에서 코드 구성은 패키지와 모듈을 통해 이루어집니다.
패키지: 패키지는 코드를 구성하고 분류하는 Go의 방식입니다. 패키지는 동일한 디렉터리에 있는 하나 이상의 소스 파일( .go
확장명 포함)로 구성됩니다. 패키지의 각 파일은 파일 시작 부분에 package
키워드로 지정된 패키지 이름을 선언해야 합니다. 일반적인 Go CLI 애플리케이션에는 두 개 이상의 패키지가 있습니다.
-
main
: 애플리케이션의 진입점에 대한 기본 패키지입니다.main()
함수가 상주하고 CLI 애플리케이션의 시작점 역할을 하는 곳입니다. 모든 CLI 관련 논리 및 명령은 기본 패키지 내에 배치해야 합니다. -
internal
또는pkg
: 이 패키지에는 CLI 로직과 분리된 재사용 가능한 코드가 포함되어 있습니다. 프로젝트 내에서 자신의 Go 코드로만 가져와야 하는 코드에는internal
을, 모든 Go 프로젝트에서 가져올 수 있는 코드에는pkg
사용할 수 있습니다.
모듈: 모듈은 Go 애플리케이션에서 종속성 및 버전 관리를 관리하는 수단입니다. Go 1.11에 도입되어 개발자가 패키지 종속성을 선언하고 필요한 버전을 지정할 수 있습니다. 새 Go 모듈을 만들려면 프로젝트의 루트 디렉터리로 이동하고 다음 명령을 실행합니다.
go mod init your.module.name
이 명령은 루트 디렉터리에 프로젝트의 종속성을 나열하는 go.mod
파일과 각 종속성의 체크섬을 보유하는 go.sum
파일을 만듭니다. 패키지를 가져오거나 타사 라이브러리를 사용할 때 Go는 자동으로 go.mod
및 go.sum
파일의 종속성을 추적합니다.
이미지 출처: Go 프로그래밍 언어
패키지와 모듈을 효과적으로 사용하면 Go CLI 애플리케이션의 깔끔하고 효율적인 코드 구조를 유지할 수 있으므로 향후 프로젝트를 보다 간단하게 개발, 디버그 및 확장할 수 있습니다.
명령줄 인수 및 플래그
명령줄 인수 및 플래그는 CLI 애플리케이션의 필수 구성 요소로, 사용자가 애플리케이션의 동작을 제어하고 필요한 입력을 제공할 수 있도록 합니다. Go에서는 표준 라이브러리의 flag
및 os.Args
패키지를 사용하여 명령줄 인수 및 플래그로 작업할 수 있습니다.
os.Args 사용
os.Args
패키지는 명령줄 인수에 대한 직접 액세스를 제공합니다. os.Args[0]
은 실행 중인 프로그램의 이름이고 나머지 항목은 프로그램에 전달된 인수를 나타내는 문자열 조각입니다.
다음은 os.Args
사용의 예입니다.
패키지 메인 가져오기( "fmt" "os" ) 함수 메인() { argCount := len(os.Args) fmt.Printf("인수 개수: %d\n", argCount) fmt.Println("인수:", os.Args) }
프로그램을 실행하면 제공된 인수의 수와 목록이 표시됩니다.
플래그 패키지 사용
flag
패키지는 명령줄 플래그로 작업하는 보다 정교하고 유연한 방법입니다. 다양한 데이터 유형으로 플래그를 정의하고 입력을 편리하게 구문 분석할 수 있습니다.
다음은 flag
패키지를 사용하는 예입니다.
패키지 메인 가져오기( "깃발" "fmt" ) 함수 메인() { 변수 ( 이름 문자열 나이 int 높이 float64 ) flag.StringVar(&name, "이름", "John Doe", "귀하의 이름") flag.IntVar(&age, "나이", 21, "나이") flag.Float64Var(&height, "키", 180.0, "키(cm)") flag.Parse() fmt.Printf("이름: %s\n", 이름) fmt.Printf("나이: %d\n", 나이) fmt.Printf("높이: %.1f\n", 높이) }
플래그를 정의하면 flag.Parse()
호출하여 제공된 명령줄 입력을 구문 분석하고 정의된 변수를 채웁니다. 그런 다음 애플리케이션 전체에서 이러한 변수를 사용할 수 있습니다.
명령 및 하위 명령 만들기
복잡한 CLI 애플리케이션의 경우 기능과 옵션을 더 잘 구성하기 위해 명령과 하위 명령을 생성할 수 있습니다. Go에서 명령 및 하위 명령으로 작업하기 위한 인기 있는 타사 패키지 중 하나는 github.com/spf13/cobra
입니다.
코브라 시작하기
시작하려면 Cobra 패키지를 설치해야 합니다.
-u github.com/spf13/cobra/cobra로 이동
설치가 완료되면 Cobra로 새 CLI 애플리케이션을 생성할 수 있습니다.
코브라 초기화 my-cli --pkg-name=my-cli
이 명령은 Cobra 기반 CLI 애플리케이션에 필요한 구조와 파일이 포함된 my-cli
라는 새 디렉토리를 생성합니다.
명령 정의
Cobra 기반 애플리케이션에서는 cobra.Command
인스턴스를 정의하여 명령을 생성합니다. 각 명령에는 Use
필드(명령 사용 방법 표시), Short
필드(간단한 설명 제공) 및 Long
필드(자세한 설명 제공)가 있습니다.
또한 각 명령에는 명령 논리를 실행하는 함수가 포함된 Run
필드가 있어야 합니다. 명령의 플래그와 인수를 캡처하기 위해 이 함수를 클로저로 정의하는 경우가 많습니다.
다음은 간단한 "인사" 명령을 만드는 예입니다.
welcomeCmd := &cobra.Command{ 사용: "인사하다", Short: "인사하기", Long: "이 명령은 사용자 지정 가능한 메시지로 누군가를 맞이합니다.", 실행: func(cmd *cobra.Command, args []string) { // 인사 명령에 대한 논리 }, }
하위 명령을 생성하려면 다른 cobra.Command
인스턴스를 정의하고 AddCommand
메서드를 사용하여 상위 명령의 하위로 추가할 수 있습니다. 예를 들어 "greet" 명령 아래에 "goodbye" 하위 명령을 만들 수 있습니다.
안녕Cmd := &cobra.Command{ 사용: "안녕", Short: "누군가에게 작별인사를 하세요", Long: "이 하위 명령은 특정 언어로 누군가에게 작별 인사를 합니다.", 실행: func(cmd *cobra.Command, args []string) { // 안녕 하위 명령에 대한 논리 }, } welcomeCmd.AddCommand(goodbyeCmd)
대화형 프롬프트 및 사용자 입력
대화형 프롬프트는 일련의 질문을 통해 사용자를 안내하고 응답을 기반으로 입력을 수집하여 CLI 애플리케이션의 사용자 경험을 개선할 수 있습니다. Go에서 대화형 프롬프트 작업을 위한 인기 있는 타사 패키지 중 하나는 github.com/AlecAivazis/survey/v2
입니다.
설문조사 시작하기
먼저 Survey 패키지를 설치해야 합니다.
-u github.com/AlecAivazis/survey/v2로 이동
대화형 프롬프트에 설문 조사 사용
Survey는 Input
, Select
, MultiSelect
, Confirm
등을 포함하여 미리 정의된 프롬프트 유형 세트를 제공합니다. 프롬프트를 만들려면 원하는 프롬프트 유형을 인스턴스화하고 survey.Ask
함수를 호출합니다.
패키지 메인 가져오기( "fmt" "github.com/AlecAivazis/survey/v2" ) 함수 메인() { 변수 이름 문자열 namePrompt := &survey.Input{ 메시지: "당신의 이름은 무엇입니까?", } 오류 := Survey.Ask([]*survey.Question{{ 이름: "이름", 프롬프트: namePrompt, 유효성 검사: 설문 조사.필수, }}, &이름) 오류가 있는 경우 != nil { fmt.Println("오류:", 오류) 반품 } fmt.Printf("안녕하세요, %s!\n", name) }
이 코드 스니펫은 Survey의 Input
프롬프트를 사용하여 이름을 수집하고 인사말 메시지를 표시하는 방법을 보여줍니다. Validate
필드는 사용자 입력에 대한 사용자 지정 유효성 검사 논리를 구현하도록 설정할 수 있습니다.
외부 라이브러리 작업
많은 CLI 애플리케이션에서 기능을 향상하고 개발 프로세스를 간소화하기 위해 외부 라이브러리에 의존하는 것이 일반적입니다. Go는 개발자가 외부 라이브러리와 원활하게 작업할 수 있도록 종속성 관리에 대한 현대적이고 효율적인 접근 방식을 제공합니다. Go 1.11에 도입된 Go 모듈을 사용하면 프로젝트 내에서 패키지 종속성을 선언하고 필요한 패키지를 다운로드, 빌드 및 설치하는 프로세스를 자동화할 수 있습니다. CLI 애플리케이션에서 외부 라이브러리를 관리하려면 다음 단계를 따르세요.
- Go 모듈 초기화: CLI 애플리케이션의 루트 디렉터리에서
go mod init <module-name>
명령을 실행하고 '<module-name>'을 원하는 모듈 이름으로 바꿉니다. 이 명령은 프로젝트 디렉토리에go.mod
라는 새 파일을 생성합니다. - 외부 라이브러리 추가: 외부 라이브러리를 가져올 때마다 소스 코드에 필요한 import 문을 추가합니다. 프로젝트를 처음 빌드하거나 실행할 때 Go는 해당 라이브러리의 필수 버전을 자동으로 다운로드 및 설치하고
go.mod
및go.sum
파일을 업데이트합니다. - 라이브러리 업데이트: 외부 라이브러리를 업데이트하려면
go get -u
명령 뒤에 패키지 이름을 사용할 수 있습니다. 이렇게 하면go.mod
파일의 변경 사항을 반영하여 패키지가 최신 버전으로 업데이트됩니다. - 사용하지 않는 라이브러리 제거:
go.mod
파일에서 사용하지 않는 라이브러리를 정리하려면go mod tidy
명령을 실행합니다. 이렇게 하면 더 이상 필요하지 않거나 개발 중에 사용되지 않는 라이브러리가 제거됩니다.
Go 모듈을 사용하면 외부 라이브러리로 작업할 때 몇 가지 이점이 있습니다. 예를 들어, 코드 가독성을 높이고 종속성 관리를 간소화하여 보다 유지 관리하기 쉬운 모듈식 CLI 애플리케이션을 허용합니다.
오류 처리 및 로깅
CLI 애플리케이션의 견고성을 보장하려면 적절한 오류 처리 및 로깅이 중요합니다. Go는 오류 및 로그 작업을 위한 매우 실용적이고 인체공학적인 접근 방식을 제공합니다. Go에서 오류를 처리 하려면 표준 errors
패키지를 사용할 수 있습니다. 다음은 CLI 애플리케이션에서 오류로 작업할 때의 몇 가지 모범 사례입니다.
- 패닉 대신 오류 반환: 애플리케이션이 패닉 및 충돌을 일으키지 않고 함수에서 오류를 반환하고 적절하게 처리합니다. 이를 통해 CLI 애플리케이션에서 더 나은 제어 흐름 및 복구 메커니즘을 사용할 수 있습니다.
- 사용자 지정 오류 유형 사용:
errors.New
함수를 사용하거나error
인터페이스를 구현하여 고유한 오류 유형을 만듭니다. 사용자 지정 오류 유형을 사용하면 오류가 발생할 때 무엇이 잘못되었는지에 대한 보다 구체적인 정보를 전달할 수 있습니다. - 소스에 가까운 오류 처리: 가능하면 오류의 원인에 최대한 가깝게 오류를 처리합니다. 이렇게 하면 코드의 단순성을 유지하고 복잡한 상황에서 오류 처리에 대해 더 쉽게 추론할 수 있습니다.
로깅을 위해 Go 표준 라이브러리는 간단하고 유연한 로깅 인터페이스를 제공하는 log
패키지를 제공합니다. 패키지를 사용하여 심각도 수준이 다른 메시지를 기록하고 출력 대상을 사용자 지정할 수 있습니다. 고급 로깅 기능을 사용하려면 널리 사용되는 github.com/sirupsen/logrus
패키지와 함께 구조화된 로깅을 사용하는 것이 좋습니다. 다음은 CLI 애플리케이션에서 효과적인 로그인을 위한 몇 가지 팁입니다.
- 올바른 로깅 수준 선택: 로깅 수준을 사용하여 심각한 오류, 경고 및 정기적인 정보 메시지를 구분합니다. 이렇게 하면 로그를 보다 실행 가능하게 만들고 문제를 보다 효율적으로 식별하는 데 도움이 됩니다.
- 로그 메시지에 컨텍스트 포함: 변수 값 및 함수 이름과 같은 로깅 시 관련 컨텍스트를 제공합니다. 이렇게 하면 문제를 해결할 때 문제를 더 쉽게 추적할 수 있습니다.
- 구조적 로깅 고려: 구조적 로깅을 사용하여 JSON 과 같이 기계가 읽을 수 있는 형식으로 로그 메시지를 내보냅니다. 이는 중앙 집중식 로깅 시스템, 로그 집계 및 분석 도구에 특히 유용합니다.
CLI 애플리케이션 테스트 및 벤치마킹
품질 보증은 안정적인 CLI 애플리케이션 개발의 또 다른 중요한 측면입니다. 테스트 및 벤치마킹을 위한 Go의 기본 제공 지원을 통해 효과적인 단위 테스트를 작성하고 CLI 애플리케이션의 성능을 측정할 수 있습니다. Go의 testing
패키지를 사용하면 단위 테스트를 작성하고 병렬로 실행하며 테스트 범위 보고서를 생성할 수 있습니다. 다음 기술을 사용하여 테스트 방법을 개선하십시오.
- 테스트 함수 만들기: CLI 애플리케이션 구성 요소에 대한 테스트 함수를 작성하고
TestMyFunction
과 같이Test
접두사를 붙입니다. 이러한 함수를 테스트 중인 소스 파일과 함께 별도의_test.go
파일에 배치합니다. - 테스트 테이블 사용: 테스트 테이블(테이블 기반 테스트라고도 함)을 사용하여 단일 테스트 기능을 사용하여 여러 입력-출력 조합을 테스트합니다. 이 접근 방식은 테스트 코드를 단순화하고 유지 관리를 용이하게 합니다.
- 테스트를 병렬로 실행: 테스트 함수 내에서
t.Parallel()
함수를 활용하여 테스트를 동시에 실행합니다. 이렇게 하면 특히 리소스 집약적인 테스트를 처리할 때 테스트 스위트의 실행 속도를 높일 수 있습니다. - 테스트 커버리지 보고서 생성:
go test -cover
명령을 활용하여 코드 커버리지 보고서를 생성합니다. 이를 통해 보다 철저한 테스트가 필요한 코드 영역을 식별하고 더 높은 수준의 테스트 적용 범위를 보장할 수 있습니다.
CLI 애플리케이션 구성 요소의 성능을 측정하기 위해 Go는 동일한 testing
패키지를 통해 벤치마킹 지원을 제공합니다. 다음과 같이 벤치마크를 사용하십시오.
- 벤치마크 함수 만들기: 벤치마크 함수를 작성하고
BenchmarkMyFunction
과 같이Benchmark
접두사를 붙입니다. 관련 테스트 함수가 포함된 동일한_test.go
파일에 이러한 함수를 배치합니다. -
testing.B
매개변수 사용:testing.B
매개변수(예:for i := 0; i < bN; i++ { ... }
)에 의해 제어되는 루프 내에서 벤치마킹하려는 코드를 실행합니다.testing.B
매개변수는 통계적으로 유의미한 측정을 달성하기 위해testing
패키지에 의해 자동으로 조정됩니다. - 벤치마크 결과 분석:
go test -bench
명령을 사용하여 벤치마크를 실행하고 결과를 분석합니다. 이를 통해 최적화가 필요한 CLI 애플리케이션 영역을 결정하고 성능 향상의 영향을 측정할 수 있습니다.
결론적으로 외부 라이브러리의 적절한 관리, 오류 처리, 로깅, 테스트 및 벤치마킹은 안정적이고 효율적인 CLI 애플리케이션을 만드는 데 필수적입니다. 이 문서에 설명된 다양한 도구, 기술 및 모범 사례를 활용하여 Go 기반 CLI 애플리케이션이 높은 수준의 품질과 우수성을 달성하도록 할 수 있습니다. 또한 Go의 강력한 기능을 AppMaster 와 같은 다목적 플랫폼과 결합하면 소프트웨어 개발 프로세스를 크게 가속화하여 뛰어난 결과를 얻을 수 있습니다.
CLI 애플리케이션 배포 및 배포
Go에서 명령줄 인터페이스(CLI) 애플리케이션 개발을 완료한 후 마지막 단계는 사용자가 액세스하고 활용할 수 있도록 배포하는 것입니다. Go 프로그래밍 언어와 해당 빌드 도구 체인을 사용하면 플랫폼 간에 쉽게 배포하고 공유할 수 있는 정적으로 연결된 독립 실행형 실행 파일을 만들 수 있습니다.
실행 파일 빌드
Go CLI 애플리케이션을 빌드하려면 go build
명령 다음에 대상 패키지 또는 파일을 사용하십시오.
go build ./path/to/your/package
또는:
go build main.go
이 명령은 현재 플랫폼(예: Windows, macOS, Linux)에 대한 실행 가능한 바이너리 파일을 빌드하고 현재 작업 디렉토리에 배치합니다. 기본적으로 바이너리 파일의 이름은 패키지 이름 또는 확장자가 없는 소스 파일 이름(예: main
)과 일치합니다.
그러나 출력 이진 파일 이름을 지정하고 -o
플래그 및 환경 변수를 사용하여 다른 플랫폼을 대상으로 지정할 수 있습니다.
GOOS=linux GOARCH=amd64 go build -o custom-name ./path/to/your/package
위의 예에서는 GOOS
및 GOARCH
환경 변수를 설정하여 Go 빌드 프로세스가 AMD64 아키텍처를 사용하는 Linux를 대상으로 지정하도록 지시하고 출력 바이너리 파일 이름을 custom-name
으로 설정합니다.
다양한 플랫폼을 위한 크로스 컴파일
Go는 교차 컴파일을 단순화하고 복잡한 빌드 구성 없이 다양한 플랫폼에 대한 실행 파일을 빠르게 생성할 수 있습니다. 여러 플랫폼용으로 Go CLI 애플리케이션을 크로스 컴파일하려면 그에 따라 GOOS
및 GOARCH
환경 변수를 설정합니다. 다음 예제는 Windows, macOS 및 Linux용 Go CLI 애플리케이션을 크로스 컴파일하는 방법을 보여줍니다.
# For Windows 64-bit GOOS=windows GOARCH=amd64 go build -o mycli-windows.exe ./path/to/package # For macOS 64-bit GOOS=darwin GOARCH=amd64 go build -o mycli-macos ./path/to/package # For Linux 64-bit GOOS=linux GOARCH=amd64 go build -o mycli-linux ./path/to/package
CLI 애플리케이션 배포
프로젝트 웹 사이트 또는 README 문서 내에서 직접 다운로드 옵션을 제공하여 Go CLI 실행 가능 바이너리 파일을 배포할 수 있습니다. 또는 패키징 시스템, 리포지토리 또는 패키지 관리자를 사용하여 플랫폼별 패키지로 배포합니다. 널리 사용되는 일부 패키지 관리 시스템은 다음과 같습니다.
- Homebrew - 패키지를 설치하고 관리하기 위한 사용자 친화적인 구문을 갖춘 macOS 및 Linux용 패키지 관리자입니다.
- APT(Debian 기반 시스템) - Ubuntu와 같은 Debian 기반 Linux 배포용 패키지 관리자입니다.
- RPM(Red Hat 기반 시스템) - Fedora와 같은 Red Hat 기반 Linux 배포용 패키지 관리자입니다.
최종 생각 및 리소스
Go로 강력한 CLI 애플리케이션을 만드는 것은 즐겁고 보람 있는 과정입니다. 단순성, 성능 및 바이너리 배포의 장점으로 인해 Go는 이러한 목적에 이상적인 프로그래밍 언어 선택입니다. Go CLI 애플리케이션을 계속 개발하면서 추가 리소스를 탐색하여 지식을 확장하고 기술을 향상하는 것을 고려하십시오.
- 공식 Go 문서 - Go 프로그래밍 언어 및 표준 라이브러리에 대한 포괄적인 안내서입니다.
- Go 학습 리소스 - 자습서, 서적 및 과정을 포함한 광범위한 Go 학습 리소스 목록입니다.
- Awesome Go - 주제별로 분류된 Go 패키지, 라이브러리 및 리소스의 선별된 목록입니다.
- Go by Example - 다양한 Go 기능에 대한 간결한 예제와 설명을 제공하는 Go에 대한 실습 접근 방식입니다.
또한 백엔드 프로그래밍 언어로 Go(golang)를 사용하는 AppMaster.io 와 같은 no-code 플랫폼을 탐색하는 것을 고려하십시오. AppMaster.io는 코드를 한 줄도 작성하지 않고도 웹, 모바일 및 백엔드 애플리케이션을 개발할 수 있는 직관적인 끌어서 놓기 인터페이스를 제공합니다. Go 및 AppMaster.io와 같은 no-code 플랫폼을 모두 이해하면 향후 훨씬 더 정교한 소프트웨어 솔루션을 개발할 준비를 갖추게 될 것입니다.