빌드 & 빌드 도구 (Gradle, Maven)

박영준·2023년 6월 26일
0

Spring

목록 보기
22/58

1. 빌드

1) 정의

  • 프로젝트의 생명주기(소스코드 개발 ~ 최종 사용자에게 전달되기까지)를 아우르는 행위

  • 개발자가 작성한 소스 코드를 실행할 수 있는 독립적인 형태(.war, .jar)로 변환하는 과정 및 결과
    (변환하는 과정에는 컴파일 과정도 포함)

  • 프로젝트를 빌드 한다면
    .java 파일들을 .class 파일로 컴파일하고, resource파일들을 .class를 참조 할 수 있는 위치로 옮기는 등...
    여러 데이터들을 압축하는 과정을 거쳐, 하나의 결과물로 나올 것이다.
    → 이런 빌드 결과물을 실제 서버에 업로드하는 것을 '배포'라고 한다.

2) .war & .jar

.war 확장자 파일

  • servlet / jsp 컨테이너에 배치 할 수 있는 웹 어플리케이션 압축 파일 포맷

  • 웹 응용 프로그램를 위한 포맷이므로, 웹 관련 자원만 포함하고 있으며
    이를 사용하면, 웹 어플리케이션을 쉽게 배포/테스트 가능

  • (원하는 구성을 할 수 있는 JAR 포맷과 달리) WEB-INF 및 META-INF 디렉토리로 사전 정의 된 구조를 사용

  • WAR 파일을 실행하려면, 웹 서버(Tomcat, Weblogic, Websphere 등...) 또는 웹 어플리케이션 서버(WAS)가 필요

.jar 확장자 파일

  • .jar 확장자 파일에는 Java 리소스(Class와 같은)와 속성 파일, 라이브러리 파일이 포함되어 있다.

  • JAR 파일은 원하는 구조로 구성이 가능

  • JDK(Java Development Kit)에 포함하고 있는 JRE(Java Runtime Environment)만 가지고도 실행이 가능

  • 윈도우 ZIP 파일과 비슷한 구조를 가짐

2. 빌드 도구

1) 정의

프로젝트 > build > libs > .jar 파일 두 개

빌드를 자동화해서 도와주는 도구

즉, 간편하게 Java 소스 코드를 실행한 가능한 jar 파일로 만들어준다.

2) 필요성

만약, 빌드 도구를 사용하지 않고 개발자가 직접 프로젝트를 빌드 해야 한다면?
개발자는 프로젝트 환경 설정에 오랜 시간이 걸린다.
(프로젝트에 필요한 많은 라이브러리 다운, 라이브러리에 대한 의존성도 수동으로 잡기, 컴파일, 테스트, 실행 파일로 만들기 ...)

그런데 빌드 도구는 이러한 과정들을 자동화 시켜준다.

3) 종류

(1) Maven

① 정의

  • XML 기반
    → pom.xml 이라는 이름을 사용

  • 대표적인 Java 프로젝트용 빌드 도구

  • 자동화

    • 라이브러리를 자동 추가
    • 관리 및 라이브러리 버전을 자동 동기화
  • 프로젝트의 정보 전달

  • 프로젝트 라이프 사이클 관리

  • JDK와 함께 설치 가능

  • 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 함

    XML (eXtensible Markup Language)

    • 마크업 언어로 표현 된 데이터 전달 언어
    • <데이터설명> 데이터 </데이터설명>

② 사용법

  1. 프로젝트에서 Maven 을 사용
  2. 프로젝트 최상위 디렉토리에 pom.xml 파일 생성됨

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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.programming.mitra</groupId>		 <!-- <groupId> : 의존하는 프로젝트 그룹의 id -->
    <artifactId>java-build-tools</artifactId>		<!-- <artifactId> : 의존하는 프로젝트의 artifactId -->
    <packaging>jar</packaging>
    <version>1.0</version>		<!-- <version> : 의존하는 프로젝트의 버전 정보 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
            </plugin>
        </plugins>
    </build>
</project>
  • 프로젝트의 전반적인 정보를 담고 있는 xml파일
  • <dependenceise> 태그 : 이 태그의 데이터들로 해당 프로젝트가 의존하는 여러 라이브러리를 설정
    → 라이브러리를 추가할 경우, <dependenceise> 태그 내에 추가해주면 된다.
  • POM
    • Maven의 기능을 이용하기위해 사용하는 xml문서
    • 프로젝트 마다 1개씩 가진다.
    • 필요한 라이브러리를 pom.xml에 정의 시, 라이브러리 실행/설치에 필요한 다른 라이브러리 관리 및 네트워크를 통한 다운로드를 해 준다.
  • pom.xml 의 주요 기능
    • 프로젝트 정보 : 프로젝트의 이름, 라이센스 등
    • 빌드 설정 : 소스, 리소스, 라이프사이클별 실행한 플러그인 등 빌드와 관련된 성질
    • 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
    • pom 연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

③ 장단점

장점

  1. 의존성 자동 업데이트 (라이브러리 자동 다운)

  2. 라이브러리 통합 관리

  3. 모든 프로젝트에 적용가능한 일괄적인 사용법

  4. 간단한 배포 관리

단점

  1. 설정 파일이 XML 기반으로 작성되어, 가독성 ↓

  2. 라이브러리가 서로 종속될 경우, XML이 복잡해짐

  3. 정해진 라이프 사이클이 있어서, 임의의 라이프 사이클 설정이 복잡함

(2) Gradle

① 정의

  • groovy 언어 기반

  • Java, C/C++, Python 등... 을 지원

  • Ant 와 Maven 을 보완 (maven 이후에 출시됨. 최근 Gradle 로 넘어가는 추세)

  • 모든 프로젝트가 일관된 디렉토리 구조를 가지고 빌드 프로세스를 유지하도록 도와준다.

  • 단위 테스트 시 의존성 관리
    → junit 등...을 사용하기 위해서 명시

  • 설정 주입 방식을 제공

  • Gradle 설치 없이, Gradle Wrapper를 이용하여 빌드를 지원

groovy

  • JVM 에서 실행되는 스크립트 언어
  • Java 와 문법이 비슷하고 호환이 된다.

② 사용법

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.SpringProject'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // JPA 설정
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    // MySQL
    implementation 'mysql:mysql-connector-java:8.0.33'

    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // 추가
    implementation group: 'org.javassist', name: 'javassist', version: '3.15.0-GA'
}

tasks.named('test') {
    useJUnitPlatform()
}
  • Maven 의 build.gradle 파일(pom.xml 파일과 같은)에 groovy 언어로 빌드에 필요한 설정(groovy 언어로 빌드에 필요한 설정)을 작성

    • 추가하고자하는 라이브러리들이 있다면 dependencies 하위 { } 블럭에 추가하면 된다.
  • build.gradle

    • 빌드에 대한 모든 기능을 정의
    • 환경 설정, 빌드 방법, 라이브러리 정보를 기술하여 프로젝트의 관리 환경을 구성
    • build.gradle 을 작성하면, 소스 코드를 빌드하고 라이브러리들의 의존성을 쉽게 관리할 수 있다.
  • setting.gradle

    • 프로젝트 구성을 설정할 떄 작성하는 파일
    • 프로젝트 간의 의존성 및 멀티 프로젝트를 구성할 때 사용
    • 싱글 프로젝트의 경우 생략 가능

③ 장단점

장점

  1. XML기반이 아닌 스크립트 언어(groovy 언어)를 사용

    • 유연하게 빌드 스크립트 작성 가능 + 높은 가독성 + 변수선언, if, else, for 등... 의 로직 구현 가능
    • 별도의 빌드 스크립트를 통하여, 사용할 어플리케이션 버전, 라이브러리 등... 의 항목 설정 가능
  2. 빠르다. (Maven보다 최대 100배)

  3. Wrapper를 통해, Gradle이 설치 되지 않은 환경에서도 빌드 가능

  4. 설정에 대한 구조적인 틀을 벗어나, 코딩으로 정의가 가능

단점

  1. 프로그램 자체가 메모리 차지 多

  2. 정확한 사용을 위해선 groovy 문법이 필요

    Gradle.Wrapper

    • 환경에 상관 없이, Gradle 빌드를 수행할 수 있도록 하는 내장 task
    • Java나 Gradle이 설치 되어 있지 않아도 빌드 가능
    • 사용자가 프로젝트 개발자와 동일한 버전의 Gradle버전 사용 가능
profile
개발자로 거듭나기!

0개의 댓글