컴파일,링크, 빌드, 배포 개념 정리 / what is the Compile,Link,Build,Deploy?

본인은 PHP 웹 개발자 외길 인생을 살아왔다. Frame Work는 Laravel을 사용하여 개발을 진행하였고, 별도의 컴파일 , 빌드 과정 없이 실서버에 deploy(배포)만 진행하여 서비스를 개발해왔다. 최근 회사에서 java 언어로 프로젝트를 진행하게 되었고 각 용어에 대한 정리를 할 필요성을 느껴 여기에 정리한다.


컴파일 ( Compile ) 이란? 

학부생 때 배운 개념. 컴퓨터는 [0 또는 1의 숫자]로 모든 명령을 이해한다는 것이다. 흔한 예로 대문자 A는 아스키코드로 65, 65의 십진수는 2진수로 변환되어 1000001로 컴퓨터가 해석하게 된다. 사람이 이해하는 A라는 문자를 컴퓨터가 이해하는 1000001로 변환해주는 이러한 일련의 작업 혹은 기능을 컴파일이라고 한다.

1. 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸어주는 일련의 과정을 컴파일의 과정이라고 생각하면 이해하기 쉽다.
2. 컴파일은 C, Java 등 인간이 이해할 수 있는 고급 언어로 작성된 프로그램 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 번역한다.
3. 원시코드(.c or .java등)에서 목적 파일(. obj 등)로 바꾸어 주는 것을 컴파일이라고 한다.

컴파일을 쉽게 이해할 수 있는 그림예제

 

링크 ( Link ) 란?

위에서 설명한 Compile로 생성된 목적파일(.obj 등)만으로는 프로그램을 실행할 수 없다. 보통 사람들은 위에서 설명한 컴파일(Compile)이 원시 코드(. c or .java 등)에서 바로 실행파일(.exe 등)로 변환되는 것이라고 생각하지만, 이것은 컴파일러가 하는 역할일 뿐 컴파일 (Compile)이 아니다. 컴파일이라는 개념은 위에서 설명한 대로 원시 코드에서 목적 파일로 바꾸는 것일 뿐이다.

 

그렇다면 링크는 무엇인가? 컴파일(Compile)과정을 통해 만들어진 목적 파일(. obj 등)을 실행파일(. exe 등)로 만드는 것을 링크(Link)라고 한다. 대부분의 애플리케이션 로직에는 사용자가 직접 작성한 소스코드 이외에도 내부적으로 상당히 많은 라이브러리(Library)를 포함하고, 사용자가 직접 만든 라이브러리 또한 포함된다. 때문에 링크(Link)는 여러 개의 목적 파일(. obj 등)을 하나의 실행파일로 묶어주는 것이다.

컴파일,링크의 차이를 쉽게 이해할 수 있는 그림예제

 

빌드 ( Build ) 란?

빌드의 목적은 기본적으로 실행파일을 만드는 것이다. 때문에 손쉽게 이해하기 위해서는 아래의 공식이라고 생각하면 된다.

빌드 ( Build ) = 컴파일 ( Compile ) + 링크 ( Link ) 

그렇다면 IDE툴에 있는 Build의 의미는 알겠는데, Run은 무었인가? 실행 ( Run )은 말 그대로 Build 된 실행파일을 실행까지 진행한다. 때문에 실행 과정 전에 있는 빌드 과정에서 코드상 에러가 있으면 컴파일 에러 ( Compile Error )를 발생시키는데, 정확한 에러를 잡기 위해 디버그 ( Debug )라는 별도의 개념이 존재한다. 디버그 ( Debug )는 빌드 과정에서 컴파일 에러를 발견할 경우 ( 시스템의 논리적 오류 혹은 비정상적인 연산 등), 그 원인을 사용자(developer)에게 알려준다. 그 알려진 일련의 에러까지 수정하는 작업을 디버깅 ( Debugging )이라고 한다.

빌드 ( Build )의 그림예제

 

컴파일과 빌드의 차이점은?

기본적으로 빌드는 실행파일 (.exe 등)을 만드는 일련의 과정을 의미한다. 때문에 빌드의 단계 중 컴파일이 포함되어 있고, 쉽게 이야기하면 컴파일은 빌드의 부분집합이라고 할 수 있다. 둘의 차이점을 논하는 것보다는 컴파일 ( Compile )이란 무엇이고, 그 과정을 통해 실행파일까지 만드는 전체적인 과정을 빌드 ( Build )라고 이야기하는 것이 옳다.

 

배포 ( Deploy )란?

빌드 완료된 실행 파일 (.exe 등)을 실제 사용자가 접근할 수 있는 환경으로 배치시키는 것을 의미한다. 흔히 현업에서 1개의 프로젝트에 여러 개발자들이 함께 참여하여 각각의 기능들을 만들고, 버전 관리 (Git, Svn 등) 오픈소스를 통하여 각 기능들을 한 코드로 뭉친다.

 

이렇게 뭉쳐진 코드들이 하나의 완성된 프로젝트가 되는데, 개발자들의 로컬환경에서 빌드(Build)되어 여러 가지의 테스트를 거쳐 최종 테스트가 완료되면 실제 사용자가 사용할 수 있는 실제 서버(Release Server)에 배포(Deploy)한다고 말한다. 실 서버의 배포가 잘못되면 서비스 운영에 지장을 초래하기 때문에 현업에서는 보통 아래와 같은 흐름으로 배포를 진행한다.

 

보통 로컬 -> stage서버(개발 서버) -> release서버(실제 운영 서버)로 배포를 진행하며, 각각의 버전 관리나 배포 순서, 서버의 이름 등은 회사마다 각기 다르다. 아래는 참고만 할 것.

1. 각자의 로컬환경에서 필요 기능 개발 -> 각자의 로컬 브랜치에 commit -> commit history 정리 후 원격지의 브랜치에 push.
2. stage서버와 연동된 원격 브랜치에 merge -> stage서버에 merge 된 코드 배포(deploy) -> stage 서버 테스트
3. release서버와 연동된 원격 브랜치에 stage의 merge된merge 된 브랜치를 merge -> release 서버에 merge 된 코드 배포
4. 실서버 모니터링