Vapor App 배포하기

앱을 구현하기에 앞서 배포를 먼저 진행하겠습니다. 현재 Vapor 앱은 로컬에서만 사용이 가능한데, 배포를 통해 URL로 접근이 가능하도록 하는 것입니다. 또한 데이터베이스를 로컬에 직접 설치하지 않고 사용해보겠습니다.

우리가 생성한 Vapor 앱을 Heroku에 배포합니다. Heroku는 클라우드 서비스형 플랫폼(Platform as a Service, PaaS)으로, 여러 언어와 데이터베이스를 지원하며 서버, 하드웨어, 인프라 등을 자동으로 관리합니다. 그리고 우리 실습에 필요한 무료 플랜이 있습니다.

가입

Heroku 계정이 없다면 여기에서 가입 후 진행해주세요.

앱 생성

대시보드에서 앱을 생성합니다. 오른쪽 상단의 New 버튼을 클릭하고 Create new app을 선택합니다. 다음으로 앱 이름을 입력하고 Create app 버튼을 클릭하여 생성합니다.

PostgreSQL 추가

대시보드에서 앱을 선택하고 왼쪽 상단의 Resources 탭을 클릭합니다. Add-ons 섹션에서 postgres를 입력하고 Heroku Postgres를 선택합니다. 다음으로 Hobby Dev - Free 플랜을 선택하고 Submit Order Form 버튼을 클릭하여 추가합니다.

이제 Heroku 앱을 구성했으니, 다음 단계부터는 로컬 터미널에서 진행합니다.

설치

Homebrew를 통해 Heroku CLI를 설치합니다.

brew install heroku/brew/heroku

로그인

Heroku 계정에 로그인합니다.

heroku login

정상적으로 로그인되었는지 확인합니다.

heroku auth:whoami

Git

Heroku는 Git을 사용하여 앱을 배포합니다. 대시보드에서 생성한 Heroku 앱 이름을 입력하고 연결합니다.

heroku git:remote -a my-app-name

빌드팩 설정

Heroku가 Vapor 처리 방법을 알 수 있도록 빌드팩을 설정합니다.

heroku buildpacks:set vapor/vapor

.swift-version 생성

빌드팩은 .swift-version 파일을 통해 Swift 버전을 확인합니다. Heroku에 배포하기 위해서는 Ubuntu 최신 버전인 20.04를 지원해야 하며, Swift 5.2.4 버전부터 가능합니다. Swift 버전별 지원 플랫폼은 여기에서 확인할 수 있습니다.

echo "5.2.4" > .swift-version

Procfile 생성

Heroku는 앱 실행 방법을 알기 위해 Procfile 파일을 찾습니다. 아래 명령어로 생성합니다.

echo "web: Run serve --env production" \
  "--hostname 0.0.0.0 --port \$PORT" > Procfile

PostgreSQL 설정

앱이 데이터베이스에 접근할 수 있도록 설정합니다. 로컬 터미널에서 아래 명령어를 입력합니다.

heroku config

명령어를 입력하면 다음과 같이 출력됩니다.

=== my-app-name Config VarsDATABASE_URL: postgres://cybntsgadydqzm:2d9dc7f6d964f4750da1518ad71hag2ba729cd4527d4a18c70e024b11cfa8f4b@ec2-54-221-192-231.compute-1.amazonaws.com:5432/dfr89mvoo550b4

DATABASE_URL은 Heroku Postgres를 나타냅니다. 이 URL은 Heroku에 의해 변경될 수 있기 때문에 하드코딩하여 사용하면 차후에 오류가 발생할 수 있습니다. 따라서 Environment.get("DATABASE_URL")과 같이 접근하여 사용하도록 합니다.

configure.swift 파일에 데이터베이스 설정 코드를 추가합니다.

if let databaseURL = Environment.get("DATABASE_URL"), var postgresConfig = PostgresConfiguration(url: databaseURL) {
    postgresConfig.tlsConfiguration = .forClient(certificateVerification: .none)
    app.databases.use(.postgres(
        configuration: postgresConfig
    ), as: .psql)
} else {
    // ...
}

배포

Heroku는 기본적으로 master 브랜치를 배포합니다. master 이외의 브랜치를 배포할 경우 branch-name:master와 같이 입력합니다.

git push heroku master

배포 도중 error: missing LinuxMain.swift file in the Tests directory라는 유실 오류가 발생하면 Tests 디렉터리에 빈 LinuxMain.swift 파일을 생성합니다.

cd Tests
touch LinuxMain.swift

스케일링

빌드를 성공적으로 마치면 하나 이상의 서버를 추가해야 합니다. 무료 플랜은 하나의 웹 다이노(리눅스 컨테이너)만 스케일링이 가능합니다.

heroku ps:scale web=1

마이그레이션

데이터베이스 마이그레이션을 수행합니다.

heroku run Run -- migrate --env production

지속적인 배포

위 과정은 최초 한 번만 수행합니다. 이후 업데이트마다 최신 변경 사항을 Heroku로 푸시하여 배포합니다.

API 테스트

배포에 성공하면 Postman과 같은 도구를 활용하여 API 요청을 보내고 응답을 확인해보세요.