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:8080http://localhost:8080/about 에 접속하면 각각의 핸들러가 처리한 응답을 볼 수 있다.

  이 예제에서는 다음과 같은 Go의 패키지 시스템과 모듈의 특징을 활용한다.

  • 자체 패키지 생성 (handlers 패키지)
  • 외부 패키지 사용 (gorilla/mux)
  • 모듈을 통한 의존성 관리

Summary

  Go의 패키지 시스템과 모듈 시스템은 코드의 구조화와 재사용성을 크게 향상시킨다. 패키지를 통해 관련 기능을 논리적으로 그룹화하고, 모듈을 통해 의존성을 명확하게 관리할 수 있다.

  또한, 예제에서 볼 수 있듯이 Go를 사용하면 간단한 웹 애플리케이션도 쉽게 만들 수 있다. Go의 표준 라이브러리와 풍부한 서드파티 패키지 생태계를 활용하면, 복잡한 웹 서비스나 마이크로서비스 아키텍처도 효율적으로 구현할 수 있다.

  Go의 패키지 시스템과 모듈 시스템을 잘 이해하고 활용한다면, 더 나은 구조의, 유지보수가 쉬운 Go 프로그램을 작성할 수 있을 것이다.