글을 작성하게 된 계기
스스로에게 빌드(Build) 와 컴파일(Compile) 의 차이에 관해 물었는데, 한두 문장으로 명확하게 정의하지 못했습니다. 이번 기회에 이를 명확하게 정리하고 싶어 글을 작성하게 되었습니다.
1. 빌드와 컴파일
먼저 빌드와 컴파일의 정의에 대해 살펴보겠습니다.
- 컴파일(Compile)
- 빌드(Build)
1-1. 컴파일
컴파일이란 소스 코드를 컴퓨터가 실행할 수 있는 기계어 코드로 변환하는 과정 을 말합니다.
예를 들어, 아래와 같은 개발자가 작성한 파일(HelloWorld.java)을 컴파일 해보겠습니다.
1
2
3
4
5
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
아래의 과정을 거치면, HelloWorld.class라는 실행 가능한 파일이 생성되고, 이를 실행하면 우리가 원하는 결과를 볼 수 있습니다. 즉, 우리가 작성한 소스 코드를 컴퓨터가 실행 가능한 기계어 코드로 변환한 것이죠.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1.HelloWorld.java 파일 존재
$ compile ls
HelloWorld.java
# 2.컴파일
$ compile javac HelloWorld.java
# 3.HelloWorld.class 파일 생성
$ compile ls
HelloWorld.class HelloWorld.java
# 4.실행
$ compile java HelloWorld
Hello, World!
1-2. 빌드
빌드란 소스 코드 파일들을 컴퓨터에서 실행할 수 있는 독립적인 소프트웨어 아티팩트(Artifacts)로 변환하는 작업 을 말합니다. 여기에는 링킹(linking), 라이브러리 결합, 자원(resource) 파일 포함, 테스트 코드 실행 등 다양한 단계가 포함될 수 있습니다.
아티팩트(Artifact)는 소프트웨어를 만들어내는 과정에서 나오는 모든 산출물/결과물 입니다. 예를 들어, IntelliJ를 사용할 때, 아티팩트명을 지정하는 칸이 나오는데, 이는 빌드의 최종 결과/실행 가능한 파일 을 의미합니다.
참고로 JFrog에서 Artifactory라는 개념을 사용하는데, 관심이 있다면 한 번 읽어볼 것을 권장드립니다.
빌드를 하면 지정한 아티팩트 이름으로 실행 가능한 파일이 생성된 것을 볼 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
# 1.빌드
$ ./gradlew build
......
BUILD SUCCESSFUL in 7s
8 actionable tasks: 8 executed
# 2.실행 가능한 파일 생성(.jar)
$ world cd build
$ build cd libs
$ libs ls
world-0.0.1-SNAPSHOT-plain.jar world-0.0.1-SNAPSHOT.jar
2. 차이점
컴파일은 소스 코드를 실행 가능한 코드로 변환하는 단일 작업 이며, 빌드는 소스 코드 컴파일을 포함해 실행 가능한 소프트웨어를 만들기 위한 전체 과정 입니다. 스프링 프로젝트를 빌드하면 아래 과정을 거치는데요, compileKotlin과 compileJava가 포함된 것을 볼 수 있습니다. 즉, 컴파일이 빌드의 일부일 수 있는 것입니다.
1
2
3
4
5
6
7
8
9
10
11
12
Executing 'build'...
> Task :checkKotlinGradlePluginConfigurationErrors
> Task :compileKotlin UP-TO-DATE # Kotlin 컴파일
> Task :compileJava NO-SOURCE # Java 컴파일
> Task :processResources UP-TO-DATE
......
> Task :test
> Task :check
> Task :build
위에서 애매모호하게 컴파일이 빌드의 일부일 수 있다 고 했는데요, 이는 빌드 과정에서 모두 컴파일이 일어나는 것은 아니기 때문입니다. 예를 들어, 파이썬(Python)과 같은 인터프리터 언어들은 빌드 과정에 컴파일이 포함되지 않을 수 있습니다.
물론 파이썬 인터프리터가 소스 코드를 직접 읽고 실행하며, 이 과정에서 바이트코드로 변환되기는 합니다.
3. 정리
컴파일과 빌드의 차이점에 대해 정리해 보았습니다. 이미 알고 있다고 생각했었는데, 한두 문장으로 요약하는 건 생각보다 안 되더라고요. 여튼, 이 둘의 차이점을 명확히 짚고 넘어갑시다.