본문 바로가기

Spring

Maven & Gradle

빌드란?

서버에 기능을 추가 하려면 개발자가 로컬 PC에서 개발을 하고 테스트까지 진행한 뒤에 문제가 없을 경우 사용자가 사용할 수 있도록 수정된 코드를 실서버에 반영해야 한다.

서버에 반영을 하는 것을 "배포"라고 하고 배포(Deploy) 하기 위한 과정을 "빌드"라고 한다.

 

빌드

소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 그 결과를 말한다.

예를 들어 Java프로젝트를 진행한다면 개발자가 작성한 A.java와 여러가지 정적 파일등에 해당하는 resource가 존재한다.

빌드를 한다면 소스코드를 컴파일해서 .class로 변환하고 resource를 .class에서 참조할 수 있는 적절한 위치로 옮기고 META-INF와 MANIFEST.MF 들을 하나로 압축하는 과정을 의미한다.

컴파일은 빌드의 부분집합인 셈이다.

또한, 빌드 과정을 도와주는 도구를 Build Tool이라고 한다.

즉, 컴파일 된 코드를 실제 실행할 수 있는 상태로 만드는 일을 Build 라고 한다.


빌드 툴(Build Tool)의 종류

1. ant

ant는 build.xml로 관리된다. 빌드 과정을 target으로 만들어 단계별로 수행한다.

// build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 프로젝트 빌드용 Ant 스크립트. build.properties의 내용을 기본 설정으로 사용한다.-->
<project name="common" default="compile">
    <property name="src.dir" value="src" />
	 
  	<target name="clean">
        <delete dir="build"/>
    </target>

    <target name="compile">
        <mkdir dir="build/classes"/>
        <javac srcdir="src" destdir="build/classes"/>
    </target>

    <target name="jar">
        <mkdir dir="build/jar"/>
        <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="oata.HelloWorld"/>
            </manifest>
        </jar>
    </target>

    <target name="run">
        <java jar="build/jar/HelloWorld.jar" fork="true"/>
    </target>
</project>

위는 build.xml의 예시이다. 코드만 보면 간단하다고 느낄 수 있지만 프로젝트가 커지면 많이 복잡해지고, 규칙이 없기 때문에 이해하는데 많은 시간이 소요될 수 있다.

 

또한 ant는 remote repository를 사용할 수 없다. maven이나 gradle을 사용할 때는 mavenrepository에서 의존성을 찾아서 넣어주기만 하면 되는데, ant는 이게 불가능하다. 직접 jar를 받아서 넣어줘야한다. 그래서 나온것이 Ivy이다.

 

// maven
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>


// gradle
providedCompile group: 'org.projectlombok', name: 'lombok', version: '1.18.16'


// Ivy
<dependency org="org.projectlombok" name="lombok" rev="1.18.16"/>

 

2. Maven

ant의 단점을 보완해서 나왔다. 외부 라이브러리를 관리하고, 표준화된 포맷을 제공한다. 하지만 여전히 POM.xml라는 xml로 관리된다.

 

Maven은 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운 받아준다.

 

Maven은 프로젝트의 전체적인 라이프사이클을 관리하는 도구이며, 많은 편리함과 이점이 있어 널리 사용되고 있다. 기존에는 Ant가 많이 사용되었지만 Maven이 Ant를 넘어서 더 많은 개발자들이 사용하게 되었고 비교적 최근에는 Gradle이 새롭게 나와 사용되고 있다.

 

// POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Maven은 다음과 같은 특징을 갖고 있다.

  • Dependency를 관리하고, 표준화된 프로젝트(Standardized project)를 제공
  • XML, remote repository를 가져 올 수 있음 : 개발에 필요한 종속되는 'jar', 'class path'를 다운로드 할 필요 없이 선언만으로 사용 가능
  • 상속형 : 하위 XML이 필요 없는 속성도 모두 표기

단점

  • 라이브러리가 서로 종속할 경우 XML이 복잡해짐
  • 계층적인 데이터를 표현하기에 좋지만, 플로우나 조건부 상황을 표현하기엔 어려움
  • 편리하나 맞춤화된 로직 실행이 어려움

3. Gradle

gradle은 build.gradle로 관리된다. xml대신 groovy 언어를 사용한다.

안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원한다.

빌드툴인 Ant Builder와 그루비 스크립트를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용가능하다.

장점으로는 스크립트 언어로 구성되어 있기때문에, XML과 달리 변수선언, if, else, for등의 로직이 구현가능하여 간결하게 구성 가능하다.

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

다음과 같은 특징이 있다.

  1. 간결함: xml의 구조적인 장점이 있지만 문서의 양 자체가 비대하지는 단점이 있는데, Gradle은 코딩에 의한 간결한 정의가 가능하다.
  2. 재사용에 용이: 프로젝트 설정 주입 방식(Configuration Injection)으로 정의하여 Maven의 상속 구조보다 재사용에 용이하다.
  3. 구조적인 장점: Build Script를 xml이 아닌 Groovy기반의 DSL(Domain Specific Language)를 사용하여 코드로서 설정정보를 구성하기 때문에 구조적인 장점이 있다.
  4. 편리함: Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드를 지원한다.
  5. 멀티 프로젝트: 애초에 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다.
  6. 지원: Maven과 Ivy repository를 완전 지원한다.

참고

 

 

'Spring' 카테고리의 다른 글

Servlet과 Spring MVC  (0) 2023.03.06
AOP의 개념  (0) 2023.02.05
Spring vs Spring boot  (0) 2022.11.09
BeanFactory & ApplicationContext  (0) 2022.11.08
Spring Bean life cycle  (0) 2022.11.08