Spring

Maven

va-la 2021. 6. 19. 18:56

Maven 이란?

자바용 프로젝트 빌드 및 관리에 사용되는 도구를 말한다. 프로젝트의 전체적인 빌드 라이프 사이클 및 라이브러리에 대한 의존 관계를 관리해준다. 

Maven 장점

  • 프로젝트에 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 네트워크를 통해 자동으로 다운로드하여준다. (pom: project object model)
  • 정해진 빌드 방법을 사용하여 협업에서 사용할 때 용이하며 플러그인을 통해 많은 작업을 자동화시킬 수 있다.

pom.xml 속성

  • <project> : pom.xml 파일의 최상위 루트 엘리먼트로 해당 태그 안에 모든 정보를 기술한다.
  • <modelVersion> : pom 모델의 버전
  • <groupId> : 프로젝트를 생성하는 조직의 고유 아이디를 말한다. 일반적으로 도메인 이름을 거꾸로 기술
  • <artifactId> : 프로젝트를 식별하는 유일한 아이디
  • <packaging> : 프로젝트를 어떤 형태로 패키징 할지를 결정(war, jar, ear 등)
  • <version> : 프로젝트의 현재 버전을 말한다. 개발 중에는 SNAPSHOT을 접미사로 사용한다.
  • <properties> : pom.xml 파일 내에서 공통적으로 사용될 상수 값을 정의
  • <dependencies> : 사용할 라이브러리 정보를 기술
    • 필수 선언 항목
      1. <groupId> : 부분적인 프로젝트 또는 라이브러리 집합을 식별하는 용도
      2. <artifactId> : 프로젝트 실제 이름으로 groupId와 합쳐져서 식별하는 용도
      3. <version> : artifactId의 사용할 버전
  • <build> : 프로젝트 빌드와 관련된 기본적인 소스 디렉터리 구조, 빌드 산출물 디렉토리 구조, 빌드시 사용할 플러그인 정보들을 관리
  • <outputDirectory> : 컴파일한 결과물이 위치하는 target 디렉토리 지정
  • <repositories> : 빌드할 때 접근할 저장소의 위치로 default는 메이븐 기본 저장소

Maven 라이프사이클

Maven은 프레임워크라서 동작 방식이 정해져 있는데, 일련의 단계(Phase)에 연계된 Goal을 실행하는 과정을 진행하는데 이를 라이프사이클이라고 한다. 일반적으로 Maven은 3개의 기본적인 라이프사이클을 제공한다.

  1. Clean : 이전에 수행된 빌드를 정리하는 데 사용한다. 'target' 디렉토리와 그 하위에 생성된 모든 파일이 삭제된다.
  2. Default : 일반적인 빌드 프로세스 (compile, test, package, install, deploy)
  3. Site : 프로젝트 문서와 사이트를 생성하는 데 사용된다.

 

mvn clean compile 시에는 target 디렉토리 하위의 파일들을 모두 삭제한 뒤에, compile 단계까지만 진행한다. (mvn compile clean 시에는 compile 뒤에 clean이 실행되니 주의 필요!)

  1. Compile (mvn compile) : 소스코드를 컴파일하는 단계. 성공적으로 컴파일 시 target/classes 폴더 생성 및 class 파일이 생성
  2. Test (mvn test) : 테스트 코드를 실행하는 단계. 성공적으로 컴파일시 target/test-classes 폴더와 class 파일 생성
  3. package (mvn packge) : 해당 프로젝트를 지정한 확장자로 묶어주는 단계. "artifactId-version.packaging" 형태의 파일을 target 폴더 안에 생성
  4. install (mvn install) : 로컬 레포지토리에 배포
  5. deploy (mvn deploy) : 원격 레포지토리가 등록되어 있다면, 거기에 배포

각 라이프사이클 안에는 빌드 단계(Phase)가 정의되어 있다. 각 단계는 연결된 Plugin을 통해서 명령들을 실행시킨다. 이 명령을 Goal이라고 한다. (즉, 플러그인은 하나 이상의 Goal을 정의할 수 있다. 예를들어, maven-compiler-plguin의 'compile' goal은 Java 소스 코드를 컴파일하는 작업을 수행한다.)

Phases와 Goal

Phase 단계에 수행할 명령을 추가하거나 삭제하고 싶을 때는 Goal을 통해 특정 작업을 수행하도록 설계할 수 있다. 일반적으로는 각 단계마다 플러그인이 설치되어 있어(maven-compiler-plugin, maven-surfire-plugin 등) 원하는 설정이 따로 없다면 명시적으로 추가를 안해줘도 된다. 디폴트 jar 패키지는 아래와같다.

<phases>
  <process-resources>
    org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources
  </process-resources>
  <compile>
    org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile
  </compile>
  <process-test-resources>
    org.apache.maven.plugins:maven-resources-plugin:3.3.1:testResources
  </process-test-resources>
  <test-compile>
    org.apache.maven.plugins:maven-compiler-plugin:3.11.0:testCompile
  </test-compile>
  <test>
    org.apache.maven.plugins:maven-surefire-plugin:3.1.2:test
  </test>
  <package>
    org.apache.maven.plugins:maven-jar-plugin:3.3.0:jar
  </package>
  <install>
    org.apache.maven.plugins:maven-install-plugin:3.1.1:install
  </install>
  <deploy>
    org.apache.maven.plugins:maven-deploy-plugin:3.1.1:deploy
  </deploy>
</phases>

특정 Phase에서 플러그인을 추가하는 예제는 아래와 같다.

<build>
    <plugins>
        <!-- 기본 컴파일 플러그인 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <!-- 컴파일 설정 -->
            </configuration>
        </plugin>
        <!-- 추가로 실행할 플러그인 예: 코드 생성 플러그인 -->
        <plugin>
            <groupId>com.mycompany.plugins</groupId>
            <artifactId>code-generator-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>compile</phase> <!-- compile 단계와 연결 -->
                    <goals>
                        <goal>generate-code</goal> <!-- 실행할 goal -->
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

위 예시에서는 maven-compiler-plugin이 먼저 실행되고, 이후에 code-generator-plugin이 실행된다.


Gradle

그래들은 메이븐과 마찬가지로 프로젝트 빌드 및 관리에 사용되는 도구로 컴파일, 빌드, 테스트, 의존성 관리 등의 작업을 자동화하는 데 사용한다. Groovy 기반의 DSL을 사용하여 빌드 스크립트를 작성하며, 다양한 기능(멀티 프로젝트 빌드, 풍부한 플러그인, 통합 능력) 등을 제공한다.

Maven에서는 빌드 단계를 라이프사이클 형태로 진행을 한다면, Gradle에서는  빌드 단계를 Task라는 작업 단위로 구성한다. 각 Task는 플러그인을 통해 제공받을 수 있으며 스프링부트는 BootRun, BootJar 등의 Task들을 제공하고 있다.

plugins {
    id 'java' // 자바 플러그인 적용
}

group 'com.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral() // 메이븐 중앙 레포지토리 사용
}

dependencies {
    implementation 'com.google.guava:guava:30.1-jre' // Guava 라이브러리 의존성 추가
    testImplementation 'junit:junit:4.12' // JUnit 라이브러리 의존성 추가
}

task customTask { // 사용자 정의 태스크
    doLast {
        println 'Custom task is running!'
    }
}

compileJava {
    options.encoding = 'UTF-8' // 컴파일 옵션 설정
}

test {
    useJUnit() // JUnit을 사용한 테스트 설정
}

jar {
    manifest {
        attributes 'Main-Class': 'com.example.Main' // 메인 클래스 지정
    }
}

참조

1. https://velog.io/@changyeonyoo/Maven-%EC% 9D% B4% EB% 9E%80

 

Maven 이란?

Maven이란 자바용 프로젝트 관리 도구이다.프로젝트를 위해 작성한 Java코드나 여러 자원들(.xml, .jar, .properties)를 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이다.또

velog.io

2. https://mangkyu.tistory.com/8

 

[Maven] Maven이란 무엇인가?

Spring 프레임워크 기반의 프로젝트를 진행하려고 보니 Spring의 내용들을 Maven 프로젝트에 추가를 해주어야 했습니다. 당연히(?) 망나니 개발자께서는 메이븐을 처음들어 보았기에 메이븐에 대해

mangkyu.tistory.com

3. https://www.slideshare.net/ssuser5445b7/ss-56566336?qid=927855f5-7c8a-4f88-a834-d31292324fd2&v=&b=&from_search=4 

 

메이븐파헤치기(김우용)

0 메이븐 파헤치기 김우용

www.slideshare.net

4. https://myborn.tistory.com/6

 

maven pom 속성정리(Environment Settings) - 5/5

maven pom 속성정리 - Environment Settings 속성 예제 및 설명     JIRA     http://jira.company.com/     continuum     http://127.0.0.1:8080/continuum                     ..

myborn.tistory.com

5. https://oingdaddy.tistory.com/56

 

Maven 명령어 및 옵션 모음

maven에서 사용할 수 있는 명령어들에 정리해본다. command desc compile 컴파일 수행 test 컴파일 수행 후 테스트 클래스 수행 package 컴파일을 수행하고 컴파일한 소스를 packaging 양식(war or jar)에 맞춰 프

oingdaddy.tistory.com

6. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=goddlaek&logNo=221242091247 

 

[Maven] 라이프 사이클,Phase,Goal 에 대해

Lifecycle, phase , goal 이해하기 메이븐에 미리 정의되있는 빌드순서를 라이프사이클이라고 한다. 라이...

blog.naver.com

7. https://myjamong.tistory.com/153

 

[Spring] Maven 라이프사이클 알아보기 :: 마이자몽

Maven 라이프사이클  이클립스를 사용해서 Spring MVC Project를 만들고 사용해보셨다면... Maven을 들어봤지만 정확히 무엇을 해주는 것인지? 그리고 어떻게 어떤 원리로 작동하는 것인지 잘 모르고 사

myjamong.tistory.com

'Spring' 카테고리의 다른 글

@Transactonal  (1) 2023.05.11