1. 헤로쿠(Heroku)란?
헤로쿠란 애플리케이션을 구축, 배포, 모니터링 & 확장할 수 있도록 다양한 기능을 제공해주는 클라우드 플랫폼이다.
명확하게는 클라우드형 Pass(Platform as a service)이며, JAVA, Node.js, Python, GO, Ruby 등 여러 언어와 프레임워크 상에서 사용할 수 있다.
Heroku가 아니더라도 AWS EC2, Github pages, Netlify, Vercel 등을 통해 호스팅이 가능하다.
각 서비스 별로 무료 사용자에 대한 기능 제한이 다르기 때문에, 찾아보고 적합한 서비스를 선택하면 될 것이다.
이런 제한 사항들은 특정 기간동안만 무료로 제공하거나.. 사용할 수 있는 페이지 개수에 제한을 두는 등 제각기 다른데,
헤로쿠 같은 경우에는 무료 버전 사용 시 해당 도메인으로 30분 이상 접속이 없으면 수면상태로 돌려서
초기 접속이 굉장히 느리다는 불편한 점이 있었다! (+ dyno(서버) 사용 시간 월 550시간 제한)
그러나 사용 방법이 비교적 쉬우며, 가볍기 때문에 토이 프로젝트 등에 활용하기 굉장히 좋을 것 같다.
(+ 2022년 11월 28일부로 무료 버전 지원이 종료된다고 한다..ㅠㅠ)
2. 사용법(프로젝트 배포하기)
Heroku를 통해 프로젝트를 배포하기 위해, 먼저 Heroku 계정을 생성해야 한다.
Heroku 사이트(https://id.heroku.com/login) 에서 회원가입 & 로그인을 진행한 뒤,
화면상에서 보이는 Create new app을 클릭해 새로운 앱을 생성한다.
(초기 로그인 시 사이트 정가운데에 Create new app이 뜬다.)
App name을 입력한 뒤 Create app을 누르면, 앱이 생성되고 해당 앱의 Deploy 탭이 나온다.
배포할 수 있는 방법은 화면에 보이는 세 가지인데(Deployment method),
각각 Heroku Git은 Git을 이용하는 방법,Github는 깃허브와 연동하는 방법이며 Container Registry는 도커 기반의 앱을 배포할 때 쓰인다고 한다. method를 선택하면 밑에 아주 친절하게 배포 방법 설명이 나온다.!
요약하자면,
2.1. Heroku CLI 설치하기 + Heroku 로그인
Heroku CLI 설치 링크: https://devcenter.heroku.com/articles/heroku-cli
$ heroku login
2.2. Git 설정
$ cd my-project/
$ git init
$ heroku git:remote -a [heroku에 등록한 app name]
2.3. 배포
$ git add .
$ git commit -am "make it better"
$ git push heroku master
위 명령어는 변경사항이 생겼을 때 배포하는 방법으로, 커밋할 변경사항이 없다면 아래 명령어만 입력하면 된다.
$ git push heroku master
나의 경우는 git push heroku master 명령어로는 에러가 나서 구글링 해본 결과,
git push heroku HEAD:master 명령어를 실행하면 정상적으로 배포가 되었다.
2.4. 기타 명령어
변경사항이 있다면 앱을 재시작해주는 것이 좋은데, 재시작은 다음 명령어로 수행할 수 있다.
heroku restart
서비스 로그를 보는 명령어 - 에러가 날 때 에러메시지가 상세하게 뜬다.
heroku logs --tail
자세한 명령어는, 공식 문서에!
2.5. 설정할 것들 + 에러 해결 (Node.js 기준)
(Node.js 기준입니다.)
배포 후 여러 에러를 겪었는데, 대표적인게 start script가 없다는 에러였다.
heroku에서 자체적으로 npm start 명령어를 찾아서 앱을 실행하는데, package.json의 scripts 부분에 start가 없어서 생기는 문제점으로 start 스크립트를 실행해주니 해결되었다.
(+ start 스크립트 안에 nodemon 사용 시에도 에러 발생)
Heroku는 기본적으로 앱 시작 시 npm start 명령을 실행하는데,
이러한 기본 실행 명령어는 Procfile을 통해 변경 가능하다.
애플리케이션의 루트 디렉토리(최상단 디렉토리)에 Procfile이라는 이름의 파일을 추가한 뒤, (확장자 없음에 주의)
다음과 같이 선언함으로써 서버(dyno) 시작 시 실행할 명령어를 직접 지정해줄 수 있다.
(자세한 내용은 공식문서 참고)
3. 수면 상태 방지
Heroku 무료 버전 이용 시 30분 동안 접속이 없으면 수면 상태로 전환되기 때문에, 30분마다 자동으로 요청을 보내주는 서비스가 있다.
꼭 이런 서비스를 이용하지 않더라도, 자바스크립트 setInterval()이나 Node.js의 node-cron, 리눅스의 crontab 등을 이용하면
30분마다 요청을 보내서 수면 상태를 방지할 수 있을 것 같다는 생각을 했다.
4. 더 알아볼 것
내가 Heroku를 통해 배포한 첫 프로젝트의 경우 DB로 SQLite3을 사용했는데,
SQLite3의 경우 변경사항이 생겨서 서버(dyno)가 재실행될 때마다 DB가 초기화되어버리는 문제가 있었다.
찾아보니 Heroku가 SQLite를 지원하기는 하지만, 이런 문제가 있기 때문에 PostgreSQL 데이터베이스를 사용하기를 권장한다고 한다.
이참에 PostgreSQL에 대해서도 배워봐야겠다!
5. 참고 링크 - 학습에 도움된 자료들
- ttps://velog.io/@ansfls/Heroku로-간단하게-웹-사이트-배포하기
- https://namu.wiki/w/Heroku
- https://tour.dlang.org/tour/kr/vibed/deploy-on-heroku
- https://programming4myself.tistory.com/5
- https://taeny.dev/javascript/nextjs-with-deployment-platform