새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
CI/CD 그리고 트레이드오프
학습 목표
- CI / CD
개발 프로세스의 변화
고객의 요구사항이 빠르게 변화하고, 이를 신속하게 반영해야 기업이 경쟁력을 유지할 수 있습니다. 이에 따라 개발자는 고객의 요구를 만족시키기 위해 빠르게 새로운 기능을 개발하고 배포해야 합니다.
통합 문제의 발생 원인
개발자들이 각기 다른 기능을 개발하고 개인이 만든 기능을 테스트한 후, 배포 날짜에 한꺼번에 통합하면, 통합 시 발생되는 충돌을 해결하는 데 많은 리소스가 필요하게 됩니다.
왜 많은 리소스가 필요할까?
- 각 기능별 테스트에서는 문제가 없더라도, 한꺼번에 통합할 때 발생할 수 있는 문제를 예측할 수 없습니다.
- 통합 주기가 길어질 경우, 코드 충돌이 발생할 가능성이 높아집니다.
- 충돌을 해결한 후에도, 전체적인 테스트를 다시 수행해야 하므로 추가적인 리소스가 필요할 수 있습니다.
지속적 통합(CI)의 필요성
이 문제는 기능 개발 이후 지속적인 통합을 통해 해결할 수 있습니다. 그러나, 코드 검증 과정, 통합 이후 단위 테스트 및 통합 테스트 등을 개발자가 직접 수행하게 되면 통합 주기가 다시 길어질 수 있습니다.
CI(지속적 통합)을 유지하기 위해서는 CI
과정을 자동화할 필요가 있습니다.
자동화를 통해 빌드와 테스트 프로세스를 검증합니다. CI는 코드 병합 시 코드 분석, 자동화된 테스트, 코드 리뷰 등의 과정을 거치며, 이러한 과정이 성공적으로 완료된 경우에만 코드를 통합할 수 있도록 합니다.
통합된 코드 브랜치(중앙 리포지토리
)는 높은 품질을 유지하며, 언제든지 배포할 수 있는 상태를 유지하게 됩니다. 이는 빠르고 안정적인 배포를 가능하게 합니다.
왜 빠르고 안정적인 배포가 가능할까?
- 지속적인 통합 과정에서 코드 검증과 테스트 과정이 자동화되어 안정적인 코드를 유지할 수 있습니다.
- 문제 발생 시 미리 대처할 수 있고, 충분한 테스트를 할 수 있으므로 빠르고 안정적인 배포가 가능한 코드 상태가 됩니다.
핵심 키워드
- 자동화: 개발자는 비즈니스 로직 개발에만 집중할 수 있으며, 지속적인 통합을 유지할 수 있습니다.
- 코드 검증: 중앙 리포지토리의 코드 안정성과 높은 품질을 유지할 수 있습니다.
지속적 제공(CD)의 필요성
지속적 통합(CI)의 주요 목적은 개발자들이 변경한 코드를 자주 병합하여 코드베이스의 일관성을 유지하고, 변경 사항이 중앙 리포지토리에 통합될때마다 자동화된 빌드와 테스트를 실행하는 것입니다.
CI는 코드가 중앙 리포지토리에 통합될 때 발생하는 문제를 조기에 발견하고 해결하는 데 중점을 둡니다. 그러나 CI만으로 프로덕션 환경에 배포하기 위한 모든 준비가 된 것은 아닙니다.
빠르게 고객에게 배포하기 위해서는 CI
를 통해 안정적인 코드를 유지된 소스 코드를 패키징하는 과정이 필요합니다.
지속적 제공은 CI에서 빌드와 단위 및 통합 테스트를 자동화한 다음 검증된 코드를 리포지토리로 릴리즈하는 것을 자동화합니다. 이 프로세스가 종료되면 애플리케이션을 프로덕션으로 신속하게 배포할 수 있습니다
CD의 목적
- 신속한 배포 가능성 : 소프트웨어가 언제든지 프로덕션 환경에 배포될 수 있도록 패키징 되어있음
- 배포 리스크 최소화 : 자동화 테스트와 패키징을 통해 배포전에 패키징시 발생할 수있는 문제를 최소화 가능
- 개발 생산성 향상 : 개발자의 반복된 작업을 하지 않아도 됩니다.
핵심 키워드
- 자동화 테스트 : 자동화 테스트는 지속적 제공의 근간입니다. 이를 통해 패키징 파일이 제대로 동작한다는 것을 확인할 수 있습니다.
- 자동화 패키징 : 코드가 배포 가능한 형태로 일관되게 준비되는 과정을 말합니다.
지속적 배포(Continuous Deployment)의 필요성
지속적 배포(Continuous Deployment)는 지속적 제공의 확장으로, 개발자의 변경 사항을 프로덕션에 자동으로 릴리즈하여 고객이 사용할 수 있도록 하는 것을 말합니다. 이는 수동 프로세스로 인해 애플리케이션 제공 속도가 저하되는 문제를 해결할 수 있습니다.
지속적 배포의 목적
- 릴리즈의 세분화:
- 애플리케이션 변경 사항을 작은 단위로 세분화하여 릴리즈함으로써 배포 속도를 향상시킬 수 있습니다.
- 신속한 요구사항 반영:
- 사용자의 요구사항을 빠르게 반영할 수 있습니다. 이는 고객 만족도를 높이고, 시장 변화에 빠르게 대응할 수 있게 합니다.
- 오류 롤백의 용이성:
- 오류가 발생할 경우, 세분화된 릴리즈 덕분에 다른 기능에 영향을 주지 않고 해당 릴리즈만 롤백할 수 있습니다.
- 리스크 감소:
- 문제 발생 시 빠른 대처를 가능하게 하여, 서비스 중단 시간을 최소화할 수 있습니다. 이는 시스템 안정성과 신뢰성을 높여줍니다.
배포를 한꺼번에 하는 경우 발생할 수 있는 문제
- 테스트 범위의 확대:
- 여러 변경 사항을 한꺼번에 배포하면, 테스트 범위가 넓어져 모든 기능을 철저히 검증하기 어려워집니다.
- 빠른 오류 수정의 어려움:
- 오류가 발생했을 때, 여러 변경 사항 중 어떤 부분에서 문제가 발생했는지 파악하고 수정하는 데 시간이 많이 소요됩니다.
예시 비교
릴리즈 A, 릴리즈 B, 릴리즈 C를 주마다 배포하는 경우와 3주 후 릴리즈 A, B, C를 릴리즈 D로 한꺼번에 배포하는 경우를 비교해보겠습니다.
- 릴리즈 A를 배포하고 오류가 발생하는 경우:
- 릴리즈 A에 관련된 것만 테스트하고 수정하면 됩니다.
- 릴리즈 D를 배포하고 오류가 발생하는 경우:
- 릴리즈 A, B, C를 모두 다시 테스트해야 할 수 있습니다.
- 심각한 오류로 롤백해야 한다면, 릴리즈 D로 배포한 경우 오류가 발생하지 않은 릴리즈까지 같이 롤백해야 할 수 있습니다. 이는 추가적인 리스크와 비용을 초래할 수 있습니다.
핵심 키워드
- 세분화된 릴리즈:
- 세분화되어 오류를 빠르게 대처하고 수정하기 용이합니다.
- 자동화된 배포 프로세스:
- 수동 배포의 프로세스를 줄이고 요구사항을 빠르게 반영할 수 있습니다.
CI/CD의 장점 정리
장점 | 설명 |
---|---|
빠른 피드백 | 코드 변경 사항에 대해 빠르게 피드백을 받아 문제를 조기에 발견하고 해결할 수 있음 |
높은 코드 품질 | 자동화된 테스트와 코드 검증을 통해 코드 품질을 지속적으로 유지하고 향상시킬 수 있음 |
신속한 배포 | 자동화된 배포 파이프라인을 통해 새로운 기능이나 수정 사항을 신속하게 사용자에게 전달할 수 있음 |
리스크 감소 | 작은 단위의 변경 사항을 자주 배포하여 배포 리스크를 최소화하고 문제 발생 시 빠르게 롤백할 수 있음 |
개발 생산성 향상 | 반복적이고 수동적인 작업을 자동화하여 개발자가 핵심 기능 개발에 집중할 수 있게 함 |
CI/CD의 트레이드오프
트레이드오프 | 설명 |
---|---|
도입 비용 | CI/CD 파이프라인을 구축하는 초기 비용 발생 (도구 선택, 인프라 설정, 초기 자동화 스크립트 작성 등) |
유지보수 비용 | CI/CD 파이프라인을 지속적으로 유지보수하고, 자동화 로직을 업데이트하며, 새로운 테스트를 추가하는 작업 필요 |
복잡성 증가 | 초기 설정과 운영의 복잡성 증가, 팀이 새로운 도구와 프로세스에 익숙해지기까지 시간 소요 |
리소스 소모 | 자동화된 테스트와 빌드, 배포 과정에 추가적인 컴퓨팅 리소스 필요, 인프라 비용 증가 가능성 |
테스트 작성의 어려움 | 모든 코드 변경 사항에 대해 충분히 자동화된 테스트를 작성하는 것이 어렵고 시간이 많이 소요될 수 있음 |
교육 및 문화 변화 | 팀이 CI/CD를 효과적으로 사용하기 위해 새로운 도구와 프로세스에 대한 교육 필요, 기존 개발 문화 변화 필요 |
CI/CD를 개발 프로세스에 도입하기 위해 필요한 리소스가 생각보다 많이 필요하다는 걸 알았습니다.
트레이드 오프를 고려하여 CI/CD를 도입하는 것이 중요합니다.
댓글남기기