CS/개발상식

CI/CD

glorypang 2025. 8. 2. 17:38
728x90
반응형
SMALL

CI/CD란

소프트웨어 개발이 점점 복잡해지면서, 전통적인 개발 방식은 다음과 같은 문제점들을 안고 있었습니다:

  1. 통합 지옥(Integration Hell)
    여러 개발자가 각자 브랜치에서 개발을 진행한 뒤, 며칠 또는 몇 주 단위로 코드를 한꺼번에 병합하면 충돌(conflict)이 자주 발생하고, 이를 해결하는 데 많은 시간과 노력이 필요했습니다. 기능 개발보다 '통합' 자체가 더 큰 일처럼 느껴지는 경우도 있었죠.
  2. 느린 피드백 루프
    코드가 작성된 후 품질 테스트, 리뷰, QA, 배포 등의 과정을 거쳐 실제 사용자에게 도달하기까지 수 주가 걸리곤 했습니다. 이렇게 느린 사이클은 버그 발견을 늦추고, 시장 반응에 빠르게 대응하는 것을 어렵게 만들었습니다.
  3. 수동 배포의 위험성
    배포는 종종 운영팀이나 특정 개발자가 수동으로 수행했기 때문에, 실수로 설정을 잘못하거나, 누락되는 파일이 생기거나, 서버 환경에 따라 문제가 발생하는 일이 많았습니다. 이로 인해 장애나 서비스 중단이 발생하는 경우도 적지 않았습니다.
  4. 확장성 문제
    팀 규모가 커지고 코드베이스가 방대해질수록, 기존 방식으로는 코드 품질과 릴리스 속도를 모두 만족시키는 것이 점점 어려워졌습니다. 사람의 눈과 손만으로는 더 이상 감당할 수 없는 단계에 도달한 것이죠.

이러한 문제들을 해결하기 위해 애자일 개발 방법론과 함께 CI/CD가 등장했습니다.

 

특히 마틴 파울러가 2006년 "Continuous Integration" 개념을 정립하면서 널리 알려지기 시작했고, 클라우드 컴퓨팅과 컨테이너 기술의 발전과 함께 현재와 같은 형태로 발전하게 되었습니다.

 

오늘날 CI/CD는 데브옵스(DevOps) 문화의 핵심 요소로 자리잡아, 개발팀이 더 자주, 더 안전하게 소프트웨어를 릴리스할 수 있게 도와주고 있습니다.

 

DevOps란?

더보기
더보기

DevOps = Development(개발) + Operations(운영)


기존에는 개발자(Dev)는 기능을 만들고, 운영팀(Ops)은 이를 배포하고 유지보수하는 식으로 팀이 분리되어 있었습니다. 이러면 다음과 같은 문제가 생깁니다:

  • 개발팀: "코드 다 짰으니까 운영팀이 배포해 주세요."
  • 운영팀: "이거 배포하다 에러 나면 우리 책임인데요?"

→ 책임 회피, 협업 부재, 배포 지연 등.

  • 개발팀과 운영팀이 협업하고
  • 자동화된 도구를 적극 활용해서
  • 빠르게, 자주, 안정적으로 릴리스를 하자

는 철학이자 방법론이에요.

CI(Continuous Intergration)란?

CI는 "지속적인 통합"이라는 뜻입니다.

쉽게 말해, 여러 개발자들이 작업한 코드를 자주, 자동으로 병합하고 검사하는 방식이에요.

왜 CI가 필요할까요?

상황 1: CI가 없을 때의 문제점

🐵 A개발자가 로그인 기능을 개발하고 있어요.
🐷 B개발자가 회원가입 기능을 개발하고 있어요.

결과: 코드 작성 시간보다 충돌 해결 시간이 더 오래 걸림 😱

상황 2: CI가 있을 때

🐵 A개발자가 오늘 로그인 기능 일부를 완성 → 바로 업로드
🐷 B개발자가 내일 회원가입 기능 일부를 완성 → 바로 업로드

매일매일 작은 단위로 합치니까 충돌이 거의 없고, 있어도 쉽게 해결!

게다가 자동으로 빌드/테스트까지 돌기 때문에 코드 품질도 일정 수준으로 유지됩니다.

CI가 필요한 환경

1. 여러 개발자가 함께 작업하는 팀

  • 혼자 개발할 때는 충돌이 거의 없어요.
  • 하지만 팀으로 일하면, 여러 사람의 코드가 한 프로젝트에 들어오면서 충돌이 생길 수밖에 없어요.

2. MSA(마이크로서비스) 환경

  • 예전에는 하나의 거대한 애플리케이션으로 개발했지만, 지금은 기능을 서비스 단위로 쪼개는 방식(MSA)이 일반적이에요.
  • 예: 쇼핑몰 = 로그인 서비스 + 상품 서비스 + 결제 서비스 + 배송 서비스
  • 각각 독립적이지만 서로 연결되어 있어서, 자주 테스트해야 문제를 빨리 찾을 수 있어요

CI가 하는 일 (자동화 과정)

기존 방식 (수동)

개발자 코드 작성 완료 
→ 팀장이 코드 확인 
→ 팀장이 빌드 실행 
→ 팀장이 테스트 실행 
→ 문제없으면 병합 승인

 

  • 사람 손이 너무 많이 가고,
  • 실수도 많고,
  • 속도도 느립니다.

CI 방식 (자동)

개발자가 코드 업로드 (MR/PR 요청) 
→ 자동으로 빌드 시작 
→ 자동으로 테스트 실행 
→ 모든 검사 통과하면 자동 병합 ✅ 
→ 하나라도 실패하면 병합 거부 ❌

 

  • 즉각 피드백 → 빠른 수정 → 빠른 배포가 가능해요.

CI의 핵심 원칙

1. 자주 병합하라

  • 나쁜 예: 한 달 동안 개발 후 한 번에 합치기 ❌
  • 좋은 예: 하루에도 여러 번 작은 단위로 합치기 ✅

2. 가능한 건 자동화하라

  • 빌드, 테스트, 정적 분석 등 반복 가능한 작업은 컴퓨터에게 맡기세요.

3. 빨리 피드백 받기

  • CI는 단순한 자동화가 아니라, 개발자에게 빠른 피드백을 주는 도구예요.
  • 코드에 문제가 있으면 몇 분 내로 알림이 옵니다.

CI의 장/단점

장점

  • 충돌 최소화
    코드를 자주 병합하기 때문에 merge conflict가 작고, 문제가 생겨도 빠르게 해결할 수 있어요.
  • 빠른 피드백
    코드 푸시 후 몇 분 안에 테스트 결과를 받을 수 있어, 버그를 초기에 발견하고 즉시 수정할 수 있어요.
  • 자동화로 인한 효율성
    빌드, 테스트, 린트 등 반복적인 작업이 자동화되어 개발자는 핵심 기능 개발에 집중할 수 있어요.
  • 배포 안정성 향상
    CI를 통해 테스트를 통과한 코드만 main/master 브랜치에 병합되므로 운영 환경이 더 안정적으로 유지돼요.
  • 개발 속도 향상
    충돌이나 버그를 조기에 해결하면서 전체 개발 사이클이 빨라지고, 릴리스 주기가 짧아져요.
  • 팀 협업 향상
    자주 병합하고 공유하므로 서로의 작업 상황을 쉽게 파악할 수 있어요. 자연스럽게 협업의 질도 올라갑니다.
  • QA 부담 감소
    기본적인 오류는 CI에서 미리 걸러지기 때문에 QA팀은 더 중요한 시나리오 테스트에 집중할 수 있어요.

단점 (혹은 도입 시 고려할 점)

  • 초기 구축 비용
    CI 도구를 선택하고, 빌드/테스트 파이프라인을 구성하는 데 일정 시간과 리소스가 필요해요.
  • 인프라 비용
    자주 빌드하고 테스트를 돌리기 때문에 서버 자원이 많이 필요하고, SaaS 서비스 이용 시 금전적 비용도 발생할 수 있어요.
  • 테스트 품질에 따라 효과가 달라짐
    테스트 커버리지가 낮거나 테스트 자체가 허술하면, 자동화가 되어 있어도 품질은 보장되지 않아요.
  • 테스트 시간이 길면 병목 발생
    테스트가 너무 많거나 느리면 CI 속도가 전체 개발 속도를 떨어뜨릴 수 있어요. 병렬 처리나 캐싱 전략이 필요할 수 있어요.
  • 팀 내 습관이 중요
    자주 커밋하지 않거나, CI 실패를 무시하는 문화가 형성되면 아무리 훌륭한 CI 도구도 소용이 없어요. 결국 문화로 정착되어야 합니다.

정리

“자주 병합하고, 자동으로 검사하고, 빠르게 피드백을 받자”

마치 요리할 때 중간중간 간을 보면서 조절하는 것과 같아요.
다 만들고 나서 간을 맞추려고 하면 이미 늦거든요.
코드도 마찬가지로 중간중간 확인하면서 문제를 빨리 잡는 게 CI의 핵심입니다!


대표적인 CI 도구들:

  • GitHub Actions
  • GitLab CI/CD
  • Jenkins
  • CircleCI
  • Travis CI

모두 "코드 푸시 → 자동 빌드/테스트" 흐름을 만들 수 있어요.

CD(Continuous Delivery/Deployment)란?

CD는 "지속적인 배포(전달)"를 의미하며, CI 이후 단계를 자동화해주는 흐름입니다.

CI에서 테스트를 통과한 코드를
→ 실제 운영 환경(또는 배포 직전의 환경)까지
사람의 개입 없이 혹은 최소한의 개입만으로 자동으로 전달하고 적용하는 것을 말합니다.


CD에는 두 가지 종류가 있어요:

  • Continuous Delivery: 배포 준비까지만 자동화 (마지막 배포는 사람이 버튼 클릭)
  • Continuous Deployment: 배포까지 완전 자동화 (사람 개입 없이 자동 배포)

왜 CD가 필요할까요?

상황 1: CD가 없을 때의 문제점

출시 과정

개발자: "새 기능 완성했어요!"
팀장: "좋아, 그럼 배포하자"

그런데 배포하려면...

  1. 서버에 접속해서 기존 서비스 중단
  2. 새 코드를 서버에 업로드
  3. 데이터베이스 설정 변경
  4. 환경변수 수정
  5. 서비스 재시작
  6. 정상 작동 확인

문제 상황들

  • 💻 개발팀장: "서버 접속이 안 되네? 비밀번호가 뭐였지?"
  • 🐛 운영팀: "어? 배포했는데 사이트가 안 열려요!"
  • 😱 사용자들: "사이트가 2시간째 안 되는데요?"
  • 😵 개발자: "우리 컴퓨터에서는 잘 되는데..."

상황 2: CD가 있을 때

개발자가 코드 업로드 
→ CI가 자동으로 테스트 
→ 테스트 통과하면 CD가 자동으로 배포 
→ 사용자는 즉시 새 기능 이용 가능!

 

총 소요시간: 5분 이내

CD가 필요한 환경

1. 자주 업데이트가 필요한 서비스

  • : 네이버, 카카오톡, 유튜브 같은 서비스
  • 하루에도 여러 번 버그 수정이나 새 기능이 나와야 해요
  • 매번 수동으로 배포하기에는 너무 번거로워요

2. 여러 환경에 배포해야 하는 경우

  • 개발 환경테스트 환경실제 서비스 환경
  • 각각 설정이 다르고, 실수하기 쉬워요
  • 자동화하면 실수를 줄일 수 있어요

3. 빠른 피드백이 중요한 서비스

  • 사용자 반응을 빨리 확인해야 해요
  • A/B 테스트처럼 여러 버전을 동시에 테스트해야 해요

CD가 하는 일 (자동화 과정)

기존 방식 (수동 배포)

오후 6시: "오늘 배포하자!" 
오후 6시 30분: 서버 접속 시도 
오후 7시: 서버 설정 변경 중... 
오후 8시: "어? 에러가 나네?" 
오후 9시: "아직도 고치는 중..." 
오후 11시: "드디어 배포 완료!"

 

CD 방식 (자동 배포)

오후 6시: 개발자가 코드 업로드 
오후 6시 3분: CI 테스트 완료 
오후 6시 5분: CD 자동 배포 완료!

 

CD의 종류

Continuous Delivery (지속적인 전달)

`코드 작성 → CI 테스트 → 배포 준비 완료 → [사람이 배포 버튼 클릭] → 실제 서비스`

  • 장점: 사람이 마지막에 한 번 더 확인할 수 있어요
  • 단점: 그래도 사람이 개입해야 해요
  • 적합한 경우: 은행, 병원 시스템처럼 신중해야 하는 서비스

Continuous Deployment (지속적인 배포)

`코드 작성 → CI 테스트 → 자동 배포 → 실제 서비스`

  • 장점: 완전 자동이라 매우 빨라요
  • 단점: 문제가 있어도 자동으로 배포될 수 있어요
  • 적합한 경우: 페이스북, 구글처럼 빠른 변화가 필요한 서비스

CD 과정

1단계: 환경 준비

개발 환경: 개발자들이 코드 작성하는 곳
테스트 환경: 실제와 비슷하게 만든 연습용 공간
운영 환경: 실제 사용자들이 쓰는 서비스

2단계: 배포 파이프라인

개발 환경에서 코드 완성 (CI가 자동 테스트) 
↓
자동으로 테스트 환경에 배포 
↓
테스트 환경에서 추가 테스트 
↓ 
자동으로 운영 환경에 배포

3단계: 모니터링과 롤백

모니터링: 배포 후 서비스가 정상인지 자동 확인
롤백: 문제가 생기면 이전 버전으로 자동 복구

CD의 장/단점

CD의 장점 (요약 정리)

  • 배포 속도 향상
    코드가 승인되자마자 바로 배포되므로, 기능 출시/버그 수정이 훨씬 빨라집니다.
  • 빠른 피드백 & 사용자 반응 수집
    A/B 테스트나 기능 플래그와 결합해 사용자 반응을 빠르게 실험하고 반영할 수 있어요.
  • 에러 대응 속도 향상
    문제가 있는 코드는 빠르게 롤백되거나 수정되어 곧바로 재배포됩니다.
  • 배포 스트레스 감소
    수동 배포의 긴장감이나 배포 실수에서 해방될 수 있어요. 특히 금요일 오후 배포도 무섭지 않아요(!)
  • 운영 환경 간 일관성 확보
    개발/스테이징/운영 등 여러 환경에 자동으로 동일한 방식으로 배포되기 때문에 환경 차이로 인한 오류가 줄어듭니다.
  • 개발 생산성 향상
    개발자는 배포를 의식하지 않고 기능 개발에 집중할 수 있어요.

CD의 단점 (또는 도입 시 고려할 점)

  • 테스트 커버리지가 부족하면 위험
    자동 배포는 검증된 코드라는 전제에서만 안전해요. 테스트가 부실하면 그대로 문제가 퍼질 수 있어요.
  • 잘못된 코드가 바로 운영에 적용될 수 있음
    작은 실수가 실제 사용자에게 영향을 미칠 수 있기 때문에, 실패 시 롤백 시스템이 반드시 갖춰져야 해요.
  • 모니터링/로깅 인프라가 필수
    실시간으로 문제를 감지하고 추적할 수 있어야 CD의 의미가 살아납니다.
  • 문화적 저항 가능성
    운영팀, 기획팀, QA팀이 자동 배포에 익숙하지 않으면 “너무 빠르다”는 이유로 반발할 수 있어요.
  • 초기 도입 비용과 복잡도
    파이프라인 구성, 테스트 전략 수립, 배포 환경 자동화 등 초기 세팅이 다소 복잡할 수 있어요.

CD 도입시 주의사항

1. 테스트가 완벽해야 해요

  • 자동 배포되기 때문에 테스트에서 놓친 버그가 바로 사용자에게 가요
  • 충분한 테스트 코드가 있어야 안전해요

2. 모니터링 시스템이 필요해요

  • 배포 후 문제가 생기면 즉시 감지할 수 있어야 해요
  • 자동으로 이전 버전으로 되돌리기가 가능해야 해요

3. 팀 전체의 협조가 필요해요

  • 개발자, 운영팀, 기획자 모두가 빠른 배포 주기에 적응해야 해요

정리

CI가 “코드를 믿을 수 있게 만드는 과정”이라면,

CD는 “그 믿을 수 있는 코드를 빠르고 안전하게 운영 환경에 적용하는 과정”이에요.

즉, CD는 단순히 배포를 자동화하는 것이 아니라,

배포 자체를 하나의 일상적인 작업으로 만들어주는 문화이자 전략입니다.

결론

왜 CI/CD로 함께 부르는가?

CI와 CD는 순차적으로 연결된 하나의 파이프라인이기 때문입니다:

`코드 작성 → CI(통합&검증) → CD(배포) → 사용자에게 전달`

 

CI 없이는 안전한 CD가 불가능하고, CD 없이는 CI의 효과가 반감됩니다.

따라서 현대 개발에서는 이 두 과정을 하나의 통합된 개발 방법론으로 보고 CI/CD라고 부르는 것입니다.

 

CI/CD의 궁극적인 목표는 개발자가 코드를 작성하는 순간부터 사용자가 새로운 기능을 사용하는 순간까지의 시간을 최소화하면서도, 품질과 안정성을 보장하는 것입니다. 이를 통해 팀은 더 자주, 더 안전하게 가치를 전달할 수 있게 됩니다.

https://artist-developer.tistory.com/24

https://ccomccomhan.tistory.com/297

728x90
반응형
LIST