본문 바로가기
프로그래밍/웹개발(WEB)

메이븐(Maven) 알아보기

by imfireguy 2020. 12. 21.
반응형




목차

 - 메이븐(Maven)이란 무엇인가?

 - 메이븐(Maven)이 참조하는 설정파일은 어떤게 있을까요?

 - pom.xml 분석

최근일을 하면서 프로젝트를 셋팅하는일이 많아졌습니다.

하지만, 여러가지의 프로젝트를 셋팅하면서 다른환경에 안되면 애를먹는일이 많았습니다.

그중에서도 메이븐(Maven)을 사용해오면서 너무 몰랐다는 생각이 들었습니다.

정말 "그냥 라이브러리를 관리해준다"라는 기초적인 개념밖에 알지 못했던거 같습니다.

지금도 잘 모르지만 이해를 하기위해서 작성해 봅니다.


메이븐(Maven)이란 무엇인가?

Maven은 자바 프로젝트의 빌드(build)를 자동화 해주는 빌드 툴(build tool) 입니다.

즉, 자바 소스를 compile하고 package해서 deploy하는 일을 자동화 해주는 것입니다.


그럼 빌드란 무엇일까요?

개발자가 프로그램을 만드는거까지를 '개발'이라고 합니다.

그리고 이게 개인들 컴퓨터에 설치되어서 실행되기 까지의 단계를 모두 빌드라고 할 수 있습니다.


메이븐(Maven)이 참조하는 설정파일은 어떤게 있을까요?


1) settings.xml


settings.xml은 maven tool 자체에 관련된 설정을 담당한다.


MAVEN_HOME/conf/ 아래에 있다. ( * MAVEN_HOME은 환경변수에 설정한 경로)


Maven 자체에 설정 값을 바꾸는 일은 일단 잘 없으므로 넘어가고 기획한대로 pom.xml을 살펴본다.


2) pom.xml


하나의 자바 프로젝트에 빌드 툴로 maven을 설정했다면, 프로젝트 최상위 디렉토리에 "pom.xml"이라는 파일이 생성되었을 것이다.


pom.xml은 POM(Project Object Model)을 설정하는 부분으로 프로젝트 내 빌드 옵션을 설정하는 부분이다.


꼭 pom.xml이라는 이름을 가진 파일이 아니라 다른 파일로 지정할 수도 있다. (mvn -f ooo.xml test)


그러나 maven의 원칙(습관에 의한 편의성?)으로 다른 개발자들이 헷갈릴 수 있으므로 그냥 pom.xml으로 쓰기를 권장합니다.


그리고 현업에서 일할때도 주로 pom.xml을 사용 합니다.



pom.xml 분석


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
 
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
cs


Spring boot에서 프로젝트를 생성했을 때 나오는 pom.xml의 내용입니다.


pom.xml은 <project>...</project>로 둘러싸여서 section별로 여러 정보를 나타내며 설정할 수 있습니다.


1) 프로젝트 정보


제일 위에 태그부터 살펴보도록 한다.


<modelVersion> : 4.0.0이라고 써있는데 이것은 maven의 pom.xml의 모델 버전입니다. 형식이 4.0.0 버전이라고 이해하면 됩니다.


<groupId> : 프로젝트를 생성한 조직 또는 그룹명으로 보통, URL의 역순으로 지정합니다.


<artifactId> : 프로젝트에서 생성되는 기본 아티팩트의 고유 이름 입니다.


메이븐에 의해 생성되는 일반적인 artifact는 <artifact>-<version>.<extention>이다. (ex demo-0.0.1-SNAPSHOT.jar)


<version> : 애플리케이션의 버전. 접미사로 SNAPSHOT이 붙으면 아직 개발단계라는 의미이며, 메이븐에서 라이브러리를 관리하는 방식이 다르다고 합니다.


<packaging> : jar, war, ear, pom등 패키지 유형을 나타낸다.


<name> : 프로젝트 명


<description> : 프로젝트 설명


<url> : 프로젝트를 찾을 수 있는 URL


위와 같은 태그들은 프로젝트 정보에 관련된 내용 입니다.


* <properties> : pom.xml에서 중복해서 사용되는 설정(상수) 값들을 지정해놓는 부분. 다른 위치에서 ${...}로 표기해서 사용할 수 있다. (java.version에 1.8을 적용하고 다른 위치에서 ${java.version}이라고 쓰면 "1.8"이라고 쓴 것과 같습니다.


* <profiles> : dev, prod 이런식으로 개발할 때, 릴리즈할 때를 나눠야할 필요가 있는 설정 값은 profiles로 설정할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<profiles>
  <profile>
   <id>dev</id>
   <properties>
    <java.version>1.8</java.version>
   </properties>
  </profile>
  <profile>
   <id>prod</id>
   <properties>
    <java.version>1.8</java.version>
   </properties>
  </profile>
</profiles>
cs



maven goal 부분에 -P 옵션으로 프로파일을 선택할 수 있습니다.


mvn compile -P prod 라고 하면 ${java.version}은 1.8가 되고, prod를 컴파일 할 수 있습니다. 보통 현업에선 real, prod를 운영서버로 부릅니다.


참고로 local은 로컬, dev와 test를 테스트 서버명칭으로 쓰고는 합니다.


2. 의존성 라이브러리 정보


의존성 라이브러리 정보를 적을 수 있습니다.


최소한 groupId, artifactId, version 정보가 필요합니다.


스프링부트의 spring-boot-starter-*같은 경우에는 부모 pom.xml에서 이미 버전정보가 있어서 version은 따로 지정할 필요가 없습니다. 

특히 스프링부트는 해당 스프링버전에 잘 맞는 버전으로 이미 설정되어 있습니다.


그리고 A라는 라이브러리를 사용하는데 B,C,D가 의존성을 가진다면 A를 dependency에 추가하면 자동으로 필요한 B,C,D도 가져오는 기능이 있습니다.


dependency에 <scope>의 경우 compile, runtime, provided, test등이 올 수 있는데 해당 라이브러리가 언제 필요한지, 언제 제외되는지를 나타내는 것으로 따로 검색해보면 알 수 있습니다.


3. build 정보


build tool : maven의 핵심인 빌드와 관련된 정보를 설정할 수 있는 곳이다.


<build> 부분에서 설정할 수 있는 값들에 대해 설명하기 전에 "라이프 사이클(life-cycle"에 대해서 알 필요가 있다.


객체의 생명주기처럼 maven에는 라이프 사이클이 존재합니다.


크게 default, clean, site 라이프 사이클로 나누고 세부적으로 페이즈(phase) 있습니다.

아래 그림 참조



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


메이븐의 모든 기능은 플러그인(plugin)을 기반으로 동작 합니다.


플러그인에서 실행할 수 있는 각각의 작업을 골(goal)이라하고 하나의 페이즈는 하나의 골과 연결되며, 하나의 플러그인에는 여러 개의 골이 있을 수 있습니다.


* 라이프 사이클


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 : 문서 사이트를 서버로 배포


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


이제 <build>에서 설정할 수 있는 값을 확인할 수 있습니다.


<finalName> : 빌드 결과물(ex .jar) 이름 설정


<resources> : 리소스(각종 설정 파일)의 위치를 지정할 수 있다.


- <resource> : 없으면 기본으로 "src/main/resources"


<testResources> : 테스트 리소스의 위치를 지정할 수 있습니다.


- <testResource> : 없으면 기본으로 "src/test/resources"


<Repositories> : 빌드할 때 접근할 저장소의 위치를 지정할 수 있습니다. 

기본적으로 메이븐 중앙 저장소인 http://repo1.maven.org/maven2로 지정되어 있습니다.


<outputDirectory> : 컴파일한 결과물 위치 값 지정, 기본 "target/classes"


<testOutputDirectory> : 테스트 소스를 컴파일한 결과물 위치 값 지정, 

기본 "target/test-classes"


<plugin> : 어떠한 액션 하나를 담당하는 것으로 가장 중요하지만 들어가는 옵션은 제 각각이다. 다행인 것은 플러그인 형식에 대한 것은 안내가 나와있으니 그것을 참고해서 작성하면 됩니다.


plugin이 작성되어 있다고 무조건 실행되는 것은 아니다. 명확한 것은 아니지만 따로 실행할 플러그인을 메이븐 명령어로 실행해야 하는 것으로 알고 있습니다.


- <executions> : 플러그인 goal과 관련된 실행에 대한 설정


- <configuration> : 플러그인에서 필요한 설정 값 지정


apache CXF를 이용한 code generate 플러그인은 아래에서 소개되고 사용한다.


http://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/myService.wsdl</wsdl>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>
 
cs



4. 배포


1
2
3
4
5
6
7
8
9
10
<project>
  ...
  <distributionManagement>
    <site>
      <id>website</id>
      <url>scp://www.mycompany.com/www/docs/project/</url>
    </site>
  </distributionManagement>
  ...
</project>
cs


사이트로 배포할 때 위와같이 설정 할 수 있습니다.


추가로. <Parent> pom.xml 상속


<Parent> : pom.xml은 상속을 받을 수 있습니다. 스프링부트의 경우 부모 pom.xml에 자주 사용하는 라이브러리들의 버전정보나 dependency들을 이미 가지고 있어서 참조하기 편리 합니다.


* 참고로 super pom.xml이라는 것이 있습니다.


모든 pom.xml이 기본적으로 상속하고 있는 부모 설정파일로 이것 때문에 기본으로 생성된 pom.xml에 별 내용이 없어도 잘 처리합니다. 물론 생성된 pom.xml에서 설정 값을 오버라이드하면 super pom.xml 내용을 변경할 수 있다.














반응형

'프로그래밍 > 웹개발(WEB)' 카테고리의 다른 글

이클립스(Eclipse) 레이아웃 초기화 방법  (0) 2020.12.27
컴파일 빌드 차이점  (0) 2020.12.23
HTTP 오류코드 모음  (0) 2020.12.11
JNDI란 무엇인가요?  (0) 2020.10.04
[WEB 기초] 객체범위(scope)  (0) 2020.09.24

댓글