이번 포스팅에서는 배포과정과 협업으로 Git을 사용하면서 겪은 내용들과 개념들을 정리한다.
모아로아 개발단계에서 가장 많은 시행착오를 겪은 것이 배포 단계였다.
이전에는 cloudtype을 이용해서 간단배포를 진행했었기 때문에, 이번 프로젝트를 진행하면서 AWS를 처음 사용해 많은 것들이 어려웠다.
뿐만 아니라, Git을 그저 코드 공유 장치 겸 코드 폴더 로만 사용하다가 Git Branch 전략도 사용해보고, Jira에 연결해서 사용해보기도 하고 깊게 다루어보지는 않았지만, 새로운 것들이 너무 많아 진행에 있어 많이 버벅이기도 했다.
Git을 이전에 사용할때는 일종의 코드 폴더의 개념으로 사용했지만, 협업을 하다보니, 서로의 코드를 첨삭을 해야하는 경우가 많았다.
물론 이번에 진행한 프로젝트에서는 프론트랑 백엔드의 영역을 구분지어 놓았기에 서로의 코드를 침범하지않아 큰 어려움은 없었지만, 배포까지 진행하는 프로젝트에서 Git에 버전을 작성해두지 않으면, 이후에 코드를 롤백 해야하는 경우에도 문제가 많을 것으로 예상되어, Git에 전략이 없는지 찾아보게 되었다.
Git Branch 전략에는 여러가지가 존재하지만, 큰 흐름으로는 3가지를 많이 말하는것 같다.
📌 개념
🔧 브랜치 구조
main – 운영/배포용 코드develop – 개발 완료된 코드feature/ – 기능 개발용release/ – 릴리스 준비용 (버그 수정, QA 등)hotfix/ – 운영 중 긴급 수정✅ 장점
❌ 단점
📌 개념
🔧 브랜치 구조
main – 항상 배포 가능한 상태feature/ – 기능 개발 → PR → merge → 자동 배포✅ 장점
❌ 단점
GitLab의 존재도 이때 찾아보면서 처음 알았다.
📌 개념
🔧 브랜치 구조
main – 최종 운영 코드feature/ – 기능 개발pre-production, staging, production – 환경별 브랜치issue-123-fix-login 등)✅ 장점
❌ 단점
"우리 프로젝트는 소규모 프로젝트였고, CI/CD 파이프라인을 도입해보려고 해서 GitHub Flow를 사용해봤다. 그런데 개발 과정에서 feature/ 브랜치를 나누어 작업하다 보니, 중간에 develop 브랜치를 통해 코드를 정리하는 구간이 필요할 것 같아서, GitHub Flow에 develop 브랜치를 추가하는 전략을 선택했다.
프로젝트에서 여러 사람이 협업할 때, 각 브랜치가 어떤 작업을 하고 있는지 쉽게 파악할 수 있도록 이름을 정하는 규칙을 말한다.
이전에 작업 했을때는 그냥 대충 1.1.1 이런식으로 버전을 작성하는 방식을 사용했지만, 뭘했는지 한번에 파악하기가 힘들고, 버전을 잘 지키지 않아서 곤란했던 적도 있엇다.
물론, 이번 네이밍 전략도 시간이 지남에 따라 많이 지켜지지 않기도 했지만, 이때는 무엇을 작업했는지 큰 흐름을 보기에는 필요함을 느꼈다.
우리는 Jira를 사용 중이였기에, 아래의 틀을 규칙으로 정했다.
[Jira작업번호] FE or BE / 브랜치 / 기능의이름 / #N번째 작업인가 / 간단설명
예:
[SCRUM-43] BE/feature/craft/#1 json구조 변경 및 생활재료시세
CI (지속적인 통합)
개발자들이 작업한 코드를 자주 하나로 합치는 과정으로, 코드 변경 사항을 하나로 합쳐서 테스트하는 과정이다.
간단하게, 개발자를 위해 빌드와 테스트를 자동화 하는 과정이다.
CD (지속적인 배포 - Continuous Delivery)
CI 작업을 끝낸 다음 실행하는 작업이다.
CI에서 통합되고 테스트된 코드가 배포 준비가 된 상태를 만드는 과정이다.
즉, 빌드와 테스트를 성공적으로 진행했을 때, 깃허브와 같은 코드 저장소에 자동으로 업로드하는 과정을 말한다.
CD의 또 다른 형태 - Continuous Deployment
Continuous Deployment (지속적인 배포)는 테스트까지 통과하면 자동으로 실 서비스(운영 환경)에 배포하는 방식이다.
병합한 코드의 내역을 AWS 와 같은 배포 환경으로 보내는 것을 의미하며, 이를 실무에서는 릴리스( "Release")라고 한다.
git config 명령어를 사용해 이름, 이메일 설정CI/CD 파이프라인을 구축하고 자동화할 수 있는 도구로, GitHub에서 제공하는 서비스이다.
작업 폴더 상위에, ../.github/workflows/cicd.yml 경로로 파일을 생성해준다면, 해당 파일의 내용에 맞춰서 CI/CD 작업을 해준다.
이제 GitHub Actions에 워크플로우 파일을 작성해주고, AWS와 연결을 해준다면 CI/CD 동작을 하는 것이다.
내가 작성한 폼은 다음과 같다.
main 브랜치에 푸시가 발생할 때마다 이 워크플로우가 실행.[BE]가 포함된 경우에만 이 작업이 실행.ubuntu-latest 환경에서 실행name: CI/CD
on:
push:
branches: [ main ]
jobs:
build:
if: ${{ contains(github.event.head_commit.message, '[BE]') }} # 커밋 메시지에 [BE]가 포함된 경우에만 실행
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: '17'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
working-directory: back-end
- name: Build with Gradle
run: ./gradlew clean build
working-directory: back-end
- name: Get current time
uses: josStorer/get-current-time@v2.0.2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Set artifact
run: echo "artifact=$(ls ./build/libs)" >> $GITHUB_ENV
working-directory: back-end
- name: Beanstalk Deploy
uses: einaregilsson/beanstalk-deploy@v20
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: moaloa-springboot
environment_name: MOALOA-springboot-env
version_label: github-action-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: ./back-end/build/libs/${{env.artifact}}
Amazon Web Services (AWS)에서 제공하는 플랫폼 서비스(PaaS)이다.
이 서비스는 애플리케이션을 간단하고 빠르게 배포, 관리, 확장할 수 있도록 돕는 자동화된 환경을 제공한다.
아무래도 간단한 서비스를 운영하는 것이고, 배포를 자동화 하는 것이기에 AWS Elastic Beanstalk(PaaS)를 사용했다.
AWS에서 내가 한 과정은 다음과 같다.
로컬에서 테스트할 때는 docker로 DB를 열고 인텔리제이의 DB탭을 통해 연결하거나, MySQL 워크벤치를 활용하여 DB에 접근했다. 하지만, AWS의 RDS에 접근할 때는 방법이 조금 다르다.
RDS에 접근하기 위한 방법은 여러 가지가 있지만, 퍼블릭 액세스를 허용하는 방법을 선택했다.
이렇게 하면 인텔리제이 DB탭이나 MySQL 워크벤치를 활용하여 RDS에 연결할 수 있다.
이 방법은 접근이 간단하지만, 시간당 금액이 발생한다는 단점이 있다.
따라서, 데이터베이스를 확인하거나 중간에 작업을 해야 할 때만 퍼블릭으로 전환하여 접근했다.
시간당 금액은 약 200원 정도 발생했던 것 같다.
nginx.conf)에 SSL 적용.ebextensions로 설정 유지 시도 → 실패.ebextensions 디렉토리 안에 YAML 형식의 구성 파일을 넣으면, 앱 배포 시 자동으로 해당 설정을 실행.p12 → .jks 형식 변환application.yml에 SSL 설정 추가sudo certbot --nginx -d 서버도메인
배포를 테스트한 첫날부터 약 3일간 비용이 갑자기 치솟아 당황했던 기억이있다.
비용 청구서를 토대로 구글링을 하며 비용이 왜 발생했는지를 찾았다.
Route53 을 이용해서 인증서 발급 시도했던 것으로 일부 발생.내 서버 코드를 보면 JSON파일을 통해 데이터를 저장하고, 프론트로 전달하는 방식이다.
그러나, 해당 방식으로 동작시, 정상적으로 동작하지 않았으며 이를 해결하려는 시행착오를 겪은 내용이다.
application.yml을 통해 JSON 파일의 경로를 지정했지만,.jar 같은 결과물을 가져다가 실행하기 때문에,JSON파일을 생성하게 되면, .jar이 실행되는 디렉토리에서 파일이 생성되게된다..jar 파일의 실제 위치 확인.jar 파일이 위치한 디렉터리 옆에 JSON 파일이 생성되도록 경로를 수정함.pem → .ppk로 변환하여 PuTTY에 설정우리는 크롤링을 통해 인게임의 보석 데이터를 쌓고 이를 기반으로 정보를 제공해야하는데, AWS Free Tier로 크롤링을 진행하면
여러 가지 문제가 발생할 가능성이 높다.
JSON.stringify()를 거친뒤 배포된 데이터베이스에 컬럼을 추가한다.POSTMAN을 통해서 수동으로 파일을 생성해준다.(ci/cd 구현 출처) 스프링 부트 3 백엔드 개발자되기 자바2편 책