Go 언어 - 패키지 시스템과 웹 어플리케이션 만들기
.
Background
필자는 작년 SW마에스트로 활동을 하면서 처음으로 Terraform을 접하게 되었다. Terraform이란 클라우드 인프라 관리 도구로 이는 Go 언어로 작성되어 있어, 늘 흥미를 가지고 있던 언어 중 하나였다. 관심만 가지고 있다가 최근에 졸업 작품을 진행하면서 Go 언어에 대한 관심이 더욱 깊어졌고, 그 활용 범위가 클라우드 인프라 관리뿐만 아니라 마이크로서비스, 네트워크 프로그래밍, DevOps 도구 개발 등 다양한 분야로 확장되어 있음을 알게 되었다. 이에 Go 언어의 기초부터 실제 활용까지 체계적으로 학습하고 공유하고자 본 포스트를 작성하게 되었다.
패키지 생성과 사용
Go에서 패키지는 같은 디렉토리 내의 소스 파일들의 집합이다. 패키지를 만들고 사용하는 방법을 살펴보자.
패키지 생성
// mathutils/calc.go
package mathutils
func Add(a, b int) int {
return a + b
}
func Subtract(a, b int) int {
return a - b
}
패키지 사용
// main.go
package main
import (
"fmt"
"myproject/mathutils"
)
func main() {
sum := mathutils.Add(5, 3)
diff := mathutils.Subtract(10, 4)
fmt.Printf("합: %d, 차: %d\n", sum, diff)
}
이렇게 만든 패키지는 같은 프로젝트 내에서 import 문을 통해 사용할 수 있다.
모듈 시스템 이해
Go 1.11부터 도입된 모듈 시스템은 의존성 관리를 위한 공식 솔루션이다. 모듈을 사용하면 프로젝트의 의존성을 명확히 정의하고 버전을 관리할 수 있다.
모듈 초기화
go mod init myproject
위 명령어를 입력하면 go.mod
파일을 생성하낟. 이 파일에는 프로젝트의 모듈 경로와 의존성 정보가 포함된다.
의존성 추가
go get github.com/gorilla/mux
이 명령은 외부 패키지를 다운로드하고 go.mod 파일에 의존성을 추가한다.
go.mod 파일 예시
module myproject
go 1.16
require github.com/gorilla/mux v1.8.0
웹 애플리케이션 만들기 예제
패키지와 모듈 시스템을 활용하여 간단한 웹 어플리케이션을 만들어볼 수 있다.
프로젝트 구조
mywebapp/
├── main.go
├── go.mod
└── handlers/
└── handlers.go
handlers/handlers.go
package handlers
import (
"fmt"
"net/http"
)
func HomeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "환영합니다! 홈 페이지입니다.")
}
func AboutHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "이 웹사이트는 Go로 만들어졌습니다.")
}
main.go
package main
import (
"log"
"net/http"
"mywebapp/handlers"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
r.HandleFunc("/", handlers.HomeHandler)
r.HandleFunc("/about", handlers.AboutHandler)
log.Println("서버 시작: http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", r))
프로젝트 셋업
go mod init mywebapp # 모듈 초기화
go get github.com/gorilla/mux # 의존성 설치
애플리케이션 실행
go run main.go
이제 브라우저에서 http://localhost:8080
와 http://localhost:8080/about
에 접속하면 각각의 핸들러가 처리한 응답을 볼 수 있다.
이 예제에서는 다음과 같은 Go의 패키지 시스템과 모듈의 특징을 활용한다.
- 자체 패키지 생성 (handlers 패키지)
- 외부 패키지 사용 (gorilla/mux)
- 모듈을 통한 의존성 관리
Summary
Go의 패키지 시스템과 모듈 시스템은 코드의 구조화와 재사용성을 크게 향상시킨다. 패키지를 통해 관련 기능을 논리적으로 그룹화하고, 모듈을 통해 의존성을 명확하게 관리할 수 있다.
또한, 예제에서 볼 수 있듯이 Go를 사용하면 간단한 웹 애플리케이션도 쉽게 만들 수 있다. Go의 표준 라이브러리와 풍부한 서드파티 패키지 생태계를 활용하면, 복잡한 웹 서비스나 마이크로서비스 아키텍처도 효율적으로 구현할 수 있다.
Go의 패키지 시스템과 모듈 시스템을 잘 이해하고 활용한다면, 더 나은 구조의, 유지보수가 쉬운 Go 프로그램을 작성할 수 있을 것이다.