heroku + go

요즘 Golang에 빠졌다. 책 한권을 다 읽고 Go의 병렬처리를 이용한 서비스를 만들었고, echo 기반의 웹으로 만들어서 배포해보고 싶었다. 갓 헤로쿠에서는 Go도 지원한다. 처음엔 조금 헤맸는데, 몇 번 시도 끝에 성공했다.

먼저 헤로쿠에 프로젝트를 하나 생성하고, 깃을 연결한다. 나는 깃허브 계정의 프로젝트를 연결했는데, Auto Deploy를 설정하면 커밋할 때마다 다시 빌드 후 배포해줘서 편하다.(이 과정에 대한 설명은 생략하겠다)

Procfile 만들기

프로젝트 최상단에 Procfile 파일을 만든다. 헤로쿠의 배포 설정에 대한 부분이고 확장자는 없다.

1
web: go-project-name

go-project-name은 본인 프로젝트의 이름에 맞게 수정하면 된다. Procfile 설정은 끝이다.

의존성 추가하기

1
go mod init github.com/user-name/project-name

본인의 깃허브 레파지토리에 맞게 go mod init 명령어를 실행하면 go.mod 파일이 생성된다. go mod 파일에 require 항목을 작성해야 하는데, VSCode + Go 환경인 경우 go.mod 최상단에 보이는 버튼으로 자동으로 require 항목을 작성해주고, 의존성에 따른 vendor 폴더까지 자동으로 만들어준다.

1
2
3
4
5
6
7
8
9
module github.com/zinirun/eden-zip

go 1.15

require (
github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.3.0 // indirect
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
)

내 프로젝트에 적용한 go.mod 파일의 예시이다. // indirect 주석이 달린 의존성은 프로젝트에서 직접 추가한 패키지가 아닌, 패키지에서 요구되는 또 다른 의존성 패키지라는 의미이다.

포트 설정하기

이번 프로젝트에는 Echo 프레임워크를 사용했는데, 다른 웹 프레임워크도 포트 설정은 비슷하게 할 것이다. 포트를 하드코딩하는 것이 아닌 os.Getenv("PORT")로 포트를 잡아줘야 헤로쿠 내부의 포트로 정상적으로 실행된다.

1
2
3
4
func main(){
e := echo.New()
e.Start(":" + os.Getenv("PORT"))
}

기존에는 :1323 등의 방법으로 로컬에서 실행했지만, 배포시 :ENV상의 PORT로 설정해준다.

Commit and Push

이제 설정을 마친 레파지토리를 커밋 후 푸시하면 헤로쿠에 배포된다. 헤로쿠 웹페이지에서 빌드 과정, 로그를 확인할 수 있다. 프로그램 실행 중의 로그를 볼 수도 있다.

1
heroku logs -a 앱이름

로그의 일부인데, 빌드가 정상적으로 끝났지만 웹이 열리지 않는 경우 로그를 보면 해결에 도움이 된다.