작성 동기
우리가 백엔드 개발을 하는 상황을 예를 들어보자. IntelliJ나 eclipse 같은 개발 툴을 사용하여 원하는 로직을 개발 할 것이다. 만든 것을 테스트 해보기 위해 main class를 run 하면 툴이 알아서 내 소스들을 슉슉 검사해주고 그게 정상 완료되면 콘솔이나 localhost 웹 상에서 테스트할 수 있도록 실행이 된다.
이렇게 로컬 환경에서 개발만 하는 상황이라면 컴파일, 빌드, 배포의 상세한 과정이나 정의를 몰라도 개발만 제대로 하면 되었다. 실행시켜서 잘 나오기만 하면 되었으니까. 다만 실무를 경험하면서 실제 서버에 배포하거나 서버를 구축해보는 과정에서 이러한 지식이 필요하고 나는 많이 부족하다는 것을 느꼈다. 기초적인 것도 알지못하는데 서버 개발, 백엔드 개발을 한다고 말할 수 있을까? 라는 생각에 기본적인 것을 차근차근 정리해보고자 이 글을 작성한다.
현실 세계에서의 컴파일, 빌드, 배포
영문 책이 서점에 오기까지의 과정을 예를 들어보자.
- 번역가가 영문으로 된 글을 한글로 번역한다. -> 컴파일
- 출판사에서는 번역된 글을 모아서 한 권의 책으로 엮는다. -> 빌드
- 책을 서점으로 배송해서 원하는 위치에 진열한다. -> 배포
프로그래밍에서의 컴파일, 빌드, 배포
- 사용자가 작성한 코드를 컴퓨터 언어로 번역한다. -> 컴파일
- 컴파일 된 파일을 실제 실행시킬 수 있는 상태의 파일로 만든다. -> 빌드
- 실행 가능한 파일을 사용자가 접근할 수 있는 환경에 배치한다. -> 배포
* 1~2의 과정을 포함시켜 '빌드' 라고 표현하기도 한다.
헷갈린다면 개발 툴을 사용하여 Java로 코딩한다고 생각해보자.
1. 코드를 짜고 Run을 눌러 실행한다. (컴파일, 실행)
- .java 파일이 번역되어 .class 파일이 생성된다. (컴파일)
- 파일이 실행된다. (실행)
2. 실행 가능한 파일(.war, .jar 등)로 뽑아낸다. (빌드)
3. 웹 서버에 접근하여 원하는 디렉토리에 실행 파일을 올린다. (배포)
터미널을 통해 이해해보자
일반적으로 개발 툴에서는 실행하면 알아서 컴파일 되고 실행되기 때문에 이 과정을 신경 쓸 필요가 없었다.
하지만 터미널 상에서 자바 파일을 직접 실행하려고 한다면 이해가 될 것이다.
test.java 라는 파일을 하나 작성했다. 터미널에서 실행해보자.
$ java test.java
오류: 기본 클래스 test.java을(를) 찾거나 로드할 수 없습니다.
작성은 했는데 번역된 파일이 없어서 컴퓨터가 이해할 수 없기에 오류가 난 것이다.
$ javac test.java
$ ls
test.class test.java
위처럼 javac를 통해 java파일을 컴파일 시켰다. 파일목록을 확인해보니 test.class 파일이 추가로 생성된 것을 확인할 수 있다.
$ java test
Hello, Test World! -- 실행 내용
확장자를 빼고 java 명령어를 실행시켰다. 잘 실행이 된 것을 볼 수 있다.
만일 이미 올려져있는 프로그램에 이 test 파일이 추가로 필요하다면 이렇게 컴파일된 .class 파일을 지정된 프로그램의 위치에 접근하여 배치해주면 이 또한 배포라고 볼 수 있다.
위 내용을 통해 컴파일, 빌드, 배포가 무엇이고 프로그램이 어떤 과정을 통해 배포되는지 조금이나마 이해할 수 있었으면 좋겠다. 끝-!