앱을 구현하기에 앞서 배포를 먼저 진행하겠습니다. 현재 Vapor 앱은 로컬에서만 사용이 가능한데, 배포를 통해 URL로 접근이 가능하도록 하는 것입니다. 또한 데이터베이스를 로컬에 직접 설치하지 않고 사용해보겠습니다.
우리가 생성한 Vapor 앱을 Heroku에 배포합니다. Heroku는 클라우드 서비스형 플랫폼(Platform as a Service, PaaS)으로, 여러 언어와 데이터베이스를 지원하며 서버, 하드웨어, 인프라 등을 자동으로 관리합니다. 그리고 우리 실습에 필요한 무료 플랜이 있습니다.
Heroku 계정이 없다면 여기에서 가입 후 진행해주세요.
대시보드에서 앱을 생성합니다. 오른쪽 상단의 New
버튼을 클릭하고 Create new app
을 선택합니다. 다음으로 앱 이름을 입력하고 Create app
버튼을 클릭하여 생성합니다.
대시보드에서 앱을 선택하고 왼쪽 상단의 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
Heroku는 Git을 사용하여 앱을 배포합니다. 대시보드에서 생성한 Heroku 앱 이름을 입력하고 연결합니다.
heroku git:remote -a my-app-name
Heroku가 Vapor 처리 방법을 알 수 있도록 빌드팩을 설정합니다.
heroku buildpacks:set vapor/vapor
빌드팩은 .swift-version
파일을 통해 Swift 버전을 확인합니다. Heroku에 배포하기 위해서는 Ubuntu 최신 버전인 20.04를 지원해야 하며, Swift 5.2.4 버전부터 가능합니다. Swift 버전별 지원 플랫폼은 여기에서 확인할 수 있습니다.
echo "5.2.4" > .swift-version
Heroku는 앱 실행 방법을 알기 위해 Procfile
파일을 찾습니다. 아래 명령어로 생성합니다.
echo "web: Run serve --env production" \
"--hostname 0.0.0.0 --port \$PORT" > Procfile
앱이 데이터베이스에 접근할 수 있도록 설정합니다. 로컬 터미널에서 아래 명령어를 입력합니다.
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로 푸시하여 배포합니다.
배포에 성공하면 Postman과 같은 도구를 활용하여 API 요청을 보내고 응답을 확인해보세요.