Spring Boot 3 & Spring Framework 6 - Section 21 : Maven , Gradle

이정수·2025년 3월 25일

Spring Project 자원관리도구

  • Build Tool(빌드도구) :
    소스코드빌드 과정을 자동으로 처리해주는 프로그램
    ▶ 개발자의 Source code를 실행 가능한 Application으로 구축해주는 역할을 수행.
    ▶ 각 개발언어에 맞는 Project를 build 및 Dependency를 관리.

    。필요한 외부 라이브러리를 자동 추가 및 관리.
    • Maven : XML Script 기반으로 pom.xml을 이용해 자동으로 library 와 dependency를 관리.
      Maven clean , install
      view - Tool Windows - Maven - 프로젝트명 - Lifecycle - clean 우클릭 - Run Maven Build

    • Gradle :
      Maven 이후 출시한 Java , Kotlin , AndroidProject Build Tool로서 build.gradle에 script를 작성하여 dependency를 관리.
      groovy 언어를 사용하여 설정을 수행하며 유연하게 빌드 스크립트 ( build.gradle )를 작성

Build Tool을 사용하는 이유?
。개발자가 어플리케이션 개발을 위해 새 프로젝트를 생성 시 매번 공통적으로 사용하는 다양한 Spring MVC, Spring Web, Hibernate등의 Dependency를 추가, 삭제등의 관리 및 Versioning을 수행하여 쉽게 최신버전의 Dependency를 Project에 적용할 수 있도록 설정.

。어플리케이션을 Server로 Production을 수행하기위해 Project를 .JAR, .WAR, Docker Image의 파일로 Build하는 역할을 수행.
Tomcat, JettyWeb Server에서 Application을 Local환경에서 실행.

Unit Test 실행

Apache Maven Project :
POM(Project Object Model) 개념을 기반으로 pom.xml를 통한 Java Project의 Build 자동화 및 Project 관리를 수행하는 Build Tool
ProjectCompile , Test , Production , Documentation 자동화 및 Dependency 관리에 강력한 기능을 제공
▶ 전통적인 Java Project에서 많이 활용되며, 현재는 Gradle을 사용하여 Android 또는 최신 Java Project를 Build.

  • Project Object Model(POM) : pom.xml
    Maven Project의 핵심구성파일로서, ProjectDependency , Build , Plugins 설정을 정의하여 프로젝트를 구성하고 관리하는 XML파일.
    ▶ Project의 build, 실행, Test, Packaging을 통합관리.

  • pom.xml의 Dependency 원리
    。 선행적으로 spring-boot-starter-web를 예로 들때, org.springframework.boot팀이 spring-boot-starter-web의 이름의 Project를 JAR파일로서 생성하여 Maven Central Repository에 게시.
    ▶ 해당 Project는 여러 Version을 가진다.
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • pom.xmlgroupIdartifactId, version을 정의함으로써 자동으로 Maven Central Repository에서 게시되어 보관하는 특정 VersionProject의 JAR파일을 현재 Project의 Local Repository에 자동으로 참조 및 다운로드하여 설치하여 Local Repository에 저장된 JAR파일을 현재 Project에서 활용.

    。임의로 Spring Project를 생성 및 .JAR로 배포하여 Maven Central Repository에 게시하는 경우, 다른 Project에서 단순히 groupIdartifactId, version를 기입하는것만으로 게시된 Project를 Dependency로서 추가가능.

    pom.xml의 주요특징

    • Project의 Metadata를 정의
      。Project의 Metadata ( 이름, version , groupId 등 )

    • Dependency 관리의 자동화
      。Project에서 필요한 Framework 또는 Librarypom.xml에 정의 시 Maven이 해당 Library를 자동으로 다운로드 및 관리를 수행.
      pom.xml에서 정의된 dependency를 삭제하는 경우, 해당 Project 파일내에 존재하는 External Libraries의 저장된 dependency가 자동으로 삭제됨.

      。특정 Dependency를 설치한 경우 해당 Dependency과 의존관계에 존재하는 Transitive Dependency도 추가로 설치.

      。 단순히 groupIdartifactId, version을 정의하여 Maven Central Repository에서 Project에 Dependency을 참조 및 다운로드하여 설치가 가능.

      Maven DependencySpring Dependency와 다르다.
      Maven DependencyProject Build에 관련된 의존성 , Spring DependencyJavaClass에 관련된 의존성을 정의
      • 전이적 의존성 ( Transitive Dependency )
        。직접적인 의존관계가 아니더라도 Library 또는 Package가 다른 Library를 통해 간접적으로 의존관계에 포함되는 경우를 의미.
        Spring WebMaven의 Dependency로서 정의한 경우, Spring, Spring MVC, Jackson, Tomcat등이 Transitive Dependency로서 자동으로 다운로드되어 설치.


    • Maven Life Cycle 관리
      mvn clean , mvn compile , mvn test , mvn package등의 명령어를 제공하여 Build Process를 간소화.
      Project의 실행, Test , Packaging 전 과정을 체계적 관리.

    • Project의 상속 ( Inheritance ) , 다중모듈( Multi-Module ), Plug-in 확장
      。다양한 plug-in을 추가하여 기능을 확장
      maven-surefire-plugin : 테스트 자동화
      maven-compiler-plugin : Compiler 설정.


  • Maven Project Structure

    。대부분의 Java Project는 해당 Maven Structure를 따른다.
    Project간 일관성을 유지하여 다른 Project의 구성도 쉽고 익숙하게 확인가능.



  • Maven Central Repository Maven Central Repository
    Maven에서 공식적으로 제공하는 기본 원격저장소
    Project에서 Dependency를 정의할 경우, 해당 라이브러리를 Maven Central Repository에서 해당하는 ProjectJAR파일을 찾아서 자동으로 다운로드하는 기본저장소.


    Maven Central Repository에서 spring-boot-starter-jdbc dependency를 찾을 경우, 다음처럼 Project로서 여러 VersionProjectJAR파일들이 존재함을 확인 가능.
    groupId : org.springframework.boot에서 spring-boot-starter-jdbc Project를 찾아야한다.

    Maven Repository 종류

    • 로컬저장소 : Local Repository
      ~/m2/repository에 위치한 개인저장소
      。현재 ProjectMaven을 통해 Dependency를 추가 시, Maven Central Repository에서 자동으로 다운로드한 해당 Dependency의 JAR파일을 저장.

      mvn install 명령어 실행 시 해당 저장소에 Project의 Package파일 ( JAR, WAR 등 )이 저장됨.

    • 중앙저장소 : Central Repository
      Maven이 기본적으로 사용하는 공식 원격저장소
      Dependency로 사용될 Project들을 JAR파일로 보관.
      ▶ Project에 dependency 추가 시 해당 저장소로부터 저장된 ProjectJAR파일을 Dependency로서 자동으로 다운로드 및 설치

      Release VersionJARMaven Central Repository에 존재하며, Milestone Version, Release Candidate VersionJARSpring Milestone Repository에 존재.

    • 원격저장소 : Remote Repository
      。기업 또는 개인이 운영하는 별도의 원격저장소
      (ex. Nexus 등)
      mvn deploy 명령어 실행 시 해당 저장소에 Project의 Package파일 ( JAR, WAR 등 )이 저장됨.


  • Maven 기본 명령어
    Build Process를 간소화하여 Project실행, Test , Packaging의 전 과정을 체계적 관리
    Life Cycle을 효율적으로 관리한다.

    Intellij에서는 우측 Control Pane에서 Maven-Execute Maven Goal에 다음 명령어를 입력하여 수행 가능.
    • mvn archetype:generate -DgroupId=com.example -DartifactId=myproject -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
      。프로젝트 생성

      groupId : 프로젝트의 그룹 ( 도메인기반 )
      JavaPackage와 유사

      artifactId : 프로젝트 이름
      JavaClass 이름과 유사

      archetypeArtifactId : 초기 Project Template 선택.

    • mvn clean
      ProjectBuild하여 생성된 target 폴더와 해당 내부의 Project의 모든 Build의 결과를 삭제.

      mvn clean compile
      mvn clean 수행 후 mvn compile 실행하여 Project를 Compile

    • mvn compile
      Java ProjectInstall할 필요없이, Java SourceCode만 Compile시 사용.

    • mvn test-compile
      Java Source Code, Java Test Code 모두 Compile.


    • mvn test
      。Project의 JUnit , Mockito 등의 Unit Test를 실행
      Source CodeTest Code를 모두 Compile 한 후 Test를 수행.

    • mvn package
      。프로젝트를 Packaging하여 .jar or .war 파일로서 생성

    • mvn install
      ProjectJAR파일로 생성하여 로컬Maven저장소(~/.m2/repository/)에 설치
      mvn clean install
      mvn clean 수행 후 mvn install 실행하여 Project를 로컬Maven저장소로 저장.

      mvn install 순서( LifeCycle )

      • Java Source Code( src/main/java ) Compile
      • Java Test Code( src/test/java ) Compile
      • Unit Test 실행
      • JAR파일 생성
        Spring Boot 사용 시 spring-boot-maven-plugin을 활용해 JAR파일을 Repackaging.
      • 생성된 JAR파일을 Maven 로컬저장소로 복사


    • mvn exec:java -Dexec.mainClass="com.example.Main"
      。프로젝트 실행

    • mvn dependency:tree :
      Project의 모든 DependencyTree구조로 출력하는 명령어.
      ▶ 직접 추가한 Dependency와 그에따른 Transitive Dependency도 한눈에 파악이 가능.


    • mvn help:effective-pom :
      。현재 Project의 Effective POM을 출력.

    • mvn --version :
      。현재 사용되는 Maven의 버전, home폴더 경로, Java Version , OS 정보를 지시.


    • mvn spring-boot:build-image :
      Spring Boot Maven Plugin을 활용하여 Containerimage를 build.

Project Object Model(POM) : pom.xml
Maven Project의 핵심구성파일로서, ProjectDependency , Build , Plugins 설정을 정의하여 프로젝트를 구성하고 관리하는 XML파일.
▶ Project의 build, 실행, Test, Packaging을 통합관리.

  • Maven Parent POM
    。여러 Maven Proejct에서 공통으로 사용하는 의존성을 상속 및 Versioning을 수행할 수 있도록 정의된 부모 Project의 pom.xml파일.
    AOPAspect와 비슷한 역할을 수행하여 코드중복을 감소시킬 수 있다.

    。추가적으로 다양한 Java VersionPlugin을 제공.
    • spring-boot-starter-parent:
      。Spring boot Project에서 Parent POM 역할을 수행하는 POM.
      ▶ 해당 Parent POM을 정의하여 사용하는 경우, Maven Dependency , Plugin 등을 자동으로 관리 할 수 있음.
    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.4.4</version>
            <relativePath/> <!-- lookup parent from repository -->
    </parent>
    • spring-boot-dependencies
      spring-boot-starter-parent의 상위 POM으로서 , 의존성관리기능을 수행.
      spring-boot-starter-parent을 통해 해당 기능을 가져와서 ProjectDependency를 관리.


  • Effective POM :
    Maven이 최종적으로 적용하는 pom.xml 파일의 내용을 보여주는 개념.
    pom.xml에 정의된 parent POM , plugin 등을 포함하여 실제 적용되는 POM을 확인가능.

    mvn help:effective-pom 명령어를 실행하여 현재 Project의 Effective POM을 출력.
    pom.xml에 정의되지않은 정보도 포함됨.
  • Maven Build Life Cycle
    Maven은 일련의 단계 ( Phases )로 구성된 Build Lifecycle을 정의하여 ProjectCompile, Test , Packaging , Production 할 수 있도록 한다.

    Maven 명령어가 실행될 경우, Maven Build Life Cycle이 자동 실행.
    mvn clean , mvn compile , mvn test , mvn package등의 명령어를 제공하여 Build Process를 간소화하여 Project실행, Test , Packaging 전 과정을 체계적 관리.

    Maven의 주요 Build Life Cycle

    • Default LifeCycle :
      Maven의 가장 핵심의 Lifecycle
      Project의 Compile-Test-Packaging-Production하는 전체 과정.
      ▶ 해당 Lifecycle은 총 23개의 Phase로 구성되지만 핵심Phase는 다음과 같음.

      Default Lifecycle핵심Phase

      • validate
        Project가 문제없이 올바르게 구성되었는지 검증

      • compile
        。Java 소스코드를 Compile.

      • Integration Test
        Unit Test를 실행.
        src/test/java 활용

      • package
        JAR , WAR 파일로 Packaging.

      • verify
        。Packaging된 파일이 유효한지 확인

      • install
        。Project를 JAR파일로서 Local Repository(~/.m2/repository)에 설치

      • deploy
        。Project를 JAR파일로서 Remote Repository( Nexus 등 )에 배포


    • clean lifecycle :
      Build 전 기존 생성된 파일 제거.

    • site lifecycle :
      Project의 문서( site ) 생성

JAR( .jar : Java ARchive) :
。여러 개의 Java Class 파일, 메타 데이터, Resource 파일 등을 하나의 파일로 묶은 Archive 파일.
。필요한 기본적인 dependency들을 전부 구성하여 간편하게 사용가능하게하는 Starter Project 역할 수행.

  • Spring JAR파일 Version Schema

    MajorVersion번호.MinorVersion번호.PatchVersion번호.MODIFIER
    Modifier은 Option으로 기입.
    ▶ 보통 RELEASE Version의 경우 기입하지 않는다.

    SNAPSHOT Version의 사용은 반드시 지양해야하며, Production 환경에서는 RELEASE Version만을 사용해야한다.

    Major Version Update : Version Upgrade 시 작업량이 많을 경우.
    ex ) 10.0.0 -> 11.0.0

    Minor Version Update : Version Upgrade 시 작업량이 미미하게 적을 경우.
    ex ) 10.1.0 -> 10.2.0

    Patch Version Update : Version Upgrade 시 작업량이 거의 없을 경우
    ex ) 10.5.4 -> 10.5.5

    Modifier :
    Release Version( 1.0.0.RELEASE or 1.0.0)
    Release Candidate Version( 1.0.0-RC1 )
    Milestone Version(1.0.0-M1)
    Snapshot Version(1.0.0-SNAPSHOT) 등의 여부를 지시.
    Release VersionJARMaven Central Repository에 존재하며, Milestone Version, Release Candidate VersionJARSpring Milestone Repository에 존재.
profile
공부기록 블로그

0개의 댓글