JSCODE Logo
면접 스터디블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침

비전공자도 이해할 수 있는 CI/CD 입문

CI/CD 기본 개념 / Github Actions 기본 개념

CI/CD를 왜 배우는 걸까?
CI/CD 구축할 때 사용할 Github Actions
Github Actions를 활용한 전체적인 CI/CD 흐름
[실습] Github Actions 기본 문법 정리

백엔드 프로젝트에 CI/CD 적용하기

방법 1 - 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Github Actions)
[실습] 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Spring Boot)
[실습] 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Nest.js)
방법 2 - 일반 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Github Actions, SCP)
[실습] 일반 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Spring Boot)
[실습] 일반 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Nest.js)
방법 3 - 확장성을 고려한 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Code Deploy)
[실습] CodeDeploy 셋팅 / IAM 설정
[참고] CodeDeploy 로그 확인하는 방법
[실습] 확장성을 고려한 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Spring Boot)
[실습] 확장성을 고려한 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Nest.js)

Docker + 백엔드 프로젝트에 CI/CD 적용하기

방법 4 - 컨테이너 기반의 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Docker)
[실습] EC2에 Docker 설치, ECR 셋팅하기
[실습] 컨테이너 기반의 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Spring Boot)
[실습] 컨테이너 기반의 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Nest.jS)
방법 5 - 컨테이너 기반 + 확장성을 고려한 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Docker, CodeDeploy)
[실습] 컨테이너 기반 + 확장성을 고려한 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Spring Boot)
[실습] 컨테이너 기반 + 확장성을 고려한 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Nest.js)

웹 프론트엔드 프로젝트에 CI/CD 적용하기

Case 1 - Next.js 프로젝트에 CI/CD 적용하기 (Vercel)
← 블로그 목록으로 돌아가기

[실습] 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Spring Boot)

JSCODE 박재성
JSCODE 박재성
2025-12-01
author
JSCODE 박재성
category
CI/CD
createdAt
Dec 1, 2025
series
비전공자도 이해할 수 있는 CI/CD 입문
slug
ci-cd-for-personal-project-spring-boot
type
post
updatedAt
Dec 1, 2025 12:06 PM

✅ 1. Spring Boot 프로젝트 셋팅

  1. 프로젝트 셋팅
    1. start.spring.io
      https://start.spring.io/
      notion image
      ** JDK 17로 설치하자. 이후 과정이 전부 JDK 17에 맞춰서 진행을 할 예정이다.
 
  1. 간단한 코드 작성
    1. AppController
      @RestController public class AppController { @GetMapping("/") public String home() { return "Hello, World!"; } }
 

✅ 2. Github에 프로젝트 올리기

  1. Github에서 Repository 만들기
    1. 실무에서는 Private Repository를 쓰는 경우가 많으므로 Private Repository로 만들자.
       
  1. Github Repository에 프로젝트 코드 올리기
    1. $ cd instagram-server $ git init $ git add . $ git commit -m "first commit" $ git branch -M main $ git remote add origin _______ $ git push -u origin main
 
 

✅ 3. EC2에 들어가서 기본 환경 구성

  1. EC2 구성하기
    1. 프리티어인 t2.micro로 인스턴스를 생성하게 되면 메모리 부족으로 인해 CI/CD 과정 도중에 EC2가 멈추는 현상이 가끔 발생한다. 따라서 t3a.small로 인스턴스를 생성할 예정이다.
      만약 비용이 부담스러워서 프리티어 t2.micro를 유지한 채로 테스트하고 싶다면 아래 링크를 참고하자.
      [AWS] EC2 메모리 부족 현상 - swap 생성
      AWS 프리티어를 사용하는데 t2.micro 의 램이 1GB 밖에 되지 않아 여러 프로젝트를 동시에 돌리면 램 초과로 서버가 폭발한다. RAM 메모리가 부족한 경우를 대비해 swap 메모리를 지정해준다. swap은 RAM이 부족할 경우 HDD의 일정 공간을 RAM 처럼 사용하는 것이다. swap 공간 크기 계산 * swap 은 32MB 미만이 되면 안된다. t2.micro 에서 진행하면 사용할 수 있는 RAM은 1GB 이므로. swap 으로 2GB 정도를 생각하고 잡으면 된다. swap 생성하기 스왑 파일은 4GB(128MB x 32) sudo dd if=/dev/zero of=/swapfile bs=128M count=32 스왑 파일은 2GB(128MB x 16) sudo dd if=/dev/zero ..
      [AWS]  EC2 메모리 부족 현상 - swap 생성
      https://bsssss.tistory.com/1189
      [AWS]  EC2 메모리 부족 현상 - swap 생성
       
  1. 보안그룹 8080번 포트 열기
    1. Spring Boot는 기본적으로 8080번 포트에서 실행된다.
       
  1. JDK 설치
    1. $ sudo apt update && / sudo apt install openjdk-17-jdk -y $ java -version # 잘 설치됐는 지 확인
       
       
  1. Git clone을 활용해 프로젝트 다운받기
    1. $ git clone {git repository clone 주소}
      ** 참고) Private Repository를 clone할 경우 Github의 계정과 비밀번호를 입력해야 한다. 이 때, 비밀번호는 실제 Github 계정의 비밀번호가 아닌 Github 토큰을 입력해야 한다. 토큰을 발급받는 방법은 아래 링크를 참고하자.
      github 토큰 발급하기
      위와 같이 private으로 된 repository를 다운받으려고 하면 github의 아이디와 비밀번호를 입력하라고 한다. 그런데 이걸 맨날 private에서 public으로 바꿔서 하기엔 너무 귀찮다. 실제로도 그렇게 어렵지 않다. 5분을 참으면 하루가 편해진다. g
      github 토큰 발급하기
      https://velog.io/@nara7875/github-토큰-발급하기
      github 토큰 발급하기
       
       
  1. EC2에서 clone 받은 서버가 잘 작동하는 지 확인하기
    1. $ cd {프로젝트 경로} $ ./gradlew clean build $ cd build/libs $ nohup java -jar ________.jar & $ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
      notion image
 
 

✅ 4. 실제 코드가 업데이트 될 때 어떤 과정을 거쳐서 배포하는 지 짚어보기

  1. 내 컴퓨터에서 새로운 코드 작성
  1. Commit 찍은 뒤 Github에 Push하기
  1. EC2에 들어가서 Git Pull 받기
    1. $ cd {프로젝트 경로} $ git pull origin main
  1. 빌드 후 재배포하기
    1. $ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인 $ sudo fuser -k -n tcp 8080 # 8080번 포트에 실행되고 있는 프로세스 종료 $ ./gradlew clean build $ cd build/libs $ nohup java -jar ________.jar &
 
 

✅ 5. 매번 Github 계정과 비밀번호를 치는 과정 없애기

배포를 할 때마다 Github 계정과 비밀번호를 일일이 치는 과정이 포함되어 있으면 배포를 자동화할 수가 없다. 따라서 최초 한 번만 작성하고 그 이후에는 Github 계정과 비밀번호를 입력하지 않아도 되게 만들어보자.
$ git config --global credential.helper store $ git pull origin main # Github 계정 및 비밀번호 입력 $ git pull origin main # 더 이상 비밀번호를 안 묻는 걸 확인할 수 있다.
참고
Git, Pull/Push할 때 id password 묻지 않게 하기
배경
Git, Pull/Push할 때 id password 묻지 않게 하기
https://pinedance.github.io/blog/2019/05/29/Git-Credential
 
이 방식은 ~/.git-credentials에 로그인 정보를 저장해둠으로써 github 계정과 비밀번호를 따로 묻지 않는 방식이다. 이 방식의 단점은 EC2에 접근할 수 있는 모든 사용자가 내 Github 정보를 볼 수 있다는 점이 단점이다.
 

✅ 6. 지금까지 했던 코드 배포 과정을 자동화하기

  1. .github/workflows/deploy.yml 작성하기
    1. name: Deploy To EC2 on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: SSH로 EC2에 접속하기 uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.EC2_HOST }} # EC2의 주소 username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트 script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리 script: | cd /home/ubuntu/instagram-server # 여기 경로는 자신의 EC2에 맞는 경로로 재작성하기 git pull origin main ./gradlew clean build sudo fuser -k -n tcp 8080 || true # || true를 붙인 이유는 8080에 종료시킬 프로세스가 없더라도 실패로 처리하지 않기 위해서이다. # jar 파일을 실행시키는 명령어이다. 그리고 발생하는 로그들을 ./output.log 파일에 남기는 명령어이다. nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
      • SSH란 다른 컴퓨터로 원격 접속하는 방식을 의미한다.
      • appleboy/ssh-action의 공식 문서
        • SSH Remote Commands - GitHub Marketplace
          Executing remote ssh commands
          SSH Remote Commands - GitHub Marketplace
          https://github.com/marketplace/actions/ssh-remote-commands
          SSH Remote Commands - GitHub Marketplace
      • nohup … & 부분의 코드를 수동으로 배포할 때와 조금 다르게 작성한 이유
        • Job hangs until timeout if command starts a program that doesn't finish
 
 
  1. Github에 Secret값 넣어주기
    1. notion image
      notion image
 
 
  1. Github에 Push해서 Github Actions 잘 작동하는 지 확인하기
    1. notion image
       
       
  1. 실제 서버로 접속해서 잘 작동하는 지 확인하기
 
 
🧑🏻
벌써 자동 배포 셋팅이 끝났다! 😊😊
 
 

✅ 7. application.yml 파일 넣는 과정 자동화시키기

🧑🏻
현업 프로젝트에서는 민감한 값을 따로 application.yml로 분리하는 경우가 많다. 민감한 값이기에 .gitignore에 추가해서 application.yml가 버전관리 되지 않게 셋팅한다. 이 때문에 배포를 할 때 application.yml를 따로 넣어주어야 하는 귀찮은 과정이 포함된다. 이 과정을 자동화시켜보자.
  1. .gitignore에 application.yml 추가
    1. .gitignore
      ... application.yml
       
       
  1. application.yml 파일 만들기
    1. src/main/resources/application.yml
      aws: access-key: ABCDEFG secret-key: HIJKLMN
       
       
  1. Github에 resources 폴더가 push 되도록 임의의 파일 하나 만들어주기
    1. src/main/resources/empty.txt
       
       
  1. Gitbub Actions 코드 수정하기
    1. .github/workflows/deploy.yml
      name: Deploy To EC2 on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: SSH로 EC2에 접속하기 uses: appleboy/ssh-action@v1.0.3 env: APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }} with: host: ${{ secrets.EC2_HOST }} # EC2의 주소 username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트 envs: APPLICATION_PROPERTIES script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리 script: | cd /home/ubuntu/instagram-server # 여기 경로는 자신의 EC2에 맞는 경로로 재작성하기 rm -rf src/main/resources/application.yml git pull origin main echo "$APPLICATION_PROPERTIES" > src/main/resources/application.yml ./gradlew clean build sudo fuser -k -n tcp 8080 || true # || true를 붙인 이유는 8080에 종료시킬 프로세스가 없더라도 실패로 처리하지 않기 위해서이다. nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
       
  1. Github에 Secret 값 넣어주기
    1. notion image
       
  1. 실제 EC2에 application.yml 파일도 같이 배포 잘 됐는 지 체크하기
    1.  

✅ 8. 테스트 코드 실패하면 CI/CD 과정이 실패하는 지 확인하기

🧑🏻
./gradlew clean build의 과정에 테스트 코드를 실행시키는 과정이 포함되어 있다. CI/CD를 할 때 테스트가 실패했는데 자동으로 배포가 되면 안 된다. 테스트를 실패하면 자동 배포가 진행되지 않고 중단되는 지 확인해보자.
 
  1. Spring Boot 프로젝트에 내장되어 있는 테스트 코드가 잘 작동하는 지 실행해보기
    1. $ ./gradlew test
       
  1. 테스트 실패하게 수정하기
    1. test/…/___ApplicationTests.java
      package com.example.demo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DemoApplicationTests { @Test void contextLoads() { throw new RuntimeException("Fail!"); } }
       
       
  1. 테스트 코드 실패하면 배포가 안 되는 지 확인해보기
    1. notion image
 
author
category
createdAt
series
비전공자도 이해할 수 있는 CI/CD 입문
slug
type
series-footer
updatedAt
Dec 6, 2025 12:46 AM
📎
이 글은 비전공자도 이해할 수 있는 CI/CD 입문·실전 강의의 수업 자료 중 일부입니다.