스프링 부트 백엔드 개발 강좌, 깃허브 액션 스크립트 작성하기, CD

깃허브 액션 스크립트 작성하기: 지속적 배포(CD)

현대 소프트웨어 개발에서 지속적 배포(Continuous Deployment, CD)와 지속적 통합(Continuous Integration, CI)은 필수적인 요소입니다. 특히 스프링 부트를 사용하여 백엔드 애플리케이션을 개발할 때, 이러한 프로세스를 자동화하면 개발자의 생산성을 크게 향상시킬 수 있습니다. 이번 강좌에서는 스프링 부트 애플리케이션을 GitHub Actions를 사용하여 자동으로 배포하는 방법을 살펴보겠습니다.

1. 스프링 부트란?

스프링 부트(Spring Boot)는 스프링 프레임워크의 확장으로, 단독 실행 가능한 스프링 애플리케이션을 쉽게 개발할 수 있도록 돕는 오픈 소스 프레임워크입니다. 기존 스프링 프레임워크를 보다 단순하고 신속하게 사용할 수 있게 해주는 여러 유용한 기능을 제공합니다. 특히 초기 설정에 대한 부담을 줄여주고, 내장 서버(예: 톰캣, 제티)를 통해 빠르게 애플리케이션을 실행할 수 있도록 지원합니다.

2. GitHub Actions란?

GitHub Actions는 GitHub에서 제공하는 CI/CD 도구로, 코드의 변경 사항을 감지하여 자동으로 작업을 실행할 수 있도록 해줍니다. 사용자는 YAML 파일 형식으로 워크플로우를 정의하고 관리할 수 있으며, 다양한 이벤트(푸시, 이슈 생성 등)에 의해 트리거될 수 있습니다. 이를 활용하면 테스트, 빌드, 배포 등의 작업을 자동화할 수 있습니다.

3. 사전 준비

  • 스프링 부트 애플리케이션을 이미 개발했거나 생성해야 합니다.
  • GitHub에 해당 프로젝트를 리포지토리로 생성해야 합니다.
  • GitHub Actions를 사용하기 위해 GitHub 계정이 필요합니다.

4. 스프링 부트 애플리케이션 생성하기

스프링 부트 애플리케이션을 생성하기 위해 Spring Initializr를 사용할 수 있습니다. 적절한 메타 정보를 설정하고 필요한 종속성을 추가하여 프로젝트를 다운로드합니다. 예를 들면, 웹(application), JPA, H2 데이터베이스를 선택할 수 있습니다.

 
// 예시 Maven 의존성 (pom.xml)
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

5. GitHub 리포지토리 생성하기

GitHub에 접속하여 새로운 리포지토리를 생성합니다. 리포지토리 이름은 프로젝트에 맞게 설정하고, ‘Initialize this repository with a README’ 옵션을 선택할 수 있습니다. 이후 자신의 로컬 프로젝트를 GitHub 리포지토리에 푸시합니다.


# 로컬 프로젝트 디렉토리에서 실행
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/username/repository.git
git push -u origin main

6. GitHub Actions 워크플로우 작성하기

이제 GitHub Actions 워크플로우 파일을 생성해야 합니다. `.github/workflows` 디렉토리 아래에 YAML 파일을 생성합니다. 예를 들어, `ci.yml` 파일을 생성하여 아래와 같이 작성합니다.


name: CI

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Build with Maven
        run: mvn clean package

7. 배포 워크플로우 작성하기

기본 CI 워크플로우를 설정한 후, 이제 CD를 위한 워크플로우를 작성합니다. 여기서는 예를 들어 AWS EC2에 배포하는 과정을 설명하겠습니다. 새로운 YAML 파일인 `deploy.yml`을 생성하고 아래와 같이 작성합니다.


name: Deploy to EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Build with Maven
        run: mvn clean package

      - name: Deploy to EC2
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          port: 22
          source: target/*.jar
          target: /path/to/deploy/

여기서 사용한 `appleboy/scp-action`은 SSH를 사용하여 EC2 인스턴스에 파일을 전송하는데 도움이 되는 액션입니다. 각 항목은 GitHub Secrets에 저장하여 보안을 강화할 수 있습니다.

8. GitHub Secrets 설정하기

이제 CI/CD 워크플로우에서 사용하는 비밀 변수를 설정해야 합니다. GitHub 리포지토리 페이지에서 ‘Settings’ -> ‘Secrets and variables’ -> ‘Actions’로 가서 숨겨야 할 비밀 변수를 추가합니다. 예를 들어:

  • EC2_HOST: EC2 인스턴스의 IP 주소
  • EC2_USER: SSH 사용자 이름
  • EC2_SSH_KEY: SSH 개인 키

9. GitHub Actions 실행 확인하기

모든 설정이 완료되면, 리포지토리의 main 브랜치에 커밋하고 푸시합니다. 이때 GitHub Actions가 자동으로 트리거 되어 설정한 CI/CD 프로세스가 실행됩니다. ‘Actions’ 탭에서 실행 로그를 확인하며 각 단계의 성공 여부를 점검할 수 있습니다.

10. 결론

이번 강좌에서는 스프링 부트 백엔드 애플리케이션을 GitHub Actions를 활용하여 자동으로 배포하는 방법에 대해 알아보았습니다. GitHub Actions는 간단한 YAML 파일만으로 CI/CD 프로세스를 설정할 수 있게 해주어, 다양한 작업을 자동화할 수 있는 강력한 도구입니다. 이를 통해 개발자의 생산성을 높이고 배포의 신뢰성을 향상시킬 수 있습니다. 추가적으로, 다른 클라우드 제공업체와 연동하거나, Docker를 사용한 배포 등의 확장을 고려해볼 수 있습니다.

참고 자료