[Spring] 빌드 도구 Maven과 Gradle

DyungE_100·2022년 4월 12일
0

Spring

목록 보기
2/7
post-thumbnail

0. 자바의 빌드 도구

0.1 빌드(Build)란?

소스 코드 파일을 실제로 컴퓨터나 스마트폰에서 동작할 수 있는 독립적인 프로그램으로 만드는 과정을 일컫는다.

자바의 경우, 빌드 방식을 인터프리터 방식에서 JIT방식으로 변경하였다.

0.2 빌드 도구란 무엇인가?

빌드 도구란 소스 코드를 애플리케이션으로 변경하는데 있어 자동화를 해주는 툴(Tool)이자 프로그램이다.
빌드 도구가 해주는 역할은 다음과 같다.

  • 필요한 라이브러리들을 자동으로 추가해주고 동기화시켜준다.

  • 프로젝트 생성부터 테스트까지 쉽게 다룰 수 있도록 만들어준다.

  • 컴파일 및 빌드 자동화

자바에는 원래 'Ant'라는 툴이 있었지만 빌드의 과정을 이해하기 어렵거나 스크립트의 재사용성의 문제로 현재는 쓰고 있지 않다.


1. Maven

  • 프로젝트의 전체적인 사이클을 관리하며, Ant의 대안책으로 만들어졌다.

  • 필요한 라이브러리를 pom.xml에 적으면 네트워크를 통해 자동으로 불러온다.

  • 해당 라이브러리가 작동하는 데 필요한 다른 라이브러리들의 의존성도 관리한다.

  • 아파치 라이센스로 배포되는 오픈소스 소프트웨어다.

1.1 Maven의 기본적인 폴더 구조

  • [src/main/java] : 기본적인 클래스나 인터페이스들을 저장하는 공간

  • [src/main/resources] : 스프링 설정에 관한 xml 파일들을 저장하고, DB 정보를 담고 있는 properties파일이나 static 파일, templates 파일이 들어있는 공간

  • [src/test/java] : 테스트 코드를 저장하는 공간

  • [JRE System Library] : 자바 표준 라이브러리를 저장하는 공간

1.2 Maven에서 POM(Project Object Model).xml이란?

여기서 POM(Project Object Model)이란 프로젝트의 다양한 정보를 처리하기 위한 객체 모델이다.

  • 1) 기본적인 구조
<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/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.blidkaga.group</groupId>
   <artifactId>group-test</artifactId>
   <name>test</name>
   <packaging>war</packaging>
   <version>1.0.0-SNAPSHOT</version>
</project>

<procject> : 루트 태그로 정해진 기본 정보를 기술한 태그

<modelVersion> : POM 모델 버전을 알려주는 태그

<groupId> : 그룹ID를 알려주는 태그로 제작자나 회사를 식별하기 위함

<artifcatId> : 프로젝트의 고유 ID이며 프로젝트명을 알려주는 태그

<version> : 프로그램 버전, 기본적으로 1.0-SNAPSHOT으로 설정됨

<name> : 프로그램의 이름을 알려주는 태그

<packaging> : 패키지 종류로 .jar, .zip, .war 등으로 지정하고, 주로 웹 애플리케이션에선 .war로 지정하는 경우가 많다.

2) 의존성 설정

  <properties>
    <java-version>1.6</java-version>
    <org.springframework-version>3.1.1.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.10</org.aspectj-version>
    <org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
       <version>${org.springframework-version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework-version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<properties> : maven 내부에서 반복적으로 사용되는 값들을 정의할 때 사용하는 태그
예시) 해당 자바 버전을 선언 하고 dependencies에서 다음과 같이 활용이 가능 하다.

<version>${java.version}</version>

<dependencyManagement> : dependencies 태그보다 상위에 쓰며, 각 <dependency> 태그는 최소 3개의 메인 태그들(groupId, artifactId, version)을 가지고 있어야 한다. 선언적인 의미가 크며 직접적으로 종속성을 추가해주진 않음.

<dependencies> : <dependency> 태그들의 리스트이며, 최소 2개 이상의 메인 태그들(groupId, artifactId)을 가지고 있어야 한다.

<dependency> : 의존성 라이브러리의 정보를 추가해주는 곳이며, <scope> 태그는 해당 라이브러리가 이용되는 범위를 설정해줄 때 쓰인다.

3) 빌드 정보

<build>
        <sourceDirectory>src/main/java</sourceDirectory>
 <testSourceDirectory>src/test/java</testSourceDirectory>
 <outputDirectory>${project.basedir}/target/classes</outputDirectory>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
 <directory>resources-${deploy.phase}/</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            </plugin>
        </plugins>
    </build>

<build> : 빌드에 사용할 플러그인 목록들을 가지고 있으며, 원하는 형태의 파일로 빌드하기 위해 필요한 태그이다. 빌드 과정에 대한 정보를 담고 있다.

그 밖에도 의존성을 다운 받을 위치를 지정해주는 <repository> 태그와 maven plugin을 다운 받을 위치를 지정해주는 <PluginRepository> 태그 그리고 deploy goal을 실행했을 때 배포되는 위치를 기술하는 태그도 있다.

1.3 플러그인(Plugin)과 라이프 사이클(Life-Cycle)

플러그인(Plugin)이란 Maven의 가장 핵심적인 특성이다. 플러그인은 Goal(작업에 대한 명령)을 하나 이상 가지고 있고 이를 실행시키면 플러그를 콘센트에 꽂듯이 작업에 대한 명령을 수행에 옮긴다.

라이프 사이클(Life-Cycle)이란 메이븐이 빌드를 하는 과정을 미리 표준으로 정의한 순서를 말한다. 라이프 사이클의 각 단계를 페이즈(Phase)라고 부르며, 간단히 요약하자면 compile => test => package 순으로 진행된다.


2. Gradle

  • Ant의 장점을 가져오고 Groovy 기반 DSL로 만들어져, 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용한다.

  • JAVA뿐만 아니라 C/C++과 Python도 지원한다.

  • Maven에 비해 빌드 속도가 빠르다.

  • Build-by-convention : 스크립트 규모가 작고 읽기 쉽다.

  • Maven과 달리 build.gradle 파일로 여러 설정을 해준다.





https://araikuma.tistory.com/447,
https://dev-coco.tistory.com/65,
https://wikidocs.net/18340,
https://araikuma.tistory.com/447,
https://goddaehee.tistory.com/199,
https://maven.apache.org/guides/introduction/introduction-to-plugins.html,
https://www.baeldung.com/maven-plugin,
https://giles.tistory.com/12,
https://goddaehee.tistory.com/199,
https://www.baeldung.com/maven-dependencymanagement-vs-dependencies-tags,
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html,
https://stackoverflow.com/questions/2619598/differences-between-dependencymanagement-and-dependencies-in-maven/37280943#37280943,
https://salmonworld.tistory.com/139,
https://sugerent.tistory.com/571,
https://jisooo.tistory.com/entry/Spring-%EB%B9%8C%EB%93%9C-%EA%B4%80%EB%A6%AC-%EB%8F%84%EA%B5%AC-Maven%EA%B3%BC-Gradle-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0,

0개의 댓글