빌드와 배포에 대해 개념 익히기

1. 컴파일과 빌드

 

1-1) 컴파일

 

작성한 소스 코드를 바이너리 코드로 변환하는 과정

 

작성한 소스 코드를 컴퓨터가 이해할 수 있는 이진수 코드로 바꾸는 것이다

 

1-2) 빌드

 

소스 코드를 실행 가능한 소프트웨어 산출물(jar,war,...)로 만드는 일련의 과정

 

1-3) 링크

 

여러 개로 분리된 소스 코드들을 컴파일한 결과물들에서 최종 실행 가능한 파일을 만들기 위해 필요한 부분을 찾아 연결해 주는 작업이다

 

car라는 클래스를 작성한 코드 >> A파일로 컴파일

 

list_cars라는 클래스를 작성한 코드 >> B파일로 컴파일

 

list_cars는 car를 담는 코드일텐데 컴파일된 A파일로 되어 있으면 car가 뭔지를 모른다는 것

 

이럴 때 link를 통해 필요한 부분을 찾아 연결해서 최종 실행 가능한 파일로 바꿔주게 된다

 

어쨌든 빌드가 "실행 가능한 소프트웨어 산출물"로 만드는 과정이래

 

그러면 빌드 안에는 컴파일과 링크를 수행하게 된다는 뜻이겠지

 

 

2. 빌드 도구

 

- 소스 코드를 컴파일, 테스트, 정적 분석 등을 실시해서 실행 가능한 애플리케이션으로 자동 생성하는 프로그램이다

 

- 계속해서 늘어나는 라이브러리의 자동 추가 및 관리

 

- 라이브러리의 버전을 자동으로 동기화

 

빌드할때 필요한 컴파일, 링크 등의 task를 자동으로 도와주는 도구다

 

예전에는 소스코드를 직접 추가했어야했다면, 지금은 빌드 도구가 알아서 자동으로 올려준다는데...

 

자바에서 대표적으로 ant, maven, gradle이 있다고함

 

gradle이 성능이 더 좋다는 평가가 많다고함

 

 

3. 배포

 

작성한 코드를 빌드하고, 빌드가 완성된 "실행 가능한 파일"을 사용자가 접근할 수 있는 환경에 배치하면 그것이 배포

 

 = 빌드가 끝나고 생성된 jar이나 war 파일을 WAS에 올리는 것이 배포이다

 

WAS = Web Application Server

 

 

3-1) 빌드 자동화/배포 자동화

 

git에 올려두고

 

코드가 제대로 동작하는지 테스트 코드를 작성하고

 

이를 수행하고 검증하는 작업에 빌드가 잘 되면 그것이 배포가 가능한 상태다

 

그러므로 배포를 할려고 하면, 

 

소스코드 고칠때마다 git에 올리고 테스트 코드로 검증하고... 빌드하고...

 

이 과정들이 반복되는게 번거로움

 

이런 작업을 자동으로 하게 만들려는게 "빌드 자동화/배포 자동화"

 

 

4. CI/CD

 

4-1) CI = continuous integration(지속적 통합)

 

개발자를 위한 자동화 프로세스인 지속적 통합

 

모든 개발이 끝난 이후에 코드 품질을 관리하는 고전적 방식의 단점을 해소하기 위해 나타났다

 

개발 끝나고 나서.. 해볼려하니 에러가 엄청 나오고.. 그걸 고치고.. 다시 테스트하고... 이런게 비용이 엄청났다

 

그래서 개발하면서 주기적으로 통합(에러 테스트하고 빌드하고..)하면서 에러 같은 것을 고쳐 나가는 것

 

4-2) CI 프로세스

 

1) 코드를 통합한다 

 

git에 코드를 올리면서 그동안 개발된 코드들이 통합되는 것

 

2) 통합한 코드가 제대로 동작하는지 테스트

 

3) 제대로 빌드가 되는 지도 테스트

 

4) 만약 테스트나 빌드에서 문제가 생겼다면?

 

그러한 에러를 기록해두고 수정하고 수정된 코드를 다시 통합시키는 1)로 돌아가

 

1), 2), 3), 4)의 반복임

 

이걸 매번 직접 해야하니 귀찮아지는거

 

이를 위해 자동화도구들이 등장

 

 

 

대표적으로 Jenkins, Travis 등이 있다

 

CI 자동화 이외에 더 기능이 있다고 하는데 아무튼 CI 자동화를 도와주는 도구다

 

 

4-3) CD = Continuous Deploy(지속적 배포)

 

소프트웨어가 항상 "신뢰 가능한 수준"에서 배포될 수 있도록 관리하자는 개념

 

신뢰 가능한 수준 = 테스트도 다 통과되고, 빌드도 잘 되고,.....

 

그런데 테스트나 빌드 이런건 CI에서도 나왔다

 

그래서 CI/CD는 필수 불가결한 관계

 

CI가 선행되어야 CD가 가능하다는 그런 느낌에 항상 서로는 따라다님

 

 

4-4) 정리

 

지속적으로 통합하면서 테스트와 빌드를 진행하고 이를 통과한 코드에 대해 신뢰할 수 있고 바로 배포할 수 있다는 내용

 

CI/CD는 신뢰할 수 있는 상태로 만들어주며, 언제든지 지속적으로 배포할 수 있게 만들어준다

 

 

5. 무중단 배포

 

5-1) 필요한 이유

 

기존에 배포가 완료되어 동작하고 있는 서버가 존재하는데...

 

그러한 상태에서 새롭게 업데이트한 코드를 배포할려고한다면..?

 

>>> 충돌이 발생함

 

그러므로 기존에 서비스 중인 서버를 잠시 내리고 코드를 배포한 다음에 다시 서버를 동작시켜야함

 

 

5-2) 배포 프로세스

 

- 8080포트에 서버를 띄움

 

- 새롭게 배포할 내용이 있으면 포트 충돌을 막기 위해 서버를 다운 시킴

 

- 8080 포트에 새롭게 배포할 서버를 띄운다

 

서버를 내리고 다시 키는데 걸리는 시간(다운 타임, 유저에게 서비스가 불가능한 시간)이 필연적으로 발생

 

개발자 입장에서 유저들에게 최대한 신뢰성 있고 성능 좋은 서비스를 제공해야하는데 

 

이렇게 다운 타임이 자주 발생하면 당연히 문제가 생긴다

 

다운 타임이 자신의 서비스에서 크게 문제가 안된다고 생각한다면 사실 무중단 배포가 필요없겠지만

 

지속적인 서비스가 필요하다면 무중단 배포를 고려해야겠다

 

 

5-3) 무중단 배포의 필요조건?

 

- 두 대 이상의 서버를 서비스해야함

 

기존의 한 서버는 서비스를 제공하고 있고, 다른 서버에 새로운 코드를 제공해서 이를 사용자가 사용할 수 있도록 다른 서버에 올려주겠지

 

- 다운 타임이 발생하지 않으려면 실제 서비스 중인 서버와 새롭게 배포한 서버가 동시에 존재해야함

 

- 비용을 줄이려면 배포할 때만 새롭게 서버를 띄우고 배포가 완료된 후에 기존 서버는 죽이면 된다.

 

 

5-4) Rolling 배포

 

*로드 밸런서 = 서버로 들어오는 요청을 잘 분배하는 역할을 하는 것

 

- 서버 1을 로드 밸런서에서 뺀다

 

- 서버 1에 배포한다

 

- 서버 1을 다시 로드 밸런서에 넣는다

 

- 서버 2를 로드 밸런서에서 뺀다

 

- 서버 2에 배포한다

 

- 서버 2를 다시 로드 밸런서에 넣는다

 

 

state1에서 서버3(맨 오른쪽)은 배포된 상태

 

서버2를 배포해야하는데 서버 2를 로드 밸런서에서 빼고

 

서버1, 서버3이 서비스 담당중

 

로드 밸런서가 서버1에 주는지 서버3에 주는지에 따라 서비스가 다름

 

서버1은 기존 서비스, 서버3은 새롭게 배포된 서비스

 

그래서 유저마다 서로 다른 서비스를 받는 상태에 있음

 

특히 서버가 많으면 많을수록 이런 문제는 심각해지겠지

 

1대에 배포하는 것보다 최소 2배 이상은 느리다고함

 

특히 1대는 계속 서비스중이어야 하니까, 나머지가 배포되더라도 이 1대를 배포할려고 해야하니.. 느리다

 

 

5-5) Canary 배포

 

광부들이 광산에 유독가스가 나오는 것을 알아내기 위해 가스에 민감한 카나리아를 광산 안에서 키웠다고 함

 

소수의 유저만 사용하는 환경(Canary 환경)에 신규 버전을 배포해보고 문제가 없다면 다른 모든 서버에 배포

 

 

 

5-6) blue/green 배포

 

무중단 배포의 대표적인 배포라고 함

 

실제로 서비스 중인 환경 = blue

 

새롭게 배포할 환경 = green

 

을 세트로 준비해서 배포하는 것

 

 

 

현재 로드 밸런서가 서비스중인 파란색 코드1에 연결중

 

코드2는 새롭게 배포할려는 상태

 

그러면 이 상태에서 새롭게 배포할려는 서비스를 제공할려면 로드 밸런서만 코드2에 연결시키면 끝

 

 

 

속도가 빠르고 효율적

 

문제 발생하면 파란색으로 바로 넘기면 그만이니 신속한 롤백 가능

 

하지만 green 환경 여분 서버가 반드시 떠 있어야해서 비용이 두배

 

 

6. 웹사이트 배포와 서버

 

웹사이트 배포는 애플리케이션을 인터넷에 올려놓아서 다른 사람들도 볼 수 있게 해주는 것이다

 

방법은 서버를 이용해서 가능하다

 

그런데 서버는 어떻게 만드나?

 

6-1) 내 컴퓨터 자체를 서버로 만든다

 

내 컴퓨터 자체를 서버로 만들어서 인터넷에 내 IP 주소를 알려준다

 

개인 컴퓨터를 공개하게 되므로 보안에 취약하고 컴퓨터를 24시간 가동해야 서비스가 돌아가겠지

 

 

6-2) 외부 전문 서버를 이용한다

 

서버를 가지고 있는 회사에서 서버를 운영해준다

 

사용자 입장에서는 유지 비용이 적겠지

 

기업이 서버를 제공하는 것을 웹 호스팅, 클라우드 서버라고 부름

 

AWS가 대표적

 

 

참조

 

[10분 테코톡] 🐳스티치의 빌드와 배포 - YouTube

 

웹사이트 배포란?? :: Karice의 여행 & 코딩 블로그 (tistory.com)

 

웹사이트 배포란??

정의 : 애플리케이션을 인터넷에 올려놓아 다른 사람들도 볼 수있게 해주는 것을 말한다. 방법 : 1. 내 컴퓨터 자체를 서버로 만드는 방법 - 내 컴퓨터 자체를 서버로 만들어서 인터넷에 내 IP 주

karice.tistory.com

 

TAGS.

Comments