헤로쿠(Heroku) 배포 + Springboot와 PostgreSQL 연결하기

2젼·2023년 6월 29일
0

혼자 간단한 sns 애플리케이션을 만들어보면서 배포까지 공부해보기 위해 헤로쿠를 사용해보았다.

헤로쿠 유료로 바꼈는데 왜 씀?

원래 헤로쿠는 무료로 사용이 가능했는데, 얼마전 정책이 변경되면서(무료 버전을 사용 중인 것들의 유지가 힘들다고 하던가) 무료 버전이 사라지고 유료만 남게 되었다. 그래서 헤로쿠 대신에 fly.io를 사용하려 시도를 하다가 예상치 못한 난관을 만나기도 하고 결국 실패를 해서 돈을 좀 주더라도 잘 알려져 있는 헤로쿠를 이용해보기로 했다. 월 최대 5$로 사용이 가능하니 배움의 입장에서는 그리 치명적인 금액은 아니라고 생각했다!! 또 뭐 그리 대단한 애플리케이션이라고 리소스를 그리 많이 쓸 것 같지도 않고!

아무튼, 나는 PostgreSQL 데이터베이스를 사용했다! 헤로쿠에 PostgreSQL을 올리고 이를 Springboot와 연결하는 방법을 알아보자.


헤로쿠(Heroku)에 배포하기

Github에 Heroku API key 등록하기

Github action을 이용해 main 브랜치에 push가 일어나면 자동으로 배포를 진행하기 위해 우선 Heroku에 등록한 앱의 API key를 등록시키자.

헤로쿠 사이트로 들어가 오른쪽 상단의 프로필을 클릭해 Account settings으로 들어간다.
그리고 창을 쭈욱 내려 맨 아래로 가면 아래 그림과 같이 API Key 부분이 있다.

이를 복사해 Github에 넣어줄 것이다.

이제 Github로 와서 프로젝트를 진행하고 있는 repository의 setting으로 들어간다.

그 중 Sercrets and variables 아래의 Actions에 들어가면 이 API Key를 등록할 수 있다.
왼쪽 상단의 New repository secret을 선택해 Key의 이름과 함께 헤로쿠에서 복사한 키를 붙여넣고 저장해주면 위 사진과 같이 Key 등록이 완료된다.

deploy.yml 파일 작성하기

그리고 Github action을 통한 배포를 위해 deploy.yml 파일 설정이 필요하다.
애플리케이션에 .github 폴더를 만들어 주고 workflows 폴더를 만들어 그 곳에 deploy.yml 파일을 생성하자.

deploy.yml 파일의 내용은 다음과 같다.

# This is a basic workflow to help you get started with Actions

name: Deploy

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ main ]
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3

      - name: Deploy to Heroku
        uses: AkhileshNS/heroku-deploy@v3.12.12
        with:
          # This will be used for authentication. You can find it in your heroku homepage account settings
          heroku_api_key: ${{ secrets.HEROKU_DEPLOY_KEY }}
          # Email that you use with heroku
          heroku_email:
          # The appname to use for deploying/updating
          heroku_app_name: 

name은 단순히 이름을 의미한다.
on은 언제 트리거가 될지를 명시해주는 부분이다. 여기에서는 main 브랜치에 push가 일어났을 때 트리거가 된다.
stepsuses 부분을 보면 git checkout을 수행하게 되고 헤로쿠에 deploy하게 된다.
heroku_api_key에 위에서 우리가 등록했던 HEROKU_DEPLOY_KEY 이름을 적어주면 된다. email 부분과 app_name은 헤로쿠 계정의 이메일과 헤로쿠에 만든 앱의 이름을 적어주면 된다.

system.properties 파일 작성

프로젝트 폴더 바로 아래 system.properites 파일을 하나 생성하고 아래와 같이 작성하자.

java.runtime.version = 11

이는 자바의 버전을 명시해주는 것이다. 자바 11버전부터는 이와 같이 버전을 명시해주어야 헤로쿠에서 문제가 발생하지 않는다.

Procfile 파일 작성

마찬가지로 프로젝트 폴더 바로 아래 Procfile 파일을 만들어주자.

web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/SNS-0.0.1-SNAPSHOT.jar

이는 처음에 헤로쿠 앱이 떴을 때, 어떤 동작을 수행할지 명령어를 명시해주기 위해 필요하다.

여기서 SNS 부분에는 프로젝트 이름이 들어가야 한다.

위와 같이 배포 시나리오를 작성해주면 Github의 main에 push가 될 때마다 배포를 자동으로 수행하게 된다.


Spring boot 설정

우선 Spring bootpostgreSQL을 연결하기 위한 작업이 필요하다.

당연히 build.gradle 파일 안에 아래와 같은 postgresql 사용을 위한 dependency를 추가해주자.

dependencies {
	...
	runtimeOnly 'org.postgresql:postgresql'
	...
}

다음으로 application.yaml 파일을 아래와 같이 설정하자.

spring:
  jpa:
    database: postgresql
    hibernate:
      dialect: org.hibernate.dialect.PostgreSQLDialect
      ddl-auto: update
    properties:
      hibernate:
        format_sql: true
    show-sql: true

  datasource:
    hikari:
      maximum-pool-size: 4
    url: jdbc:postgresql://
    username:
    password:
    driver-class-name: org.postgresql.Driver
  sql:
    init:
      platform: postgres

여기서 url, username, password를 설정해야한다.

해로쿠로 들어가자.

만들어진 앱에 들어가 Installed add-ons의 Configure Add-ons를 눌러 들어가자.
들어가면 헤로쿠에서 지원하는 다양한 add-on들이 뜨게 되는데, Postgresql을 사용할 것이기 때문에 Heroku Postgre를 선택해 설치해주자.


App to provision to 부분에 연결할 헤로쿠 앱을 적어주면 된다.

이게 원래 Add-on plan에 Hobby Dev - Free라고 무료 플랜이 있었는데, 사라지고 없다. ㅠㅠ
대신 제일 저렴한 가격이 월 5$이다. 공부를 위해 이 정도 쯤이야... 라고 생각하자.

그럼 다음과 같이 적용된 것을 볼 수 있다.

여기에 들어가 View Credentials...에 들어가면 Database의 정보들이 나오게 된다.

내용들은 지웠는데, Host에 해당하는 부분을 urljdbc:postgresql:// 뒤에 넣고 /를 붙이고 Database에 해당하는 부분을 넣자. 즉,

url: jdbc:postgresql://{Host}/{Database}

와 같은 형식이다.

User는 username, Password는 password에 값을 넣으면 된다.


이제 애플리케이션을 실행을 시켜보면 정상적으로 동작하는 것을 확인할 수 있다!!

이렇게 CREATE 문도 잘 동작하는 것을 확인할 수 있고, Postman을 이용해 API 테스트를 진행해보면, 데이터가 정상적으로 들어가고

헤로쿠의 Postgresql에서도 확인이 되는 모습이다.


+

이것저것 실험해보다가 뭔지 모르고 구독도 하고 그런 것 같은데.. 돈을 꽤나 쓴 것 같다... 다음 달에 청구가 되려나 겁이 좀 납니다.. 그냥 다른 무료 플랜을 제공해주는 배포 환경을 찾아 떠나는게 나을지도 모른다는 생각이 듭니다ㅠㅠ,. 애플리케이션을 끝까지 제작해보고 무료 환경인 fly.io로 넘어가는걸 시도해보겠습니다.

결론

유료라서 괜히 찝찝하다!

profile
안녕하세요:)

1개의 댓글

comment-user-thumbnail
2023년 7월 2일

유료였군요.. 다른 배포 사이트 찾아봐야겠네요ㅠ

답글 달기