ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 빌드란?(+빌드 도구)
    Java 2021. 11. 30. 15:26
    728x90

    "빌드와 배포" 개발하면서 정말 많이 들어본 용어이고, 매일매일 빌드를 진행하지만 개념에 대해 자세히 모르는 것 같다고 느껴져 정리하게 되었습니다.

     


    빌드를 이야기할 때는 항상 컴파일러, 링크가 등장하는데 컴파일러에 대해 먼저 알아보겠습니다.

     

    컴파일러(Compiler)란?

    자바의 경우 JVM에서 사람이 이해하기 쉬운 소스코드(. java)를 컴퓨터가 알아 들을 수 있는 기계어(. class)=(이진 코드)로 바꾸어주는 역할을 수행합니다.

     

     

     

    일상생활에서 예시를 들어보자면 외국어를 우리가 알아들을 수 있는 한국어로 번역해주는 일을 하는사람이 컴파일러의 역할을 수행한다고 이해할 수 있습니다.

     


    다음은 링크에 대해 알아보겠습니다

     

    링크(Link)란?

    프로젝트를 진행하게 되면 여러 소스파일이 생기고 서로 다른 파일에서 함수를 호출하는 경우가 있습니다. 

     

    따라서 서로 다른 파일들을 연결해주는 작업을 Link라고 합니다. 또한 필요한 외부 리소스를 같이 연결해줍니다.

     

    자바의 경우 JVM이 프로그램 실행 도중에 필요한 class를 찾아서 class path에 로드해줍니다.

     

    일상생활에서 예시를 들어보자면 따로따로 존재하는 책의 페이지를 엮어주는 일을 하는 사람이 링크의 역할을 수행한다고 이해할 수 있습니다.


    빌드란?

    개발자가 작성한 소스코드를 실행 가능한 소프트웨어 결과물로 만드는 일련의 과정입니다.

    따라서 컴파일, 링크는 빌드의 부분집합 안에 속해져 있습니다.

     

    일상생활에서 예시를 들어보자면 외국어로 이루어진 책의 페이지를 번역하고 책의 페이지를 엮어주어 우리가 볼 수 있도록 책으로 결과물을 만드는 일련의 과정이 빌드라고 이해할 수 있습니다.

     

    그렇다면 여기서 빌드 도구라는 용어도 많이 등장하게 됩니다.

     

    빌드 도구란?

    빌드와 도구만을 보았을 때는 소스코드를 소프트웨어 결과물로 만드는 일련의 과정을 도와주는 역할을 수행한다고 추측해 볼 수 있을 것 같습니다.

     

    빌드 도구는 빌드 자동화를 시켜주는 실행 가능한 프로그램 만들어주는 프로그램을 말합니다.

     

    빌드 자동화란?

    빌드 자동화란 실행 가능한 프로그램을 만들어주는 과정으로써 소스코드를 컴파일해서 이진 코드로 만들고 패키징 하며 의존성도 다운로드하고 코드를 테스트하고 실행가능한 프로그램이 나오기까지의 과정입니다

     

    그러면 왜 빌드 도구를 사용해야 할까요?

     

    작은 프로젝트라면 개발자가 수동으로 라이브러리 의존성을 잡아주고 컴파일하고 테스트하고 실행파일을 만들 수 있을 것입니다. 하지만 프로젝트가 커지게 되면 수동으로 위와 같은 일을 수행하기란 정말 어려울 것입니다.

    따라서 빌드 도구를 통해 이런 빌드 과정의 이런 짜증 나는 작업들을 대신 수행할 수 있습니다.

     

    또한 혼자 개발할 때는 필요한 외부 라이브러리들을 컴퓨터에 미리 설치해 두면 되지만 다른 개발자가 이용을 하기 위해서는 외부 라이브러리가 설치되어 있지 않으면 애플리케이션을 실행할 수 없어 협업이 힘들어지게 됩니다.

     

    의존성 관리란?

    프로젝트에서 외부의 어떤 라이브러리를 사용하고 있는지 별도로 관리하는 것

     


    Java의 빌드 도구들

    Ant-> Maven -> Gradle 순서로 출시되었으며 엄청 자세하게는 다루지 않고 간단하게만 알아보고자 합니다.

     

    1. ANT

    최초로 출시된 빌드 도구로 xml 기반 빌드 스크립트를 개발하고 규칙이 없어 유연하다고 합니다. 하지만 유연성이 높은만큼 규칙이 없어서 프로젝트가 복잡해지는 경우 이해가 어렵다고 합니다.

     

     

    2. Maven

    Ant의 단점을 보완하여 Convention(규칙)에 의존합니다.

    pom.xml이라는 파일을 사용하여 프로젝트에 필요한 종속성을 리스트 형태로 Maven에게 알려주어 관리합니다. 

     

    아래는 pom.xml에 작성하는 종속성추가 예시입니다.

    	<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-test</artifactId>
    			<version>${org.springframework-version}</version>
    	</dependency>

     

    3. Gradle

    버전 충돌 관리가 되지않는 Maven의 단점을 보완했습니다.

    Xml을 사용하지 않고 Groovy(JVm Language 중 하나)를 기반으로 한 DSL로 작성합니다.Script의 길이가 Ant, Maven보다 짧고 깔끔합니다.

     

    아래는 build.gradle에 작성하는 종속성추가 예시입니다.

    implementation 'org.springframework.boot:spring-boot-starter-web'

     

     

    DSL이란?

    Domain Specific Language의 약자로 특정 분야에 최적화된 프로그래밍 언어라고 합니다.

     

    그러면 Java의 어떤 빌드 도구를 사용하는 게 좋을까요?

     

    Maven보다 Gradle이 스크립트가 짧고 읽기 쉬우며 빌드 시간(최대 100배 빠름), 유연성, 종속성 관리 등 성능적인 측면에서도 좋습니다.

     

    gradle 공식문서에서도 gradle vs maven이라는 글을 작성하여 올릴만큼 자신있어 하는 모습을 보입니다.

     

    단지 Maven을 쓰는 이유는 익숙해짐과 협업의 경우 모든 팀원들이 Groovy 문법을 익히는 데에 대한 어려움뿐인 것 같습니다.

     

    하지만 빌드시간이 점점 증가하게 된다면 필연적으로 Gradle이 지배하게 될 것 같습니다.

     

     

    출처

    https://gradle.org/maven-vs-gradle/

    https://www.youtube.com/watch?v=JgRCaVwkPE8&t=386s 

    https://velog.io/@leede418/CS-Compile-Link-Build-%EB% 9E%80

    https://www.youtube.com/watch?v=6SvUZqbU37E 

    https://ganbarujoy.tistory.com/20

    https://bkim.tistory.com/13

    댓글

Designed by Tistory.