Be ready to study forever - 개발자 꿈나무

Maven 본문

Programming/Spring

Maven

루눌룹 2020. 7. 20. 01:02

Maven

1. Maven이란?

Maven은 빌드 자동화 툴로서 pom.xml파일에 사용할 라이브러리를 정의해 놓으면 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 의존하는 다른 라이브러리까지 관리하여 자동으로 다운받아준다.

2. Maven동작원리

Maven에는 미리 정의된 빌드 순서가 있고 이를 라이프 사이클이라고 부른다. 라이프 사이클의 각 단계는 phase라고 하며 각 phase들은 의존관계이다. , phase가 진행되려면 이전의 phase가 모두 수행된 상태여야 한다. Maven에서 제공되는 모든 기능은 플러그인 기반으로 동작한다. phase도 플러그인과 연결되어있다. 플러그인 안에서 실행할 수 있는 각각의 작업을 골이라고 하며 한 개의 phase는 한 개의 골과 연결된다.

2.1 Maven 라이프 사이클

라이프사이클

설명

Default(build)

일반적인 빌드 프로세스를 위한 모델이다

Clean

빌드 시 생성되었던 파일들을 삭제하는 단계

Validate

프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계

Compile

프로젝트의 소스코드를 컴파일 하는 단계

Test

유닛 테스트를 수행 하는 단계

Package

실제 컴파일 된 소스 코드와 리소스들을 jar, war등의 파일로 배포를 위해 패키지로 만드는 단계

Verify

통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족한는지 확인하는 단계

Install

패키지를 로컬 저장소에 설치하는 단계

Site

프로젝트 문서와 사이트 작성, 생성하는 단계

Deploy

만들어진 package를 원격 저장소에 release한느 단계

최종 빌드 순서는 compile -> test -> package이다.

compile : src/main/java 디렉토리 아래의 모든 소스 코드가 컴파일 된다.

test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스 코드 컴파일 된다.

 ※ junit : 단위 테스트 프레임워크. 테스트 단계를 거치기 위해 의존 설정을 해준다.

packaging : 컴파일과 테스트가 완료 된 후, jar, war 같은 형태로 압축하는 작업.

2.2. phase

Build lifecycle의 각 단계를 phase라고 하며 이전단계의 phase가 모두 수행되어야 다음 phase가 수행될 수 있다. , 모든 빌드 단계가 성공적으로 실행되었을 때 실행된다는 것이 Dependency이다.

2.3. Goal

하나의 플러그인에서는 여러 작업을 수행할 수 있도록 지원하며, 플러그인에서 실행할 수 있는 각각의 기능을 goal이라고 한다.(각각의 phase에 연계된 goal을 실행하는 과정을 build라고 한다.)

Phase의 진행 위의 사진을 참조할 것

mvn process-resources : resources:resources의 실행으로 resource 디렉토리에 있는 내용을 target/classes로 복사한다.

mvn compile : compiler:compile의 실행으로 src/java 밑의 모든 자바 소스를 컴파일해서 target/classes로 복사

mvn process-testResources, mvn test-compile : 이것은 위의 두 개가 src/java였다면 test/java의 내용을 target/test-classes로 복사. (참고로 test mvn test 명령을 내리면 라이프사이클상 원본 소스로 컴파일된다.)

mvn test : surefire:test의 실행으로 target/test-classes에 있는 테스트케이스의 단위테스트를 진행한다. 결과를 target/surefire-reports에 생성한다.

mvn package : target디렉토리 하위에 jar, war, ear등 패키지파일을 생성하고 이름은 <build> <finalName>의 값을 사용한다 지정되지 않았을 때는 아까 설명한 "artifactId-version.extention" 이름으로 생성

mvn install : 로컬 저장소로 배포

mvn deploy : 원격 저장소로 배포

mvn clean : 빌드 과정에서 생긴 target 디렉토리 내용 삭제

mvn site : target/site에 문서 사이트 생성

mvn site-deploy : 문서 사이트를 서버로 배포

위와 같은 진행 순서로 라이프 사이클이 진행된다.

3. Maven 설정파일

3.1. settings.xml

           - maven 빌드 툴을 설정하는 설정파일

           - MAVEN_HOME/conf 디렉토리의 위치 설정

** 메이븐을 빌드할 때 의존 관계에 있는 라이브러리, 플러그인을 중앙 저장소에서 개발자 PC로 다운로드 하는위치(로컬저장소)의 기본 설정 'USER_HOME/.m2/repository' 인데 settings.xml의 에 원하는 로컬 저장소의 경로를 지정, 변경할 수 있다.

3.2. pom.xml

           - 프로젝트의 root에 존재한다.

           - 프로젝트의 모든 설정, 라이브러리 의존성을 정의한다.

           - 프로젝트마다 1개의 pom.xml을 갖는다.

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--POM model의 버전-->
    <parent>
        <!--프로젝트의 계층 정보-->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.god</groupId>
    <!--프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.-->
    <artifactId>bo</artifactId>
    <!--프로젝트 빌드시 파일 대표이름 이다. groupId 내에서 유일해야 한다.Maven을 이용하여 빌드시 다음과 같은 규칙으로 파일이 생성 된다. artifactid-version.packaging. 위 예의 경우 빌드할 경우 bo-0.0.1-SNAPSHOT.war 파일이 생성된다.-->
    <version>0.0.1-SNAPSHOT</version>
    <!--프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용-->
    <packaging>war</packaging>
    <!--패키징 유형(jar, war, ear 등)-->
    <name>bo</name>
    <!--프로젝트, 프로젝트 이름-->
    <description>Demo project for Spring Boot</description>
    <!--프로젝트에 대한 간략한 설명-->
    <url>http://goddaehee.tistory.com</url>
    <!--프로젝트에 대한 참고 Reference 사이트-->
    <properties>
        <!-- 버전관리시 용이 하다. ex) 하당 자바 버전을 선언 하고 dependencies에서 다음과 같이 활용 가능 하다. <version>${java.version}</version> -->
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--dependencies태그 안에는 프로젝트와 의존 관계에 있는 라이브러리들을 관리 한다.-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <!--빌드에 사용할 플러그인 목록-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

엘리먼트

<modelVersion> : POM model의 버전

<parent> : 프로젝트의 계층 정보

<groupId> : 프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.

<artifactId> : 프로젝트 빌드시 파일 대표이름 이다. groupId 내에서 유일해야 한다. Maven을 이용하여 빌드시 다음과 같은 규칙으로 파일이 생성 된다.

     artifactid-version.packaging. 위 예의 경우 빌드할 경우 bo-0.0.1-SNAPSHOT.war 파일이 생성된다.  (하단 예시 파일 참고)

<version> : 프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용.

<packaging> : 패키징 유형(jar, war, ear )

<name> : 프로젝트, 프로젝트 이름

<description> : 프로젝트에 대한 간략한 설명

<url> : 프로젝트에 대한 참고 Reference 사이트

<properties> : 버전관리시 용이 하다. ex) 하당 자바 버전을 선언 하고 dependencies에서 다음과 같이 활용 가능 하다.<version>${java.version}</version>

<dependencies> : dependencies태그 안에는 프로젝트와 의존 관계에 있는 라이브러리들을 관리 한다.

 <build> : 빌드에 사용할 플러그인 목록

 references:
https://www.slideshare.net/ssuser5445b7/ss-56566336?qid=927855f5-7c8a-4f88-a834-d31292324fd2&v=&b=&from_search=4%20%EC%B6%9C%EC%B2%98:%20https://jeong-pro.tistory.com/168%20[%EA%B8%B0%EB%B3%B8%EA%B8%B0%EB%A5%BC%20%EC%8C%93%EB%8A%94%20%EC%A0%95%EC%95%84%EB%A7%88%EC%B6%94%EC%96%B4%20%EC%BD%94%EB%94%A9%EB%B8%94%EB%A1%9C%EA%B7%B8]
https://goddaehee.tistory.com/199
https://jeong-pro.tistory.com/168#:~:text=Maven%EC%9D%80%20%EC%9E%90%EB%B0%94%20%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9D%98,%EC%9D%BC%EC%9D%84%20%EC%9E%90%EB%8F%99%ED%99%94%20%ED%95%B4%EC%A3%BC%EB%8A%94%20%EA%B2%83%EC%9D%B4%EB%8B%A4.
https://jerryjerryjerry.tistory.com/63
 

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

0 메이븐 파헤치기 김우용

www.slideshare.net

 

[Spring] 메이븐(Maven)이란?

* Maven - Spring 프레임 워크 기반의 프로젝트를 진행하려 spring에 대해서 알아보던 중 maven을 프로젝트에 추가해야 할 필요성을 느꼈다. 그럼 메이븐이란 무엇인가? - 프로젝트를 진행하게 되면 단�

jerryjerryjerry.tistory.com

 

메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? (pom.xml 분석하며 가볍게 정리하는 빌드 툴, Maven)

메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? 제목과 같은 질문에 필자는 제대로 답변할 수 없었다. 단순하게는 maven repository에서 dependency 추가해서 필요한 라이브러리 쓰는 정도? 무엇을 위해 ��

jeong-pro.tistory.com

 

[Maven] Maven 이란? (정의, 예제)

[Maven] 메이븐 이란? (정의, 예제) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 메이븐 알아보기 ] 입니다. : ) 1. 빌드 (Build) #1 빌드란?  - 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립�

goddaehee.tistory.com

 

'Programming > Spring' 카테고리의 다른 글

[Spring Security] JWT적용  (0) 2020.08.23
Comments