DOing
[Maven] Maven에 대해 알고 사용해보자 본문
이전 포스팅에서는 대표적인 빌드 도구로 꼽히는 Ant, Maven, Gradle을 비교해보았다.
오늘은 이 중에서 Maven에 대하여 더 자세히 다뤄보겠다.
Spring 프로젝트를 하면서 당연하게 생각하고 있었는데 이번 기회에 Maven에 대해 자세히 알고 사용하면 좋을 것같다.
💡 Maven?
자바용 프로젝트 관리도구
- Apache에서 Ant의 대안으로 개발하였다.
- 정해진 라이프사이클에 의하여 작업 수행하며, 전반적인 프로젝트 관리 기능까지 포함한다.
- 모든 빌드 단위에 대한 라이프 사이클이 예약되어있어 개발자가 임의로 변경할 수 없다.
- 의존성을 설정하여 라이브러리 자동 관리
- pom.xml에 라이브러리를 정의해놓으면 자동 관리해준다.
💡 Maven 라이프 사이클
Maven에서는 default lifecycle, clean lifecycle, site lifecycle 총 3개의 라이프사이클을 제공하고 있다.
더 자세한 내용은 Maven 공식문서 중 Lifecycles에서 확인 할 수 있다.
메이븐의 라이프 사이클을 더 자세히 이해하기 위해서는 plugin, goal, phase의 개념을 이해해야한다.
[ plugin ]
메이븐에서 제공하는 모든 기능은 플러그인을 기반으로 동작한다.
메이븐은 자체는 기본적인 기능만 가지고 있고 대부분의 기능들은 플러그인을 통해 제공하도록 되어있기 때문이다
플러그인은 여러개의 goal을 가지고 있다.
[ Goal ]
플러그인에 포함되어있는 명령이다.
즉, 플러그인에서 실행하는 각각의 작업을 goal이라고 한다.
한개의 Phase는 0개 또는 1개이상의 goal과 연결된다.
[ Phase ]
라이프 사이클에서 빌드 단계와 각 단계의 순서를 정의하고 있는 개념이다.
phase가 빌드작업을 하는 것은아니다. 실질적인 빌드 작업은 각 phase에 연결되어있는 플러그인의 goal이 한다.
[ default lifecycle ]
default lifecycle의 주요 phase
- compile : 소스코드를 컴파일한다. (컴파일이란 원시코드를 목적코드로 옮기는 과정을 말한다.)
- test : Junit과 같은 단위 테스트를 수행한다.
- package : pom.xml의 지정한 packaging 값(jar, war등)에 따라 압축한다.
- install : 로컬 저장소에 압축한 파일을 배포한다.
- deploy : 원격 저장소에 압축한 파일을 배포한다. 이때 원격 저장소란 외부에 위치한 메이븐 저장소를 의미한다.
[ clean lifecycle, site lifecycle ]
clean 라이프 사이클은 빌드한 결과물을 제거하며 site 라이프 사이클은 프로젝트 문서사이트를 생성한다.
💡 Maven 설정 파일
1. setting.xml
settings.xml은 Maven tool 자체에 관련된 설정을 담당한다.
MAVEN_HOME/conf/ 아래에 있다.
Maven 자체에 설정 값을 바꾸는 일은 일단 잘 없다.
2. pom.xml(Project Object Model)
Maven을 이용하는 프로젝트의 root에 존재하는 xml 파일이다.
프로젝트 내에 빌드 설정을 담당한다.
pom.xml이아닌 다른 이름을 지정해도 되지만 되도록이면 pom.xml으로 사용하길 권장한다.
💡 pom.xml 파일 살펴보기
다음 코드는 STS를 이용해서 Spring MVC Project를 생성했을때 자동으로 만들어지는 pom.xml의 전체코드이다.
(STS : Spring Tool Suite, Spring 개발을 편하게 해주는 도구)
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>exampleApp</artifactId>
<name>example</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
큰 틀만 살펴보게 된다면 다음과 같다.
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>exampleApp</artifactId>
<name>example</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- dependency 목록 -->
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- 빌드에 사용할 플러그인 -->
</plugin>
</plugins>
</build>
</project>
<modelVersion> : pom.xml의 버전
<groupId> : 프로젝트를 생성하는 조직명
<artifactId> : 프로젝트 빌드시 파일 대표이름.
<name> : 프로젝트 이름
<version> : 프로젝트의 현재 버전, 개발중일때에는 SNAPSHOT을 접미사로 사용한다.
<packaging> : 패키징 유형 (jar, war등)
** Maven 사용하여 빌드하면 "artifactid-version.packaging" 규칙으로 파일이 생성된다.
위의 예제에서 빌드할 경우에는 exampleApp-1.0.0-BUILD-SNAPSHOT.war파일이 생성된다.
<properties> : pom.xml에서 중복해서 사용되는 설정(상수) 값들을 지정해놓는 부분이다. 버전 관리시에 용이하다.
<dependency> : 의존 관계가 있는 라이브러리들을 관리한다.
<build> : 빌드에 사용할 플러그인 목록
+) 라이브러리 추가하는 방법
1. https://mvnrepository.com/에서 들어가서 라이브러리를 검색
2. 버전 선택한 후, 나오는 텍스트를 복사해서 <dependencies>안에 붙여넣기를 하면 된다.
출처:
wiki.gurubee.net/display/SWDEV/Maven+Lifecycle
www.slideshare.net/ssuser5445b7/ss-56566336
'Spring' 카테고리의 다른 글
Domain, Entity, Value(Object) (3) | 2021.05.27 |
---|---|
Spring ShoppingMall 팀프로젝트 회고 (1) | 2021.05.17 |
[Spring Security] UserDetailsService를 이용한 인증 (0) | 2021.04.28 |
[Spring Security] DB를 이용하여 로그인 (0) | 2021.04.28 |
[Spring Security] 소셜로그인 - 네이버 (0) | 2021.04.11 |