https://www.youtube.com/watch?v=6SvUZqbU37E
우아한테크 영상 중 스티치님의 빌드와 배포라는 주제의 발표 영상을 보고 정리를 하는 형식의 포스팅이다.
직전 영상리뷰 포스팅에서 에헴님의 발표 영상도 같은 주제임이 맞지만, 조금 더 내용이 구체적으로 정리되어 있는 느낌이 들었다. 에헴님의 영상을 보고 용어들과 빌드라는 개념에 대해 틀을 잡고, 스티치님의 영상으로 조금 더 내용을 심화하여 들여다보는 식의 학습이 필요하다는 생각이 들었다.
1. 빌드란
1) 컴파일 그리고 빌드
- 컴파일 : 작성한 소스 코드를 바이너리 코드로 변환하는 과정(컴퓨터가 이해할 수 있는 기계어로 바꾸어주는 작업)
- 컴파일러 : 컴파일을 해주는 것
- 빌드 : 소스코드를 실행 가능한 소프트웨어 산출물로 만드는 일련의 과정
- 링크 : 여러개로 분리된 소스 코드들을 컴파일한 결과물들에서 최종 실행 가능한 파일을 만들기 위해 필요한 부분을 찾아서 연결해주는 작업
2. 빌드 도구
- 소스 코드를 컴파일, 테스트, 정적 분석 등을 실시하여 실행 가능한 애플리케이션으로 자동 생성하는 프로그램
- 계속해서 늘어나는 라이브러리의 자동 추가 및 관리
- 라이브러리의 버전을 자동으로 동기화
1) ANT_JAVA의 빌드 도구
- 특징
- XML 기반 빌드 스크립트를 개발
- 규칙이 없다.
- 절차적이다. (명확한 빌드 절차 정의가 필요)
- 생명주기를 갖지 않아 각각의 Target에 대한 의존관계와 작업을 정의해 주어야 한다.
- 단점
- 유연성이 높으나 프로젝트가 복잡해지는 경우 Build과정의 이해가 어렵다.
- XML, Remote Repositary를 가져올 수 없다.
- 스크립트 재사용이 어렵다.
2) Maven_JAVA의 빌드 도구
- 특징
- 프로젝트에 필요한 모든 종속성(Dependency)을 리스트 형태로 Maven에게 알려주어 종속성을 관리한다.
- XML, Repository를 가져올 수 있다.
- POM.xml이라는 Maven파일에 필요한 Jar, Class Path를 선언만 하면 직접 다운로드 할 필요가 없이 Repository에서 자동으로 필요한 라이브러리파일을 불러와준다.
- 단점
- 라이브러리가 서로 종속할 경우 XML이 복잡해진다.
- 계층적인 데이터를 표현하기에는 좋지만, 플로우나 조건부 상황을 표현하기 어렵다.
- 편리하나 맞춤화된 로직 실행이 어렵다.
3) Gradle_JAVA의 빌드 도구
- 특징
- JVM기반의 빌드도구
- Ant와 Maven의 단점을 보완
- 오픈소스 기반의 Build 자동화 도구
- Groovy 기반 DSL로 작성한다.
- Build-by-convention을 바탕으로 한다. (스크립트 규모가 작고 읽기 쉽다.)
- 설정 주입 방식(configuration injection)
- 단점
- 라이브러리가 서로 종속할 경우 XML이 복잡해진다.
- 계층적인 데이터를 표현하기에는 좋지만, 플로우나 조건부 상황을 표현하기 어렵다.
- 편리하나 맞춤화된 로직 실행이 어렵다.
4) Maven VS Gradle
- 성능 측면 : Gradle이 Maven보다 빌드에 소요되는 시간, 유연성, 종속성 관리 등 다양한 측면에서 뛰어나다는 평가이다.
- 간편성 측면 : 라이브러리가 종속될 경우, 특정 조건을 표현할 경우에 Maven이 이름처리가 복잡하다. 반면 Gradle은 스트립트가 더 짧고 읽기 쉽게 되어있다.
- 라이브러리 의존성 관리 : Gradle이 Maven보다 더 효율적이고 강력한 기능을 제공하고 있으며, Gradle은 버전 충돌또한 관리해준다.
이러한 종합적인 정보들을 두고 보았을때, Gradle이 사용하기에 좋다는 결론이 도출된다.
3. 배포
1) 배포란
작성한 코드를 빌드하고, 빌드가 완성된 실행 가능한 파일을 사용자가 접근할 수 있는 환경에 배치하면 배포가 완료된 것이다. 즉, 빌드를 하고 생성된 jar또는 war파일을 WAS에 올리는 것을 배포라고 정리할 수 있다.
git(소스 형상 관리)에 올려두고, 코드가 제대로 동작하는지 테스트 코드를 작성하고, 이를 수행 및 검증하는 작업까지를 배포단계에서 진행한다.
4. CI / CD
1) CI
- Continuous Integration의 약자로, 지속적 통합이라는 의미를 갖고 있다.
- 개발자를 위한 자동화 프로세스인 지속적 통합으로 모든 개발이 끝난 이후에 코드 품질을 관리하는 고전적 방식의 단점을 해소하기 위해 나타난 개념이다.
*CI에 대한 프로세스*
- 코드를 통합한다.
- 통합한 코드가 제대로 동작하는지 테스트한다.
- 제대로 빌드가 되는지도 테스트한다.
- 결과를 정리하고 버그가 존재한다면 적어둔다.
이러한 작업들이 번거로움을 해결하기 위해 이에 대한 자동화 도구(Jenkins, Travis)들이 생겨나게 되었다.
2) CD
- Continuous Deploy의 약자로, 지속적 배포라는 의미를 갖는다.
- 소프트웨어가 항상 신뢰 가능한 수준에서 배포될 수 있도록 관리하자는 개념이다.
정리된 내용을 확인하면 CI가 선행되어야 CD가 가능하다는 것을 캐치할 수 있고, 그로인해 CI와 CD를 묶어서 통칭하여 표현한다.
5. 무중단 배포
1) if, 기존에 동작하고 있는 서버(배포가 완료된)가 존재, 그 상태에서 새롭게 업데이트한 코드를 배포한다면?
- 충돌이 발생한다. 따라서 기존에 서비스 중인 서버를 잠시 내리고 코드를 배포한 후 다시 서버를 동작시켜야한다.
2) 그에대한 프로세스
- 8080포트에 서버를 띄운다.
- 새롭게 배포할 내용이 있다면 포트 충돌을 막기 위해서 서버를 다운 시킨다.
- 8080포트에 새롭게 배포할 서버를 띄운다.
이때, 서버가 다시 뜨는데 30초의 시간이 걸린다고 한다면 그 시간만큼 다운타임(유저에게 서비스가 불가능한 시간)이 발생하게 된다.
3) 필요 조건_무중단배포
- 두 대 이상의 서버를 서비스 해야한다.
- 다운 타임이 발생하지 않으려면 실제 서비스 중인 서버와 새롭게 배포한 서버가 동시에 존재해야한다.
- 비용을 줄이려면 배포할 때만 새롭게 서버를 띄우고 배고가 완료된 후에 기존 서버는 죽이면 된다.
4) 무중단 배포의 방법
- Rolling 배포
- 방식
- 서버 1을 로드 밸런서에서 뺀다.
- 서버 1에 배포한다.
- 서버 1을 다시 로드 밸런서에 넣는다.
- 서버 2를 로드 밸런서에서 뺀다.
- 서버 2에 배포한다.
- 서버 2를 다시 로드 밸런서에 넣는다.
- 단점
- 배포할 서버가 너무 많다면 n대 단위로 배포하기도 하는데, 배포가 모두 끝나기 전까지는 누구는 이전 서비스를 받고 누구는 신규 서비스를 받을 수 있다는 문제가 존재한다.
- 1대에 배포하는 것 보다 최소 2배 이상이 느리다.
- 방식
- Canary배포
- 소수의 유저(혹은 사내)만 사용하는 환경(Canary환경)에 신규 버전을 배포하고 문제가 없다고 판단 됐을때 다른 모든 서버에 배포한다.
- Blue / Green 배포
- 의미
- 실제로 서비스 중인 환경(Blue)과 새롭게 배포할 환경(Green)을세트로 준비해서 배포하는 방식
- 장점
- 새롭게 배포할 환경에서만 배포하면 되기 때문에 배포 속도가 매우 빠르다.
- 언제나 Green환경이 떠있기 때문에 만약 잘못된 버전으로 배포를 했을 경우에 신속하게 롤백이 가능하다.
- 단점
- Green 환경이 항상 떠있어야 하기 때문에 비용이 두 배로 든다.
- 의미
'영상리뷰' 카테고리의 다른 글
[영상리뷰] 우아한테크_무민 : JVM Stack&Heap (0) | 2022.01.22 |
---|---|
[영상리뷰] 우아한테크_던 : JVM의 Garbage Collector (0) | 2022.01.22 |
[영상리뷰] 우아한테크_에헴 : 빌드용어 (0) | 2022.01.12 |
[영상리뷰] 우아한테크_제이 : 시간복잡도 (0) | 2022.01.11 |
[영상리뷰] 우아한테크_루피 : 도서관리시스템 (0) | 2022.01.10 |