Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

처음 만나는 Go - 모듈에 대하여 본문

💬 언어/Go

처음 만나는 Go - 모듈에 대하여

Chamming2 2022. 4. 4. 02:00

구글에서 제작한 컴파일 언어인 Go(Golang)는 그 빠르다는 C++에도 밀리지 않는 성능과 간단히 CLI를 개발할 수 있다는 등의 장점을 살려 백엔드 개발과 데브옵스 개발자들에게 큰 인기를 얻고 있습니다.

✅ Go의 주요 사용 분야는 이곳 에서 확인해볼 수 있습니다!

Go 설치하기

Go는 컴파일 언어이자 강타입 언어로, 설치 링크 에서 Go 컴파일러를 간단히 설치할 수 있습니다.

시작하기 전에 : 모듈에 대해

본격적으로 Hello, world! 출력에 도전하기 전에, Go의 중요한 개념인 모듈에 대해 다뤄보도록 하겠습니다.

 

간결한 문법도 Go의 빠른 속도의 원인 중 하나겠지만, 구글에서는 최적화된 종속성 관리가장 큰 요인으로 뽑고 있는데요, Go에서는 모듈 을 통해 의존성 변경을 추적하고 효율적인 종속성 트리를 생성합니다.

  • 모듈 생성 커맨드
go mod init [모듈 경로]/[모듈명]
go: creating new go.mod: module [모듈 경로]/[모듈명]

첫 번째 모듈이 생성되었습니다!

 

이제 go.mod 라는 새로운 파일이 생성되었을 텐데요, 이 go.mod 파일을 통해 앞으로 사용할 의존성 모듈들을 관리하고 추적할 수 있게 됩니다.

Hello, World!

이제 본격적으로 첫 번째 Hello, World! 를 출력해 보겠습니다.

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

파이썬과 자바의 무언가를 섞어둔 듯 한 이 형상은 Go의 Hello, World! 를 출력하는 코드입니다.
이 코드는 다음과 같은 의미를 갖습니다.

// 해당 패키지(프로그램)의 이름은 main 입니다.
package main

// fmt 라이브러리를 불러와 사용합니다.
// fmt는 Go 표준(내장) 라이브러리로, 입출력을 담당합니다.
import "fmt"

// main 패키지에서는 기본적으로 main 함수를 실행합니다.
func main() {
    fmt.Println("Hello, World!")
}
Go의 생명주기 - main과 init 함수
  • 모든 Go 프로그램은 main 패키지에 존재하는 main 함수가 진입점(Entry)이 됩니다. (마치 C, C++처럼요!)
  • 이밖에도 init 이라는 함수 역시 존재하는데, init 은 항상 main 보다 먼저 실행되며 main 과는 달리 두 번 이상 호출할 수 있다는 차이가 있습니다.

외부 패키지 불러오기

이번에는 외부 패키지를 불러와 사용해 보겠습니다.

Go 패키지는 NPM과 유사한 https://pkg.go.dev/ 라는 곳에서 관리되고 있는데요, 여기서 “quote” 라고 검색해 간단한 패키지(rsc.io/quote/v4)를 하나 사용해 보겠습니다.

✅ Go 컴파일러의 import 최적화

외부 패키지를 사용할 때는 반드시 해당 패키지의 요소가 코드 내에서 사용되어야 합니다.
만약 코드에서 사용되지 않고 있다면 Go 컴파일러는 자동으로 해당 외부 패키지를 import 목록에서 제거합니다!
package main

import (
    "fmt"

    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Go())
}

이렇게 코드를 입력한 후 go mod tidy 커맨드를 입력하면 패키지의 버전 및 유효성 정보가 기록되는 go.sum 파일이 생성됩니다.

  • go.sum 파일의 예시
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

한가지 주목할 만한 특징은, 만약 import "rsc.io/quote" 처럼 패키지를 불러왔더라도 해당 패키지의 구성 요소를 실제로 사용하는 부분이 없다면 go mod tidy 커맨드는 해당 패키지를 모듈에서 제거합니다.

 

yarn이나 npm 등의 패키지 매니저를 사용할 때는 yarn add 이후 패키지의 업데이트나 제거를 수동으로 진행해야 했지만, Go에서는 go mod tidy 하나로 설치 · 제거 및 업데이트를 모두 수행할 수 있다는 점이 큰 특징입니다.

외부 패키지 사용 규칙

이번에는 외부 모듈을 만들고 참조해보기 위해, 새로운 greeting 모듈을 만들어 보겠습니다.

go mod init example/greetings
// greetings.go
package greetings

import "fmt"

// 이 함수는 이름을 입력받아 포맷된 문자열을 리턴합니다.
func Hello(name string) string {
    message := fmt.Sprintf("안녕하세요, 저는 %v 입니다!", name)
    return message
}

🚨 중요!

외부 모듈에서 사용할 함수는 반드시 대문자로 시작해야만 합니다.
예를 들어 위 코드의 Hello 함수를 소문자 hello 로 변경하면 다른 모듈에서는 이를 찾을 수 없게 됩니다.

이제 새로운 greetings 모듈이 추가된 모습입니다.

그런데 이 모듈은 현재 https://pkg.go.dev/ 에 배포되지 않았기 때문에 다른 모듈에서 사용할 수 없는 상태인데요, hello 모듈을 생성한 후 greetings 모듈을 참조해 보겠습니다.

 # 폴더 구조
 |-- greetings/
 |      ㄴ go.mod
 |      ㄴ greetings.go
 |
 ㄴ-- hello/
        ㄴ go.mod
        ㄴ hello.go
go mod init example/hello
// hello.go
package main

import (
    "fmt"

    "example/greetings"
)

func main() {
    message := greetings.Hello("찬민")
    fmt.Println(message)
}

이렇게 example/greetings 를 불러오고 greetings.Hello() 를 호출하면 외부 모듈을 사용할 준비가 모두 끝나는데요, 여기서 go mod tidy 를 바로 실행하기 전, replace example/greetings => ../greetings 라는 커맨드를 통해 모듈을 찾을 위치를 로컬 경로로 변경해 줍니다

// hello/go.mod
module example/hello

go 1.17

replace example.com/greetings => ../greetings

이제 go mod tidy 를 실행하면, hello 패키지에서 greeting 패키지에 존재하는 함수를 사용할 수 있게 됩니다.

// hello.go
package main

import (
    "fmt"

    "example/greetings"
)

func main() {
    message := greetings.Hello("찬민")
    fmt.Println(message)
    // 안녕하세요, 저는 찬민 입니다!
}

이번 글에서는 첫 번째 "Hello World!" 예제를 생성해보고 Go의 가장 핵심적인 개념인 패키지와 모듈의 개념에 대해 살펴보았는데요, 다음 글부터는 본격적으로 Go 언어의 문법을 소개해보도록 하겠습니다. 🙂

반응형
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆