카테고리 없음

ci cd와 배포 파이프라인

ondalgirl 2026. 9. 21. 19:52

내 코드가 서비스가 되기까지 — CI/CD와 Docker 배포 파이프라인

지금까지 우리는 프론트엔드, 백엔드, DB, 서버 인프라를 하나씩 배웠어요. 근데 정작 "내가 짠 코드가 어떻게 실제 서비스가 되는 걸까?" 하는 부분은 아직 안 다뤘죠? 오늘은 그 마지막 퍼즐 조각, CI/CD 파이프라인을 편하게 정리해볼게요.

코드를 푸시하면 무슨 일이 벌어질까?

개발자가 코드를 푸시하면, 그 안에는 두 가지가 같이 들어가요.

  • 비즈니스 코드: 실제 기능을 담은 코드
  • 테스트 코드: 그 기능이 제대로 동작하는지 검증하는 코드

이 코드가 실제 서비스로 나가기까지, 크게 세 단계를 거쳐요. 빌드(CI) → 배포(CD) → 운영. 하나씩 따라가 볼게요.

1단계: 빌드 (CI, Continuous Integration)

**CI(Continuous Integration)**는 코드를 실행 가능한 상태로 만들고, 제대로 동작하는지 검증하는 과정이에요.

패키징 — 소스랑 라이브러리 합치기

먼저 소스 코드랑 필요한 라이브러리를 하나로 합쳐요. 이 방식은 언어마다 달라요. 그다음 컨테이너 이미지 빌드를 하는데, 이건 옵션이에요 — 그냥 VM에서 바로 실행할 거면 굳이 안 해도 돼요.

테스트 — 제대로 동작하는지 확인

테스트 코드를 실행해서 정상적으로 동작하는지 확인하는 단계예요. 여기서 중요한 지표가 하나 있어요.

코드 커버리지: 전체 비즈니스 코드 중에서 테스트 코드가 몇 %나 검증하고 있는지를 나타내는 지표예요. 이상적인 목표치는 보통 80% 정도로 잡아요.

2단계: 배포 (CD, Continuous Deployment)

**CD(Continuous Deployment)**는 빌드된 결과물을 실제로 서버에 올려서 실행시키는 과정이에요. 이때 VM이냐 컨테이너냐에 따라 방식이 조금 달라요.

  • VM에 배포할 때: 패키징된 파일이랑 관련 파일들을 서버에 올린 다음, 실행 명령을 수행해요.
  • 컨테이너로 배포할 때: 컨테이너 이미지를 pull(다운로드)받은 다음, 컨테이너를 실행해요.

3단계: 운영 — 서비스가 잘 돌아가는지 지켜보기

배포하고 끝이 아니죠. 서비스가 잘 돌아가는지 계속 지켜봐야 해요.

  • 모니터링(Monitoring): CPU, 메모리 같은 리소스 사용 현황(Metric)을 수집·저장하고, 화면으로 시각화해서 보여주는 것
  • 로깅(Logging): 애플리케이션이 실제로 어떻게 쓰였는지 기록(사용 기록)을 수집·저장하고, 화면으로 시각화해서 보여주는 것

이렇게 빌드 → 배포 → 운영까지 이어지는 자동화된 단계 전체를 묶어서 CI/CD 파이프라인이라고 불러요.

컨테이너는 실제로 어떤 4가지로 이루어져 있을까?

컨테이너 이미지를 좀 더 뜯어보면, 이렇게 4가지 층으로 구성돼요.

층 설명

소스 우리가 짠 코드
라이브러리 코드가 의존하는 외부 패키지들
런타임 코드를 실제로 실행시켜주는 환경
OS 운영체제

여기서 재밌는 포인트! 런타임이랑 OS, 이 두 가지는 Dockerfile 안의 FROM 뒤에 오는 Base image에 미리 정의돼 있어요. 나머지 소스라이브러리를 합치는 방식은 언어마다 달라요.

 

  • 파이썬, Node, JavaScript 등 같은 인터프리터 언어는 라이브러리 설치 후 소스 코드를 바로 읽어서 실행해요.
  • 인터프리터 언어가 아닌 경우엔, 미리 실행 파일을 따로 만들어둬요(컴파일).

그리고 이 컨테이너의 구조를 정의하는 설계도 파일이 바로 Dockerfile(manifest)이에요.

실제로 코드가 서비스로 올라가는 전체 흐름

이제 이 모든 걸 실제 그림으로 따라가 볼게요. 순서를 크게 4단계로 나눌 수 있어요.

① 내 PC에서 이미지 빌드하기

  1. Dockerfile(이미지 manifest)을 준비해요.
  2. Docker CLI로 빌드를 요청해요. 이때 "이미지명"이랑 "manifest 위치"라는 두 가지 정보가 필요해요. 명령어로 치면 이런 식이에요.
    docker build -t member -f Dockerfile
    
  3. 이 요청을 Docker Daemon(PC에서는 보통 Docker Desktop이 이 역할을 해요)이 받아서, Dockerfile을 참조해 실제로 컨테이너 이미지를 생성해요.

② 이미지 저장소에 올리기

만들어진 컨테이너 이미지를 DockerHub(hub.docker.com) 같은 이미지 저장소에 업로드해요. 이렇게 하면 어디서든 이 이미지를 꺼내 쓸 수 있게 돼요.

③ 실행할 서버에서 이미지 다운로드하기

이제 실제로 서비스를 돌릴 VM이나 베어메탈 서버로 이동해요. 이 서버가 DockerHub에서 이미지를 다운로드해요.

docker pull {image명}

④ 컨테이너 실행하기

다운로드한 이미지로 실제 컨테이너를 실행해요.

docker run {이미지명}

이렇게 실행된 컨테이너가 바로 우리가 접속하는 서버가 되는 거예요!

정리해볼게요

내가 짠 코드가 실제 서비스가 되기까지 이런 여정을 거쳐요.

코드 푸시 → CI(패키징 + 컨테이너 이미지 빌드 + 테스트) → CD(이미지 업로드 → 다운로드 → 실행) → 운영(모니터링 + 로깅)

그리고 이 전체 과정을 자동화해둔 게 CI/CD 파이프라인이에요. 한 번 파이프라인을 잘 만들어두면, 그다음부터는 코드를 푸시할 때마다 빌드-테스트-배포가 자동으로 착착 진행돼서 훨씬 편하게 서비스를 운영할 수 있어요.

이제 데이터베이스부터 API, 서버 인프라, 네트워크, 스케일링, 그리고 오늘의 CI/CD까지 — 백엔드 서비스 하나가 만들어지고 운영되는 전체 그림이 완성됐어요. 

 

내 PC에서 빌드 — Dockerfile로 이미지를 만들고
DockerHub에 업로드 — 만든 이미지를 저장소에 올려두고
실행 서버가 다운로드 — 실제 서비스가 돌아갈 서버(VM/베어메탈)가 그 이미지를 받아오고
컨테이너 실행 — 받은 이미지로 컨테이너를 띄우면 서비스 시작!

한마디로 "내 컴퓨터에서 만든 걸 → 택배(DockerHub)로 보내고 → 서버가 받아서 → 풀어서 쓰는" 흐름이에요