새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

4 분 소요

학습 목표

  • CI / CD

개발 프로세스의 변화

고객의 요구사항이 빠르게 변화하고, 이를 신속하게 반영해야 기업이 경쟁력을 유지할 수 있습니다. 이에 따라 개발자는 고객의 요구를 만족시키기 위해 빠르게 새로운 기능을 개발하고 배포해야 합니다.

통합 문제의 발생 원인

개발자들이 각기 다른 기능을 개발하고 개인이 만든 기능을 테스트한 후, 배포 날짜에 한꺼번에 통합하면, 통합 시 발생되는 충돌을 해결하는 데 많은 리소스가 필요하게 됩니다.

왜 많은 리소스가 필요할까?

  1. 각 기능별 테스트에서는 문제가 없더라도, 한꺼번에 통합할 때 발생할 수 있는 문제를 예측할 수 없습니다.
  2. 통합 주기가 길어질 경우, 코드 충돌이 발생할 가능성이 높아집니다.
  3. 충돌을 해결한 후에도, 전체적인 테스트를 다시 수행해야 하므로 추가적인 리소스가 필요할 수 있습니다.

지속적 통합(CI)의 필요성

이 문제는 기능 개발 이후 지속적인 통합을 통해 해결할 수 있습니다. 그러나, 코드 검증 과정, 통합 이후 단위 테스트 및 통합 테스트 등을 개발자가 직접 수행하게 되면 통합 주기가 다시 길어질 수 있습니다.

CI(지속적 통합)을 유지하기 위해서는 CI 과정을 자동화할 필요가 있습니다.

자동화를 통해 빌드와 테스트 프로세스를 검증합니다. CI는 코드 병합 시 코드 분석, 자동화된 테스트, 코드 리뷰 등의 과정을 거치며, 이러한 과정이 성공적으로 완료된 경우에만 코드를 통합할 수 있도록 합니다.

통합된 코드 브랜치(중앙 리포지토리)는 높은 품질을 유지하며, 언제든지 배포할 수 있는 상태를 유지하게 됩니다. 이는 빠르고 안정적인 배포를 가능하게 합니다.

왜 빠르고 안정적인 배포가 가능할까?

  • 지속적인 통합 과정에서 코드 검증과 테스트 과정이 자동화되어 안정적인 코드를 유지할 수 있습니다.
  • 문제 발생 시 미리 대처할 수 있고, 충분한 테스트를 할 수 있으므로 빠르고 안정적인 배포가 가능한 코드 상태가 됩니다.
핵심 키워드
  • 자동화: 개발자는 비즈니스 로직 개발에만 집중할 수 있으며, 지속적인 통합을 유지할 수 있습니다.
  • 코드 검증: 중앙 리포지토리의 코드 안정성과 높은 품질을 유지할 수 있습니다.

지속적 제공(CD)의 필요성

지속적 통합(CI)의 주요 목적은 개발자들이 변경한 코드를 자주 병합하여 코드베이스의 일관성을 유지하고, 변경 사항이 중앙 리포지토리에 통합될때마다 자동화된 빌드와 테스트를 실행하는 것입니다.

CI는 코드가 중앙 리포지토리에 통합될 때 발생하는 문제를 조기에 발견하고 해결하는 데 중점을 둡니다. 그러나 CI만으로 프로덕션 환경에 배포하기 위한 모든 준비가 된 것은 아닙니다.

빠르게 고객에게 배포하기 위해서는 CI를 통해 안정적인 코드를 유지된 소스 코드를 패키징하는 과정이 필요합니다.

지속적 제공은 CI에서 빌드와 단위 및 통합 테스트를 자동화한 다음 검증된 코드를 리포지토리로 릴리즈하는 것을 자동화합니다. 이 프로세스가 종료되면 애플리케이션을 프로덕션으로 신속하게 배포할 수 있습니다

CD의 목적

  1. 신속한 배포 가능성 : 소프트웨어가 언제든지 프로덕션 환경에 배포될 수 있도록 패키징 되어있음
  2. 배포 리스크 최소화 : 자동화 테스트와 패키징을 통해 배포전에 패키징시 발생할 수있는 문제를 최소화 가능
  3. 개발 생산성 향상 : 개발자의 반복된 작업을 하지 않아도 됩니다.
핵심 키워드
  • 자동화 테스트 : 자동화 테스트는 지속적 제공의 근간입니다. 이를 통해 패키징 파일이 제대로 동작한다는 것을 확인할 수 있습니다.
  • 자동화 패키징 : 코드가 배포 가능한 형태로 일관되게 준비되는 과정을 말합니다.

지속적 배포(Continuous Deployment)의 필요성

지속적 배포(Continuous Deployment)는 지속적 제공의 확장으로, 개발자의 변경 사항을 프로덕션에 자동으로 릴리즈하여 고객이 사용할 수 있도록 하는 것을 말합니다. 이는 수동 프로세스로 인해 애플리케이션 제공 속도가 저하되는 문제를 해결할 수 있습니다.

지속적 배포의 목적

  1. 릴리즈의 세분화:
    • 애플리케이션 변경 사항을 작은 단위로 세분화하여 릴리즈함으로써 배포 속도를 향상시킬 수 있습니다.
  2. 신속한 요구사항 반영:
    • 사용자의 요구사항을 빠르게 반영할 수 있습니다. 이는 고객 만족도를 높이고, 시장 변화에 빠르게 대응할 수 있게 합니다.
  3. 오류 롤백의 용이성:
    • 오류가 발생할 경우, 세분화된 릴리즈 덕분에 다른 기능에 영향을 주지 않고 해당 릴리즈만 롤백할 수 있습니다.
  4. 리스크 감소:
    • 문제 발생 시 빠른 대처를 가능하게 하여, 서비스 중단 시간을 최소화할 수 있습니다. 이는 시스템 안정성과 신뢰성을 높여줍니다.
배포를 한꺼번에 하는 경우 발생할 수 있는 문제
  1. 테스트 범위의 확대:
    • 여러 변경 사항을 한꺼번에 배포하면, 테스트 범위가 넓어져 모든 기능을 철저히 검증하기 어려워집니다.
  2. 빠른 오류 수정의 어려움:
    • 오류가 발생했을 때, 여러 변경 사항 중 어떤 부분에서 문제가 발생했는지 파악하고 수정하는 데 시간이 많이 소요됩니다.
예시 비교

릴리즈 A, 릴리즈 B, 릴리즈 C를 주마다 배포하는 경우와 3주 후 릴리즈 A, B, C를 릴리즈 D로 한꺼번에 배포하는 경우를 비교해보겠습니다.

  • 릴리즈 A를 배포하고 오류가 발생하는 경우:
    • 릴리즈 A에 관련된 것만 테스트하고 수정하면 됩니다.
  • 릴리즈 D를 배포하고 오류가 발생하는 경우:
    • 릴리즈 A, B, C를 모두 다시 테스트해야 할 수 있습니다.
    • 심각한 오류로 롤백해야 한다면, 릴리즈 D로 배포한 경우 오류가 발생하지 않은 릴리즈까지 같이 롤백해야 할 수 있습니다. 이는 추가적인 리스크와 비용을 초래할 수 있습니다.
핵심 키워드
  1. 세분화된 릴리즈:
    • 세분화되어 오류를 빠르게 대처하고 수정하기 용이합니다.
  2. 자동화된 배포 프로세스:
    • 수동 배포의 프로세스를 줄이고 요구사항을 빠르게 반영할 수 있습니다.

CI/CD의 장점 정리

장점 설명
빠른 피드백 코드 변경 사항에 대해 빠르게 피드백을 받아 문제를 조기에 발견하고 해결할 수 있음
높은 코드 품질 자동화된 테스트와 코드 검증을 통해 코드 품질을 지속적으로 유지하고 향상시킬 수 있음
신속한 배포 자동화된 배포 파이프라인을 통해 새로운 기능이나 수정 사항을 신속하게 사용자에게 전달할 수 있음
리스크 감소 작은 단위의 변경 사항을 자주 배포하여 배포 리스크를 최소화하고 문제 발생 시 빠르게 롤백할 수 있음
개발 생산성 향상 반복적이고 수동적인 작업을 자동화하여 개발자가 핵심 기능 개발에 집중할 수 있게 함

CI/CD의 트레이드오프

트레이드오프 설명
도입 비용 CI/CD 파이프라인을 구축하는 초기 비용 발생 (도구 선택, 인프라 설정, 초기 자동화 스크립트 작성 등)
유지보수 비용 CI/CD 파이프라인을 지속적으로 유지보수하고, 자동화 로직을 업데이트하며, 새로운 테스트를 추가하는 작업 필요
복잡성 증가 초기 설정과 운영의 복잡성 증가, 팀이 새로운 도구와 프로세스에 익숙해지기까지 시간 소요
리소스 소모 자동화된 테스트와 빌드, 배포 과정에 추가적인 컴퓨팅 리소스 필요, 인프라 비용 증가 가능성
테스트 작성의 어려움 모든 코드 변경 사항에 대해 충분히 자동화된 테스트를 작성하는 것이 어렵고 시간이 많이 소요될 수 있음
교육 및 문화 변화 팀이 CI/CD를 효과적으로 사용하기 위해 새로운 도구와 프로세스에 대한 교육 필요, 기존 개발 문화 변화 필요

CI/CD를 개발 프로세스에 도입하기 위해 필요한 리소스가 생각보다 많이 필요하다는 걸 알았습니다.

트레이드 오프를 고려하여 CI/CD를 도입하는 것이 중요합니다.

댓글남기기