Golang 애플리케이션 배포 방법
Go(Golang )는 느린 컴파일과 동시 프로그래밍의 필요성 등 대규모 시스템 개발에서 흔히 발생하는 문제를 해결하기 위해 2009년에 Google에서 개발한 프로그래밍 언어입니다.
Go는 C와 유사한 구문으로 단순성, 효율성, 사용 편의성을 위해 설계되었으며, 또한 컴파일되어 해석 언어보다 빠릅니다.
Go의 주요 기능 중 하나는 고루틴이라는 경량 스레드를 통해 여러 작업을 동시에 실행할 수 있는 동시성 지원입니다.
Go는 네트워킹과 웹 개발에 대한 강력한 지원으로도 잘 알려져 있습니다. Go의 표준 라이브러리에는 HTTP, TCP/IP 및 기타 네트워킹 프로토콜을 위한 패키지가 포함되어 있어 네트워크 애플리케이션을 쉽게 구축할 수 있습니다.
이 문서에서는 Go 앱의 장점, 제한 사항 및 배포 옵션에 대해 살펴봅니다. 또한 Back4app의 컨테이너화 서비스를 사용하여 Go 애플리케이션을 무료로 생성, 도커화 및 배포하는 방법을 알아봅니다.
계속 읽으면서 Go 앱을 배포하는 방법을 알아보세요.
Contents
- 1 웹 개발에서 Golang의 장점
- 2 Golang의 한계
- 3 Golang 배포 옵션
- 4 AWS와 같은 서비스형 인프라(IaaS)
- 5 Heroku와 같은 서비스형 플랫폼(PaaS)
- 6 Back4app과 같은 서비스형 백엔드(BaaS)
- 7 Back4app 컨테이너와 같은 서비스형 컨테이너화
- 8 Golang 배포 프로세스
- 9 Docker로 Go 앱 컨테이너화
- 10 Back4app에 컨테이너 배포하기
- 11 결론
- 12 자주 묻는 질문
- 13 Back4App이란 무엇이고, 이것이 내 앱을 배포하기에 좋은 플랫폼인 이유는 무엇인가요?
- 14 컨테이너를 사용해 Back4app에 Rust와 같은 다른 언어를 배포할 수 있나요?
- 15 Back4App에서 컨테이너화된 애플리케이션을 확장할 수 있나요?
웹 개발에서 Golang의 장점
Go의 인기가 높아지는 것은 우연이 아닙니다. 애플리케이션에 Go를 사용하면 많은 이점을 얻을 수 있고 활용할 수 있습니다.
고성능
Dropbox와 Uber 같은 회사에서 Go를 사용하는 주된 이유 중 하나는 바로 고성능입니다. Go는 빠른 실행 시간을 위해 설계되었기 때문에 고성능이 필요한 애플리케이션에 이상적인 언어입니다.
Go는 가비지 컬렉터를 사용해 오버헤드 메모리 관리를 줄여 실행 시간을 단축합니다. 또한 Go의 기본 제공 동시성 지원을 사용하여 애플리케이션의 성능을 향상시킬 수 있습니다.
확장성
Go는 확장 가능한 앱을 구축하는 데 탁월한 선택입니다. 동시성을 사용하면 많은 작업을 처리할 수 있는 프로그램을 만들 수 있으므로 Go는 빠르게 확장해야 하는 트래픽이 많은 부하를 처리하는 앱에 적합합니다.
또한 Go는 분산 시스템에 대한 지원이 뛰어나 여러 대의 컴퓨터에서 실행해야 하는 대규모 애플리케이션을 구축하는 데 이상적인 선택입니다.
실전 테스트를 거친 Go
Google, Uber, Dropbox 등 많은 유명 기업들이 대규모 애플리케이션을 구축하는 데 Go를 사용하고 있습니다. 이는 Go가 대규모 사용자 기반을 위한 복잡한 애플리케이션을 구축하는 데 있어 안정적이고 신뢰할 수 있는 것으로 실전 테스트를 거쳤다는 것을 의미합니다.
Go는 이전 버전과의 호환성에 중점을 두고 있으며, 언어가 발전하더라도 Golang으로 작성된 애플리케이션은 계속 작동합니다.
훌륭한 커뮤니티 지원
Go는 출시 이후 가장 빠르게 채택률이 증가하고 있는 언어 중 하나로, 크고 활발한 커뮤니티가 형성되어 있습니다. Go에는 활발한 커뮤니티가 많다는 것은 리소스와 질문에 대한 답변을 쉽게 찾을 수 있다는 뜻입니다.
Go에는 개발 시간을 단축하는 데 사용할 수 있는 많은 오픈 소스 라이브러리와 도구가 있습니다. Kubernetes, Docker, Hugo와 같은 인기 있는 빌드 도구는 CLI 도구에서 Cobra와 같은 패키지를 사용합니다.
Golang의 한계
Go는 성능이 뛰어나고 확장성이 뛰어난 프로그래밍 언어이지만, 이 언어로 개발하기 전에 고려해야 할 한계가 있습니다.
특정 작업의 복잡성 증가
Go는 배우고 읽기 쉬울 수 있지만 특정 작업은 Go보다 다른 언어가 더 쉽습니다. Go에는 기본 제공 GUI 툴킷이 필요하고 타사 패키지로 인해 프로젝트가 복잡해지기 때문에 Go로 대화형 사용자 인터페이스를 구축하는 것은 어려울 수 있습니다.
초보자에게는 어려울 수 있는 Go의 동시성 모델
Go의 동시성 모델은 초보자가 이해하고 효과적으로 사용하기 어려울 수 있습니다. Go는 동시성을 위해 고루틴과 채널을 사용하는데, 이는 강력한 도구이지만 이해하기 어려울 수 있습니다. 교착 상태나 경쟁 조건을 피하려면 채널을 효과적으로 사용하는 방법을 배워야 합니다.
Go의 동시성 모델은 또한 코드 구조와 설계에 대해 다르게 생각할 것을 요구합니다. 순차적 프로그래밍 모델에 익숙하다면 이 점이 어렵다는 것을 알게 될 것입니다.
다른 언어에 비해 덜 성숙한 라이브러리 생태계
Golang의 표준 라이브러리는 포괄적이고 Go 앱을 구축하는 데 필요한 대부분의 기능을 갖추고 있지만 Java나 Python과 같은 언어의 라이브러리보다는 덜 성숙합니다.
Golang은 비교적 새로운 프로그래밍 언어이며, 일부 인기 있는 라이브러리는 아직 제공되지 않습니다. 이는 특정 프로젝트, 특히 보다 전문적인 기능이 필요한 프로젝트에 제한이 될 수 있습니다.
또한 Golang용 타사 라이브러리는 다른 언어용 라이브러리보다 덜 널리 보급되어 있으며 일부 기능을 직접 구현해야 하므로 시간이 많이 소요될 수 있습니다.
Golang 배포 옵션
Go에서 앱을 빌드한 후에는 각각 장단점이 있는 여러 가지 배포 옵션이 있습니다.
AWS와 같은 IaaS 서비스, Heroku와 같은 PaaS 서비스, Back4app 및 Google Firebase와 같은 BaaS 서비스, Back4App 컨테이너와 같은 CaaS 서비스 등 다양한 옵션이 있습니다.
AWS와 같은 서비스형 인프라(IaaS)
Amazon Web Services (AWS)와 같은 서비스형 인프라(IaaS) 제공업체는 클라우드에서 소유 가상 머신을 배포하고 관리할 수 있는 기능을 제공합니다.
AWS를 사용하면 Elastic Compute Cloud(EC2)와 같은 서비스를 사용하여 Linux 또는 Windows를 실행하는 가상 머신에 Golang 애플리케이션을 배포할 수 있습니다. 또한 Elastic Container Service(ECS)와 같은 서비스를 사용하여 컨테이너에 애플리케이션을 배포할 수도 있습니다.
AWS와 같은 IaaS 서비스의 장점 중 하나는 기본 인프라를 완벽하게 제어할 수 있다는 점입니다. 특정 요구 사항을 충족하도록 가상 머신을 구성할 수 있습니다. 하지만 가상 머신을 관리하고 유지 관리해야 하므로 기술적이고 까다로운 작업이 될 수 있습니다.
기타 IaaS 플랫폼은 다음과 같습니다:
- Linode
- Microsoft Azure
- Rackspace
- Amazon Web Services (AWS)
- DigitalOcean
- Google Compute Engine (GCE)
Heroku와 같은 서비스형 플랫폼(PaaS)
Heroku와 같은 서비스형 플랫폼(PaaS) 제공업체는 기본 인프라에 영향을 주지 않고 Golang 애플리케이션을 배포할 수 있는 플랫폼을 제공합니다.
Heroku는 몇 가지 명령어만으로 애플리케이션을 배포할 수 있는 간단한 명령줄 인터페이스를 제공합니다. 또한 Heroku는 자동 확장 및 로드 밸런싱을 지원하므로 앱의 트래픽을 쉽게 처리할 수 있습니다.
Heroku와 같은 PaaS 서비스를 사용하면 인프라에 대한 걱정 없이 애플리케이션 개발에 집중할 수 있다는 장점이 있습니다. Heroku는 모든 인프라 관리 및 유지 관리를 처리하므로 시간과 리소스를 절약할 수 있습니다.
하지만 이는 인프라에 대한 통제력이 떨어지고 플랫폼의 한계 내에서 작업해야 한다는 의미이기도 합니다.
기타 PaaS 제공업체는 다음과 같습니다:
- Render
- AWS Elastic Beanstalk
- Microsoft Azure App Service
- DigitalOcean App Platform
- The Fly Platform
Back4app과 같은 서비스형 백엔드(BaaS)
Google Firebase 및 Back4app과 같은 서비스형 백엔드(BaaS) 제공업체는 데이터베이스, 인증 및 호스팅을 포함한 애플리케이션을 위한 완벽한 백엔드 솔루션을 제공합니다. Firebase는 Golang을 비롯한 여러 프로그래밍 언어를 지원하며, 서비스에 액세스하는 데 사용할 수 있는 간단한 API를 제공합니다.
Firebase와 같은 BaaS 서비스를 사용하면 인프라를 관리할 필요 없이 애플리케이션의 백엔드를 빠르고 쉽게 설정할 수 있다는 장점이 있습니다. Firebase는 다양한 기능과 서비스를 제공하지만 인프라에 대한 더 많은 제어가 필요합니다.
기타 BaaS 플랫폼은 다음과 같습니다:
- AWS Amplify
- Cloudkit
- Backendless
- Back4App
- Pocketbase
Back4app 컨테이너와 같은 서비스형 컨테이너화
컨테이너화는 애플리케이션 배포에 널리 사용됩니다. 컨테이너화를 사용하면 애플리케이션과 해당 종속 요소를 컨테이너로 패키징하여 컨테이너 기술을 지원하는 모든 플랫폼에 빠르게 배포할 수 있습니다.
Back4App은 컨테이너에서 Golang 애플리케이션을 배포하고 관리하는 데 사용할 수 있는 서비스 제공업체로서의 컨테이너화입니다.
Back4App과 같은 서비스 제공업체에서 컨테이너화를 사용하면 기본 인프라에 대한 걱정 없이 컨테이너를 지원하는 모든 플랫폼에 애플리케이션을 배포할 수 있다는 장점이 있습니다.
CaaS 제공업체가 모든 컨테이너 관리 및 유지 관리를 처리하므로 시간과 리소스를 절약할 수 있습니다. 하지만 인프라에 대한 액세스 권한 없이 컨테이너화 플랫폼의 제한 내에서 작업해야 할 수도 있습니다.
기타 CaaS 플랫폼은 다음과 같습니다:
- AWS Container Service
- Azure Container Service
- Docker Enterprise
- Google Container Engine
- IBM Kubernetes Service
- Oracle Container Service
Golang 배포 프로세스
여기에서는 Back4app의 CaaS 플랫폼에 Golang 앱을 배포하는 방법을 알아봅니다.
Back4app이란 무엇인가요?
Back4app은 모바일 및 웹 애플리케이션을 위한 백엔드 서비스를 만들고 배포하는 데 사용할 수 있는 클라우드 서비스입니다.
Back4app의 CaaS 기능을 사용하여 Back4app의 백엔드 서버에서 사용자 정의 컨테이너를 배포하고 실행할 수 있습니다. 서버 인프라를 관리하지 않고도 컨테이너 이미지를 사용하여 앱에 사용자 정의 로직을 추가할 수 있습니다.
이 섹션에서는 Go에서 간단한 CRUD RESTful API를 구축하고, Go 프로그램을 컨테이너화하며, Back4app에 컨테이너를 배포하는 방법을 배웁니다.
개발 환경 설정
다운로드 페이지에서 컴퓨터에 Go를 설치한 후, 새 디렉터리를 만들고 Go 앱의 새 Go 프로젝트를 초기화할 수 있습니다.
아래 명령을 실행하여 프로젝트의 새 디렉터리를 만듭니다.
mkdir deployAPI && cd deployAPI
mod init
명령을 실행하여 현재 작업 디렉터리에서 Go 도구를 사용하여 새 프로젝트를 초기화합니다.
이렇게요:
go mod init
Gorilla Mux 패키지로 RESTful API를 빌드하게 됩니다.
아래 명령을 실행하여 프로젝트의 종속성으로 Gorilla Mux 패키지를 설치하세요.
go get -u github.com/gorilla/mux
다음 단계는 RESTful API를 빌드하는 것입니다. Gorilla Mux로 RESTful API를 구축하는 첫 번째 단계는 Go 파일에서 필요한 패키지를 가져오는 것입니다.
프로젝트에 필요한 가져오기 목록은 다음과 같습니다.
import (
"encoding/json"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
가져오기를 나열한 후에는 앱의 데이터베이스를 설정해야 합니다. 간단하게 하기 위해 데이터를 저장하고 검색하는 데 지도를 사용하겠습니다.
다음과 같이 애플리케이션에 지도를 추가할 수 있습니다:
var users = map[int]string{}
지도가 비어 있으므로 POST 요청으로 데이터를 입력해야 합니다.
POST 요청 핸들러 함수
POST 요청은 클라이언트로부터 데이터를 수신하여 파싱한 후 지도 데이터 저장소에 저장해야 합니다.
애플리케이션에 코드 블록을 추가하여 POST 요청 핸들러를 구현하세요:
func createUserHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, err := strconv.Atoi(vars["id"])
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
var data map[string]string
err = json.NewDecoder(r.Body).Decode(&data)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
users[id] = data["name"]
w.WriteHeader(http.StatusCreated)
}
createUserHandler
핸들러 함수는 클라이언트에서 데이터(JSON)를 받아 JSON을 파싱한 후 맵에 데이터를 저장합니다. 핸들러가 맵에 데이터를 성공적으로 추가하면 클라이언트에 StatusCreated
성공 코드를 씁니다.
GET 요청
GET 요청을 통해 데이터 저장소에서 데이터를 읽습니다. GET 요청 핸들러 함수는 클라이언트에서 ID를 검색하고 데이터를 검색하여 클라이언트에 반환합니다.
애플리케이션에 코드 블록을 추가하여 GET 요청 핸들러를 구현하세요:
func readUserHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, err := strconv.Atoi(vars["id"])
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
name, ok := users[id]
if !ok {
w.WriteHeader(http.StatusNotFound)
return
}
data := map[string]string{"name": name}
jsonData, err := json.Marshal(data)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(jsonData)
}
readUserHandler
함수는 mux
패키지의 Vars
함수를 사용하여 ID를 검색하고 맵에서 데이터를 검색한 후 클라이언트에 StatusOk
성공 코드와 함께 데이터를 JSON으로 반환합니다.
PUT 요청 핸들러 함수
PUT 요청을 통해 데이터 저장소의 데이터를 업데이트합니다. PUT 요청 핸들러는 업데이트 프로세스를 위해 ID와 JSON 필드를 수락합니다.
func updateUserHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, err := strconv.Atoi(vars["id"])
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
var data map[string]string
err = json.NewDecoder(r.Body).Decode(&data)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
users[id] = data["name"]
w.WriteHeader(http.StatusOK)
}
updateUserHandler
함수는 vars
변수와 함께 ID를
받고, 요청 본문에서 JSON을 디코딩한 다음, 요청 본문의 JSON 데이터로 필드 또는 ID를 업데이트합니다.
삭제 요청 핸들러 함수
삭제 요청 핸들러 함수는 요청에서 필드 ID를 받아 데이터 저장소에서 필드를 삭제합니다.
애플리케이션에 코드 블록을 추가하여 삭제 요청 핸들러를 구현하세요:
func deleteUserHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, err := strconv.Atoi(vars["id"])
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
delete(users, id)
w.WriteHeader(http.StatusOK)
}
deleteUserHandler
함수는 맵 이름과 ID를 받는 삭제
함수를 사용하여 필드를 삭제하고 클라이언트에 StatusOk
코드를 반환합니다.
핸들러 함수를 라우트에 마운트하기
앱의 엔드포인트를 정의한 후에는 핸들러 함수를 경로에 할당해야 합니다. 경로는 API의 공용 인터페이스입니다.
func main() {
r := mux.NewRouter()
r.HandleFunc("/users/{id}", createUserHandler).Methods(http.MethodPost)
r.HandleFunc("/users/{id}", readUserHandler).Methods(http.MethodGet)
r.HandleFunc("/users/{id}", updateUserHandler).Methods(http.MethodPut)
r.HandleFunc("/users/{id}", deleteUserHandler).Methods(http.MethodDelete)
log.Fatal(http.ListenAndServe(":8080", r))
}
메인
함수에서 r은
새 멀티플랙스 라우터의 인스턴스이고, HandleFunc
메서드는 경로와 핸들러 함수를 받습니다. Methods
함수는 라우트의 HTTP 메서드를 지정합니다.
Docker로 Go 앱 컨테이너화
Docker는 가장 널리 사용되는 컨테이너화 기술 중 하나입니다. Docker는 Go와 함께 구축되었으며, Docker를 사용하여 이동성을 위해 Go 앱을 컨테이너화할 수 있습니다.
빌드 지침을 지정할 새 Dockerfile을 만들어야 합니다.
아래 명령을 실행하여 프로젝트의 작업 디렉터리에 Docker파일을 생성합니다.
touch Dockerfile
Docker파일을 열고 이 빌드 지침을 붙여넣어 Docker로 Go 앱을 컨테이너화하세요.
# Use an official Golang runtime as a parent image
FROM golang:latest
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Download and install any required dependencies
RUN go mod download
# Build the Go app
RUN go build -o main .
# Expose port 8080 for incoming traffic
EXPOSE 8080
# Define the command to run the app when the container starts
CMD ["/app/main"]
Dockerfile의 빌드 지침에는 프로젝트의 Go 버전, 작업 디렉토리, 앱의 파일, Dockerfile의 빌드 지침이 지정되어 있습니다.
다음은 Dockerfile에 대한 분석입니다:
- 이 파일은 Docker 컨테이너의 기본 이미지로 공식 Golang 이미지의 최신 버전을 사용하도록 지정하는
FROM golang: latest로
시작됩니다. WORKDIR /app
줄은 컨테이너의 작업 디렉터리를/app
디렉토리로 설정합니다.COPY . /app는
현재 디렉터리의 내용을 컨테이너의/app
디렉터리에 복사합니다.RUN go 모드 다운로드는
앱의 필수 종속성을 다운로드합니다.go build -o main을 실행하면
Go 앱이 컴파일되고/app
디렉터리에main이라는
실행 파일이 생성됩니다.EXPOSE 8080
라인은 Go 앱이 수신 요청을 수신 대기하는 포트인 8080 포트를 Docker에 노출하도록 지시합니다.CMD ["/app/main"]
줄은 컨테이너가 시작될 때 실행할 명령(이 경우주
실행 파일)을 지정합니다.
Dockerfile을 실행하면 도커가 앱 이미지를 빌드하고 포트 8080에
앱을 노출합니다.
이 명령은 컨테이너를 시작하고 호스트 머신의 8080
포트를 컨테이너의 8080
포트에 매핑하며, [http://localhost:8080](http://localhost:8080)
에서 API에 액세스할 수 있어야 합니다.
Back4app에 컨테이너 배포하기
컨테이너를 배포하려면 Back4app에서 계정을 만들어야 합니다(계정이 없는 경우).
Back4app에서 계정을 만드는 단계는 다음과 같습니다.
- Back4app 웹사이트로 이동합니다.
- 랜딩 페이지의 오른쪽 상단에 있는 가입 버튼을 클릭하여 새 계정을 만듭니다.
- 마지막으로 가입 양식을 작성하여 제출합니다.
Back4app 계정을 생성한 후 계정에 로그인하고 UI 오른쪽 상단의 새 앱 버튼을 클릭합니다.
새 앱 버튼을 클릭하면 앱 배포 방법을 선택할 수 있는 페이지로 이동합니다. 컨테이너를 배포하는 것이므로 서비스형 컨테이너 옵션을 선택합니다.
다음으로 GitHub 계정을 Back4app 계정에 연결합니다. 계정의 모든 리포지토리의 소스 코드 또는 특정 프로젝트 디렉토리에 대한 액세스 권한을 Back4app에 부여하도록 선택할 수 있습니다.
배포하려는 애플리케이션(이 경우 이 튜토리얼에서 빌드한 애플리케이션)을 선택한 다음 선택을 클릭합니다.
선택 버튼을 클릭하면 이름부터 브랜치, 루트 디렉터리, 환경 변수까지 앱에 대한 정보를 입력할 수 있는 페이지로 이동합니다.
애플리케이션에 필요한 모든 환경 변수를 입력하세요. 필요한 세부 정보를 입력한 후 앱 만들기를 클릭합니다.
이 버튼을 클릭하면 아래 이미지와 같이 Go 애플리케이션의 배포 프로세스가 시작됩니다.
결론
Back4app에서 컨테이너화된 Go 앱을 배포하는 방법을 배웠습니다. 이 튜토리얼의 단계에 따라 Back4app에서 Go API를 실행해야 합니다.
Back4app에 앱을 배포하면 백엔드 인프라 관리를 간소화할 수 있는 좋은 방법입니다. Back4App은 데이터 관리, 애플리케이션 확장, 성능 모니터링을 위한 강력한 도구를 제공합니다. 서버 관리보다는 훌륭한 애플리케이션을 구축하려는 개발자에게 탁월한 선택입니다.
자주 묻는 질문
Back4App이란 무엇이고, 이것이 내 앱을 배포하기에 좋은 플랫폼인 이유는 무엇인가요?
Back4App은 서버리스 아키텍처로 애플리케이션을 빌드, 호스팅 및 확장할 수 있는 BaaS 플랫폼입니다. Back4app은 또한 컨테이너화 서비스를 제공하여 기본 인프라를 관리할 필요 없이 소프트웨어 컨테이너를 관리하고 배포할 수 있습니다.
컨테이너를 사용해 Back4app에 Rust와 같은 다른 언어를 배포할 수 있나요?
네, Docker와 같은 컨테이너화 기술을 사용하여 Back4App에 Rust를 배포할 수 있습니다. Back4App은 Rust를 포함한 다양한 프로그래밍 언어로 작성된 애플리케이션을 배포하는 데 사용할 수 있는 Docker 컨테이너를 지원합니다.
Back4App에서 컨테이너화된 애플리케이션을 확장할 수 있나요?
네, Back4App에서 기본 제공 자동 확장 기능으로 컨테이너화된 애플리케이션을 확장할 수 있습니다. 자동 확장 기능은 수요에 따라 애플리케이션 인스턴스 수를 자동으로 확장하여 앱이 증가한 트래픽과 작업 부하를 처리할 수 있도록 합니다.