학습
Go 모듈 (Modules)
Go 모듈 (Modules) — 초급
모듈 (Modules)
1. 도입 (왜 배워야 하는가)
Go에서 모듈은 코드의 재사용성과 관리의 용이성을 제공합니다. 실무에서는 여러 개발자와 협업하여 대형 프로젝트를 진행하는 경우가 많기 때문에, 모듈을 사용하여 코드의 구조를 잘 정리하는 것이 중요합니다. 모듈을 사용하지 않으면, 코드가 서로 얽히고 복잡해져 관리가 어려워질 수 있으며, 의존성 문제로 인해 배포 시 오류가 발생할 가능성도 높아집니다.
예를 들어, 여러 팀원이 동시에 프로젝트에 참여할 때, 각자의 코드가 서로 충돌하지 않도록 명확한 경계를 설정하는 것이 모듈의 주된 역할입니다. 만약 모듈을 사용하지 않으면, 각기 다른 버전의 패키지나 라이브러리를 사용함으로써 발생하는 충돌 문제를 해결하기가 어려워집니다.
2. 핵심 개념 설명
모듈 (Module)
모듈은 Go에서 여러 패키지를 묶어 관리하는 단위입니다. 모듈을 사용하여 관련된 패키지를 묶어 놓으면 코드의 가독성이 높아지고, 의존성 관리가 용이해집니다.
패키지 (Package)
Go에서 패키지는 관련된 함수와 변수를 그룹화한 것입니다. 모듈은 여러 패키지로 구성될 수 있습니다.
의존성 (Dependency)
의존성은 특정 코드가 다른 코드에 의존하고 있다는 것을 의미합니다. 모듈을 사용하면 이 의존성을 명확하게 관리할 수 있습니다.
| 용어 | 정의 |
|---|---|
| 모듈 | 여러 패키지를 포함하는 코드 집합 |
| 패키지 | 관련된 함수와 변수를 그룹화한 것 |
| 의존성 | 특정 코드가 다른 코드에 의존하고 있는 관계 |
3. 기본 코드 예제
모듈을 생성하는 간단한 예제를 살펴보겠습니다.
// main.go
package main
import (
"fmt"
"mymodule/mypackage"
)
func main() {
result := mypackage.Greet("Go")
fmt.Println(result)
}
// mypackage/mypackage.go
package mypackage
func Greet(name string) string {
return "Hello, " + name + "!"
}
실행 결과
Hello, Go!
코드 한 줄씩 동작 설명
package main: 이 파일이 실행 가능한 패키지임을 나타냅니다.import: 다른 패키지를 사용하기 위해 가져옵니다.fmt.Println: 콘솔에 출력을 위한 함수입니다.mypackage.Greet("Go"): mypackage의 Greet 함수를 호출합니다.return "Hello, " + name + "!": 인자로 받은 이름을 포함하여 인사말을 반환합니다.- 잘못된 코드:
- 올바른 코드:
- 잘못된 코드:
- 올바른 코드:
- 모듈은 여러 패키지를 조직적으로 관리할 수 있게 해줍니다.
- 패키지는 관련된 함수와 변수를 그룹화합니다.
- 의존성 관리는 모듈을 통해 명확하게 이루어집니다.
- 실무에서 모듈은 코드의 재사용성과 유지보수성을 높여줍니다.
- Go의 패키지 관리 도구인
go mod의 심화 사용법 - Go의 인터페이스와 구조체를 활용한 설계 패턴
- Go의 고루틴과 채널을 이용한 동시성 프로그래밍
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니 구현
장바구니에 여러 상품을 담고, 이를 관리하기 위해 모듈을 사용할 수 있습니다.
// cart/cart.go
package cart
type Item struct {
Name string
Price float64
}
type Cart struct {
Items []Item
}
func (c Cart) AddItem(item Item) {
c.Items = append(c.Items, item)
}
func (c Cart) TotalPrice() float64 {
total := 0.0
for _, item := range c.Items {
total += item.Price
}
return total
}
예제 2: 사용자 인증 시스템
사용자 정보를 관리하기 위해 모듈을 사용하여, 사용자 등록 및 인증 기능을 구현할 수 있습니다.
// auth/auth.go
package auth
type User struct {
Username string
Password string
}
var registeredUsers []User
func Register(user User) {
registeredUsers = append(registeredUsers, user)
}
func Authenticate(username, password string) bool {
for _, user := range registeredUsers {
if user.Username username && user.Password password {
return true
}
}
return false
}
5. 흔한 실수와 주의사항
실수 1: 모듈 초기화 누락
go mod init mymodule
go mod init mymodule
(모듈을 초기화하지 않으면, 의존성 관리가 어려워집니다.)
실수 2: 경로 오류
import "mymodule/mypackages"
import "mymodule/mypackage"
(패키지 이름을 잘못 입력하면, 해당 패키지를 찾을 수 없습니다.)