힘내라 일처리

Go 언어 프로젝트 생성하는 법 알아보기 (리눅스) 본문

알아보기

Go 언어 프로젝트 생성하는 법 알아보기 (리눅스)

일처리 2022. 7. 9. 23:10
반응형

개요

이번에 친구와 함께 간단한 프로젝트를 해보기로 했고 저는 해당하는 서버 언어로 Go 언어를 선택했습니다.

이전에 잠깐 찔러보기만 해 보고 뭔가 구성을 해본 적이 없어서 어떻게 해야 하나 당황을 했는데요...

일단 설치가 되어있는 상태로 가정하고 내용을 진행 해 보겠습니다.

 

프로젝트 폴더 만들기

아마 이전에 다른 언어의 개발 경험이 있었다면 대체로 아래와 같은 구조의 프로젝트 폴더 구조를 생각할 거 같습니다.
저도 그렇구요.
프로그램의 덩치는 커져만 가는데, 파일 안에 코드는 길어져만 가니 파일을 분리하고 이것들을 폴더로 묶어야 하는 것이지요.

myproject/
├── lib
│   ├── a.c
│   ├── a.h
│   ├── b.c
│   └── b.h
└── main.c

그런데 Go에서는 전반적으로 동일하지만 조금 어색한 원칙이 하나 있습니다.

GOPATH에 프로젝트를 만들어야 하는 것이지요

$ go env GOPATH
> /home/orange/go

go env명령어를 통해서 경로를 확인할 수 있습니다.

새로 만든 프로젝트는 $GOPATH/src/<깃주소>/<깃계정>/<깃레포> 의 경로에 만들어야 합니다. 안 그러면 위처럼 폴더로 묶는 구조를 만들 수가 없더라고요.

이건 좀 불편하지 않나... 싶기는 한데 이런 엄격한 구조가 golang의 장점이지 않나... 싶습니다.

$GOPATH/src/closed.src/orange/myproject
├── go.mod
├── main.go
└── mylib
    ├── a.go
    └── b.go

그래서 Go언어 프로젝트는 이러한 구조로 비슷하게 구현이 가능합니다.

~/go/src/closed.src/orange/myproject$ go mod init

폴더를 생성한 뒤에는 go mod init을 해주어야 합니다.

module closed.src/orange/myproject

go 1.18

go.mod파일의 내용은 위와 같습니다. 모듈의 경로가 정의되어 있지요.

go 소스 추가하기

main.go

package main

import (
        "fmt"

        "closed.src/orange/myproject/mylib"
)

func main() {
        fmt.Println("main func")

        mylib.Afunc()
        mylib.Bfunc()
}

mylib/a.go

package mylib

import "fmt"

func Afunc() {
        fmt.Println("a func")
}

mylib/b.go

package mylib

import "fmt"

func Bfunc() {
        fmt.Println("b func")
}

여기에 나오는 mylib/*.go 들은 main.go에서 함께 넣지 않고 분리해서 구현하고자 하는 코드들을 이 안에 구현하면 됩니다.

그렇게 되면 여기에 나오는 mylib은 일종의 패키지가 되는 것이고 main.go에서 그것을 로드해서 사용하게 됩니다.
main.go 코드를 다시 한번 보시면, closed.src/orange/myproject/mylib 프로젝트 경로가 통째로 포함이 되어 있는 것을 확인할 수 있습니다.
저는 이렇게 경로가 코드에 포함되어있는 게 낯설어서 이게 맞나... 싶었는데요.

제가 좋아하는 go언어 오픈소스인 lazygit도 동일한 방식으로 하위 패키지가 포함된 것을 볼 수 있습니다.

아마 이러한 방식의 파일 관리 기법은 코드의 모듈화와 재사용성을 늘리기 위함이 아닐까 싶습니다.
패키지의 경로가 모두 나와 있어 다른 프로젝트의 부분 패키지를 사용할 수 있을 테니까요.

낯설지만 꽤 좋은 구조구나 싶습니다.

여기까지 go언어 프로젝트를 생성하는 방법을 알아보았습니다.

반응형
Comments