View

# Build? Compile? 


- 우선 빌드라는 용어가 익숙하지 않은 사람들을 위해 빌드와 컴파일이 무슨 차이가 있는지 알아보았다. 학교수업 또는 책에서 위와 같은 그림을 많이 봤을 것이라고 생각한다. C언어로 작성한 소스파일을 실행파일로 만드는 과정인데, 전처리Preprocessing - 컴파일Compile - 어셈블Assemble - 링킹Linking 이라고 한다. 위와 같이 보듯 전처리는 매크로 및 상수변수 등을 실제 값으로 변경하는 작업을 수행하며, 컴파일은 소스코드를 어셈블리 언어로 변경하는 작업을 수행하며, 어셈블러는 각 기계에 맞도록 기계어로 변경해 주는 작업을 한다. 

- 컴파일은 위와 같이 소스코드를 어셈블리 언어로 변경시켜주는 작업, 흔히들 소스코드에 문법적인 오류가 있는지 확인하는 행위로 생각된다. 흔히들 이때 찾는 에러를 컴파일타임 에러, 주로 문법적인 에러라고 한다. (반대로 실행 중 발생하는 에러를 런타임 에러 라고 한다. 이는 잘못된 참조, 메모리 부족 등으로 발생된다.) 

- 이와는 다르게 빌드는 목적에 맞는 실행파일을 만드는 것에 의미를 가지고 있다. 그 실행 파일이 우리가 쉽게 생각하는 exe/jar 파일일 수도 있으며, 배포와 같은 목적을 가지고 있을 때는 zip/tar 파일이 될 수도 있다. 


# Java compile process 

- 위에서 보았던 예제는 C 언어를 기반으로 설명을 하였다. C언어와 같은 일반적인 프로그램은 소스코드를 작성 후 컴파일러를 이용해 특정 플랫폼에 의존적인 기계어로 변경하여 프로그램을 실행한다. 하지만 Java와 같이 이식성이 높은 언어의 경우 java로 작성한 소스코드(*.java)를 javac 라는 컴파일러를 사용하여 중간 코드로 변환된다. 중간코드는 바이트코드(*.class)로 불리는데, 이것은 실행환경의 JVM(Java Virtual Machine)에 의해서 실시간으로 바이트코드를 읽어서 실행한다. 그렇기 때문에 Java 초기에는 성능에 대한 이슈가 있었지만 JIT(Just-In-Time) compiler와 같은 성능 개선을 통해 빠르게 처리할 수 있게 되었다. 

- javac 컴파일러를 통해서 각 *.java 파일로 작성된 소스코드는 각각이 class file로 생성되기 때문에, 여러 class file로 구성된 프로그램인 경우는 그 구조를 기술한 파일 manifest파일과 함께 JAR(Java Archive) 형태로 배포된다. 


# Build Tool 

- 실제 프로젝트를 수행하면서 빈번히 발생하는 상황으로, 개발 환경에서는 오류가 발생하지 않았으나 운영 환경에서 에러가 발생하는 경우이다. 이는 개발환경과 실제 운영 환경에서 빌드하는 방식이 다르거나 소스코드가 충분히 업로드 되지 않거나 SVN을 통해 개발하는 경우 소스코드가 꼬이는 경우 이다. 다수가 개발하는 프로젝트의 경우 모듈별 빌드 및 개발이 동시에 이루어지기 때문에 빌드를 별도의 서버를 통해서 수행하는 경우가 많은데, 이때 빌드 서버는 운영과 동일한 환경으로 구성한다. 

- 빌드툴은 이렇게 다양한 환경에서 소프트웨어 개발 업무에 대한 빌드 프로세스를 자동화-표준화 함으로써, 개발-테스트-운영 구조에서 큰 작업 없이 빌드/배포 할 수록 도와준다. 빌드/배포 프로세스는 보통 프로그램 개발과 동시에 이루어 지는 경우가 많은데 그렇지 않은 경우 빌드/배포 프로세스를 변경하기 위해서 소스코드 등이 변경되어야 할 수가 있다. 

- Java 초창기 부터 사용했던 빌드 툴인 Ant를 포함하여 그것을 보완하기 위한 Ivy를 알아보고, 그 둘이 가지고 있는 빌드 자동화 및 외부 라이브러리 자동참조 등의 기능을 포함하고 있는 Maven, 그리고 Maven Repository 의 기능을 수행하는 Nexus를 알아본다. 추가로 Maven의 확장성을 보완하기 위한 Gradle 까지 알아보도록 하자. 

Share Link
reply
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31