본문 바로가기
2022.10.29 이전 버전

spring, postgresql, github 활용한 배포 ci/cd 구축

by 구름같이 푹신한 공간 2022. 8. 28.

저번 글에 댓글로 직접 찍은 사진이냐는 질문이 있어서 이번에는 직접 촬영한 사진을 올리겠습니다.

사진 용량이 커서 불편할 수 있다는 생각은 잠시 넣어두겠습니다.

 

2025.01.13 공지
heroku는 현재 유료화 되었습니다.
따라서 다른 서비스를 이용하시는 것이 좋을 것 같습니다.
추천하는 것은 AWS 입니다.

1. 설명

이번 주제는 spring 프로젝트를 github와 heroku를 활용해서 자동 배포 환경을 구축하는 데에 있습니다.

 

이번 주제를 알기 위해서는 spring & github & github action & heroku & ci/cd & spring Jpa 에 대해서 조금은 알고 진행하면 이해가 빠를 것입니다.

( & 표시는 and 를 뜻 합니다. )

 

모르신다면 다양한 교육 영상을 아래에 첨부할 테니 참고 부탁드립니다.

저도 아래의 영상을 시청하고 공부 하면서 진행했습니다.

 

주의 사항

 

1. 글의 내용을 최대한 상세하게 알려드리기 위해서 많을 수 있습니다. 

- 중간 중간 잡담이 있습니다.

2. 위에서 부터 모든 내용을 보면서 진행해주세요 중간부터 보시면 모를 수 있습니다. 

2. 내용

2. 1. 세팅

저는 spring 프로젝트를 인텔리제이의 도움을 받아서 하나 만들었습니다.

저는 java 17, gradle로 프로젝트를 생성하였습니다.

dependencies는 아래와 같습니다.

 

참고 ) 개발환경이랑 배포환경의 데이터 베이스를 다르게 하기위해서 h2도 받고 있습니다. 

( 지금은 몰라도 됨 )

지금 있는 스타벅스가 오픈한지 얼마 안되서 사람이 너무 많네요 ㅠㅜ

 

간단한 테스트용 HelloController 를 만들었습니다. 실행 시키고 localhost:8080으로 접속해 보시면 Hello World! 가 잘 나옵니다.

그리고 정말 간단한 member entity를 작성해 주었습니다.

 

참고 : 크기가 작아서 글자가 안보인다면 ... 죄송합니다. 글의 길이를 생각해서 줄였습니다.

2. 2 application.properties 설정

저는 properties 보단 yml 파일이 좋기 때문에 확장자를 변경하겠습니다.

위에서 말씀 드렸다 시피 개발 환경과 배포 환경에 db를 다르게 하기 위해서 spring profile을 사용했습니다.

 

추가 적으로 spring boot 2.4 버전 부터 사용가능합니다.

https://tangoblog.tistory.com/13

 

Spring Boot 2.4 변경 내용

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes https://spring.io/blog/2020/11/12/spring-boot-2-4-0-available-now 주관적인 주요 변경 사항 JUnit 5’s Vintage Engine..

tangoblog.tistory.com

spring:
  config:
    activate:
      on-profile: local || prod

위 코드 따라 치지 마세요 예시 입니다.

 

위 형식으로 지금 현재 어떤 환경이라는 것을 명시 하고 있습니다. 명시가 된다면 해당 환경 --- 안에 감싸져 있는 코드가 실행됩니다.

저는 로컬 환경에서는 h2 db를 배포 환경에서는 postgresql db를 사용합니다.

 

application.yml 작성

spring:
  profiles:
    active: prod
    group:
      development:
        - local
      production:
        - prod

server:
  port: ${PORT}
---
#현재 개발 또는 배포 환경을 나타내는 설정
spring:
  config:
    activate:
      on-profile: local
#h2 db에 접속하기 위한 설정
  datasource:
    url: jdbc:h2:mem:test
    username: sa
    password:
    driver-class-name: org.h2.Driver
#h2 console 을 사용한다는 설정
  h2:
    console:
      enabled: true
      path: /h2-console
#jpa에 대한 설정들
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
    database: h2
#log에 대한 설정
logging:
  level:
    org.hibernate.sql: debug

---

spring:
  config:
    activate:
      on-profile: prod

  datasource:
    #heroku에 설정 값들을 반영하는 것 아래에서 설명 드림
    url: jdbc:${DB_URL}
    username: ${DB_USER}
    password: ${DB_PASSSWORD}
    driver-class-name: org.postgresql.Driver

  jpa:
    properties:
      hibernate:
        format_sql: true
    database: postgresql
    show-sql: true
    #조금 특별한 설정이 있습니다. postgreSQL은 해당 언어를 설정해주어야 합니다. 자세한 사항은 저도 모르겠습니다.
    #아시는 분이 있다면 댓글 부탁드립니다.
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    #db에 내용이 수정된게 있으면 반영한다.
    hibernate:
      ddl-auto: update


logging:
  level:
    org.hibernate.sql: debug

 

이 설정에서 굉장히 고생했다 ....

참고로 이 설정이 전부이다..... 아무튼

2. 3 .github/workflows 설정

생활코딩님의 github action 강의를 보고 오셨다면 쉽게 이해가 되실 거에요!!

https://www.youtube.com/watch?v=uBOdEEzjxzE 

 

github action 을 정의하기 위해서 아래의 코드를 첨부 하겠습니다.

제가 이번 배포를 공부하면서 작성한 깃 허브 입니다. 

 

와서 팔로워 걸어주시면 감사하겠습니다!

 

그 중에서 .github/workflows/deploy.yml 파일을 보시면 됩니다.

https://github.com/cloudwi/heroku_ci_cd

 

GitHub - cloudwi/heroku_ci_cd

Contribute to cloudwi/heroku_ci_cd development by creating an account on GitHub.

github.com

 

deploy.yml 파일을 작성한다.

name: deploy

#github에 push를 하면 작동한다.
on:
  push:
    branches: [ "main" ]

#이 액션은 아래의 일을 합니다.
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      #내 github repo를 가지고 온다.
      - name: checkout backend
        uses: actions/checkout@v2
      #해당 pc에 자바를 설치하고
      - name: Setup-java
        uses: actions/setup-java@v2
        with:
          distribution: 'temurin'
          java-version: '17'
      #헤로쿠에 배포한다.
      - name: deploy to heroku
        uses: akhileshns/heroku-deploy@v3.12.12
        with:
          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
          heroku_app_name: "cloudwi"
          heroku_email: "cloudwi@naver.com"

2. 4 github action Secrets

헤로쿠에 로그인 하지 않았는데 어떻게 배포가 자동으로 되냐라는 질문을 할 수 있을 것입니다. 그것은 아래쪽 스크린샷에서 확인 가능합니다.

 

나의 프로필에서 Account settings 파일 안으로 들어가면 API Key가 있습니다. 이 키를 활용해서 github action에서 heroku로 배포를 자동화 할 수 있습니다.

 

그럼 위 API Key의 Reveal 버튼을 누르면 실제 값을 볼 수 있는데 그 값을 복사해주세요

복사하신 값으로 github Secrets -> Actions 아래에 New repository secret 을 만들어 주시면 됩니다. 

여기에서 작성한 name으로 위에서 작성한 secret.<작성한 name> 불러올 수 있습니다.

그리고 헤로쿠 앱의 이름과 이메일을 추가로 기입하시면 배포가 자동적으로 됩니다.

 

2. 5 db 설정

application.yml  에서 또 모르는 부분이 있을 수 있다. 그것은 데이터 베이스 url, username, password 가 환경변수 선언이 된 것 이다.

하지만 로컬어디에도 저는 저 환경변수를 정의하지 않았습니다. 

 

이유는 헤로쿠 배포 환경에서 환경변수를 주입해주고 있기 때문입니다. 

 

위 url, username, password는 공개하면 안되는 값들 입니다. 

 

참고 : 공개가 된다면 많은 피해를 입을 수 있죠.

 

따라서 헤로쿠에서 환경변수 설정을 해주었습니다.

 

여기서 데이터 베이스는 어떤 걸 이용했냐고 물어볼 수 있습니다.

헤로쿠에서 지원하는 클라우드 환경의 postgresql db를 사용했습니다.

db Settings에 들어가면 url, user, password 를 볼 수 있습니다.

이 값을 헤로쿠 앱의 Config Vars로 설정해주면 됩니다.

 

설정된 모습을 아래에서 볼 수 있다.

여기서 자세히 보면 Config Vars 값들이 위의 application.yml 값들과 똑같은 것을 볼 수 있다. ${} 형식으로 사용하면됩니다.

3. 검증

이제 검증의 시간입니다.

잘 배포가 되었는지 한번 보도록 하겠습니다.

보시면 액션을 사용하고 있는 것을 볼 수 있고 잘 빌드 되는 것을 볼 수 있습니다. 

 

들어와서 봐주세요!

 

https://github.com/cloudwi/heroku_ci_cd/actions

 

GitHub - cloudwi/heroku_ci_cd

Contribute to cloudwi/heroku_ci_cd development by creating an account on GitHub.

github.com

헤로쿠에서도 잘 빌드 되고 있습니다. !!!! 굿굿 

끝 으로 배포된 사이트를 방문해 보세요 !!! 굿 입니다.

https://cloudwi.herokuapp.com/

 

Title

 

cloudwi.herokuapp.com

 

글에 문제가 있거나 의견이 있다면 언제든지 댓글 부탁드립니다.

글에 업데이트를 요구할 수 있습니다. 댓글로 부탁드립니다.