이 글을 작성하게 된 계기는 CI/CD와 무중단 배포의 차이점에 대해 궁금하게 되어 시작하게 되었습니다.
우선 CI/CD와 무중단 배포의 개념을 설명 한 후 어떤 점이 다른지 설명하겠습니다.
CI/CD 란?
신입 개발자들이 처음에 개발을 진행할 때에는 서버에 코드를 올리는 것이 아닌 보통 로컬에서 진행하게 됩니다. 하지만 개발자는 결국 결과물을 보여줘야하는 직업이기에 제작한 소프트웨어를 서버에 올려 배포한 후 사용자에게 제공해야 합니다.
어떻게 하면 사용자에게 소프트웨어를 제공할 수 있을까?
아래의 순서를 따라 제공하게 됩니다.
1. 컴파일
우선, 우리가 만든 코드를 컴파일 합니다.
컴파일이란?
- 우리가 만든 프로그래밍 언어를 기계가 이해할 수 있는 기계어로 변환하는 작업
우리가 사용한 Java, C 와 같은 프로그래밍 언어는 기계가 이해할 수 없습니다. 이렇게 개발자의 편의를 위해 개발자의 언어로 작성한 프로그래밍 언어를 컴파일러가 기계가 이해할 수 있는 언어로 일종의 번역을 해줍니다.
2. 빌드
다음은 컴파일된 기계어를 사용자에게 보여주기 위해서 완성된 상품
즉, 소프트웨어 가공물로 만듭니다.
예를들어 Java에서는 Maven, Gradle과 같은 빌드 도구를 이용하여 컴파일과 함께 소스코드 파일을 .jar 또는 .war 파일과 같은 산출물로 변환하여 빌드도 함께할 수 있습니다.
3. 배포
이렇게 만들어진 산출물은 각각의 서버에서 동작하도록 하여 상품을 사용자들에게 공개하는 것이 배포입니다.
이렇게 최종적으로 만들어진 상품을 배포하여 사용자들에게 제공(사용)하게 하는 것이 우리의 목적이자 개발을 하는 이유가 됩니다.
이제 배포를 하려고 검색을 해보면 CI/CD 라는 단어가 눈에 밟히게 됩니다. 이제 이 CI/CD에 대해서 설명 드리겠습니다.
CI/CD (Continuous Integration/Continuous Deployment) - 지속적 통합, 지속적 배포
CI(Continuous Intergration)
CI 는 지속적 통합이라는 뜻으로 개발을 진행하면서도 품질을 관리할 수 있도록 하는 것으로 여러명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합하면서 관리할 수 있음을 의미합니다.
CI 가 나오기 전까지는 개발을 끝마치고 배포가 되어야만 코드에 오류가 없는지, 올바르게 작동하는지 검증하며 코드 품질관리가 가능했습니다. 하지만 CI를 적용하게 된다면 개발자가 구현해야할 기능에 더 집중하는것이 가능해집니다. main 브랜치와 통합하고 잘 빌드 되는지 확인하고 테스트하여 서버에 올라가기전에 오류나 버그가 픽스가 가능합니다.
CI를 자동화 하게 된다면 개발자가 빌드와 테스트를 직접하지 않고 수정한 코드를 브래친에 병합하기만 하면 빌드와 테스트가 검증이 가능해집니다.
결과적으로 버그를 신속하게 찾아 해결할 수 있을 뿐더러, 소프트웨어 품질을 개선하고 새로운 소프트웨어 업데이트를 검증하고 릴리즈 하는데에 걸리는 시간이 단축됩니다.
요약하자면 CI의 순서는 이렇습니다.
1. 개발자가 구현한 코드를 기존 코드와 병합
2. 병합된 코드가 올바르게 동작하고 빌드 되는지 검증
3. 테스트 결과 문제가 있다면 수정하고 다시 [1번] 으로 다시 돌아가서 병합, 문제가 없다면 배포 진행
CD(Continuous Deployment)
이제 CI 를 거쳐서 코드가 신뢰할 수 있고 바로 배포가 가능해졌습니다.
CD는 지속적 배포를 의미하며 소프트웨어가 항상 신뢰 가능한 수준에서 배포될 수 있도록 관리하자는 개념으로 지속적 제공(Continuous Delivery) 로 사용되기도 합니다.
지속적인 제공은 CI 를 통해서 새로운 소스코드의 빌드와 테스트 병합까지 성공적으로 진행 되었다면, 빌드와 테스트를 거쳐서 GitHub와 같은 외부저장소에 업로드 하는 것을 의미합니다.
또한 원래 의미인 지속적 배포는 이렇게 성공된 병합된 내역을 저장소 뿐만 아니라 사용자에게 사용할 수 있는 배포 환경까지 릴리즈 하는 것을 의미합니다. 지속적 배포에서는 지속적 통합을 통해 빌드한 소스코드를 테스트 가능한 알파나 베타 버전으로 제작합니다. 이 버전에서 테스트를 수행해 문제가 발생하면 수정한 뒤 정식버전으로 배포를 진행합니다.
대표적으로 CI/CD 방법으로는 Travis와 Jenkins가 있습니다.
무중단 배포란?
무중단 배포는 사용자에게 서비스 중단 없이 새로운 버전의 소프트웨어를 배포하는 방법입니다.
서비스를 운영 중일 때 새로운 버전을 배포하기 위해서는
1. 기존 서비스를 종료
2. 새로운 서비스 시작
두개의 프로세스를 지나쳐야 합니다.
이렇게 되면 1번과 2번 사이의 과정에서 다운타임이 필연적으로 발생하며, 다운타임 동안 사용자들은 서비스를 이용할 수 없습니다.
이 다운타임을 해결해주는 방법이 바로 무중단 배포입니다. 즉, 말그대로 중단이 없는 배포를 무중단 배포라고 합니다.
다운타임?
시스템을 이용할 수 없는 시간을 말합니다. 이용 불가능의 의미는 시스템이 오프라인이거나 사용할 수 없는 상황에 놓이는 상태를 말합니다.
무중단 배포 구현 방식에는 여러가지 기술이 존재합니다.
- AWS에서 Blue-Greem 무중단 배포
- 도커를 이용한 무중단 배포
- L4, L7 스위치를 이용한 무중단 배포
- Nginx를 이용한 무중단 배포
배포 전략에도 여러가지 기술이 존재합니다.
- Rolling 배포
- Canary 배포
- Blue/Green 배포
이 글에서는 간단하게 개념적으로만 설명드리기에 직접 찾아보시는 것을 추천드립니다. 링크는 띄어 놓겠습니다.
https://reference-m1.tistory.com/211
그래서 CI/CD와 무중단 배포의 차이점이 뭐야?
제가 제일 궁금했던 점은 CI/CD 개념중 CD의 개념에 Continuous Delivery 즉, 지속적인 제공이라는 의미가 있기에 무중단 배포와 차이점이 없다고 생각했습니다. 하지만 찾아보니 엄연히 다른 개념이었으며 차이점을 설명드리겠습니다.
우선 Continuous Delivery 와 무중단 배포는 둘 다 소프트웨어 릴리스와 배포를 자동화하여 빠른 속도와 안정성을 제공하는 방법론 입니다.
하지만 Continuous Delivery 지속적 제공은 개발자와 개발팀 줌심의 방법론 입니다. 개발자는 코드 변경을 자주 릴리스하고, 테스트 및 배포 프로세스를 자동화하여 코드 변경을 빠르게 제공할 수 있습니다.
무중단 배포는 사용자 중심의 방법론 이지만, 개발자도 무중단 배포를 통해 안정적인 배포를 보장하고 사용자에게 중단 없는 서비스를 제공할 수 있습니다.
가장 큰 차이점은 중점이 어디에 있냐 입니다.
CI/CD는 개발자가 협업하면서 지속적으로 통합하며 지속적으로 배포하는 것을 의미하고,
무중단 배포도 물론 개발자가 배포 하는 것이지만 사용자 중심으로 사용자가 서비스를 사용할때에 다운타임을 겪지 않도록 하게 하는 것이 무중단 배포입니다.
목적은 둘다 사용자에게 지속적으로 서비스를 제공한다는 측면은 똑같지만 사용하는 기술이 다르고 개념이 다르기에 엄연히 따지면 다른 개념입니다.
참고 블로그
'CS > 개념 정리' 카테고리의 다른 글
프레임워크(Framework)와 라이브러리(Library)의 차이 (1) | 2022.12.12 |
---|---|
DB커넥션풀과 HikariCP란? (0) | 2022.12.01 |
TDD란 무엇인가? (0) | 2022.11.30 |
[구글 엔지니어는 이렇게 일한다] 소프트웨어 엔지니어링이란? -1 (0) | 2022.11.28 |