[Spring] Maven 빌드 툴

Jinny Kim·2021년 8월 1일
0

Spring

목록 보기
6/6

Spring 프로젝트 생성시 초기에 빌드 관리 도구 (빌드 툴)을 선택해야 하는데, 이 빌드 툴에는 대표적으로 Mavengradle 두 가지가 있다.

빌드(Build)란?
: 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 그에 대한 결과물 이다. 이를 좀 더 쉽게 풀어 말하자면 우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등(.xml, .jpg, .jar, .properties)을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.

빌드 도구 (Build Tool)
: 빌드 도구란 프로젝트 생성, 테스트 빌드, 배포등의 작업을 위한 프로그램이다. 빠른 기간 동안 계속해서 늘어나는 라이브러리 추가, 프로젝트를 진행하며 라이브러리의 버전 동기화 어려움을 해소하고자 등장했다.




Maven이란?


Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다. Maven은 Ant와 마찬가지로 프로젝트의 전체적인 라이프 사이클을 관리하는 도구 (Build Tool) 이며, 전반적인 프로젝트 관리 (Project Management) 기능까지 포함이 되어있다.

Maven은 많은 편리함과 이점이 있어 널리 사용되고 있다.
:프로젝트의 작성부터 컴파일, 페트스 등 프로젝트 라이프사이클에 포함되는 각 테스트를 지원해준다.

Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.
Maven은 중앙 저장소를 통한 자동 의존성 관리를 중앙 저장소(아파치재단에서 운영 관리)는 라이브러리를 공유하는 파일 서버라고 볼 수 있고, 메이븐은 자기 회사만의 중앙 저장소를 구축할수도 있다.
간단한 설정을 통한 배포 관리가 가능 하다.



Maven 설정 파일


settings.xml

메이븐 빌드 툴과 관련한 설정파일


POM (프로젝트 객체 모델(Project Object Model))

POM은 pom.xml 파일을 말하며 pom.xml은 메이븐을 이용하는 프로젝트의 root에 존재하는 xml 파일이다. (하나의 자바 프로젝트에 빌드 툴을 maven으로 설정하면, 프로젝트 최상위 디렉토리에 "pom.xml"이라는 파일이 생성된다.)

Maven의 기능을 이용하기 위해서 POM이 사용된다. 파일은 프로젝트마다 1개이며, pom.xml을 보면 프로젝트의 모든 설정, 의존성 등을 알 수 있다.



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/maven-v4_0_0.xsd">
   
  	<!--POM model의 버전-->
	<modelVersion>4.0.0</modelVersion>
  
  	<!-- 프로젝트를 생성하는 조직의 고유 아이디를 결정. 일반적으로 도메인의 이름을 거꾸로 적는다. -->
	<groupId>com.jin</groupId>
  
  	<!-- 프로젝트 빌드 시 파일의 대표 이름. groupId내에서 유일해야 한다. Maven을 이용하여 빌드 시 다음과 같은 파일이 생성된다. -->
	<artifactId>pom</artifactId>
 	
  	<!-- 프로젝트 이름 -->
	<name>pom</name>
  	
  	<!-- 패키징 유형 (jar, war, ear 등)-->
	<packaging>war</packaging>
  
  	<!-- 프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용 -->
	<version>1.0.0-BUILD-SNAPSHOT</version>
  
  	<!-- 버전 관리시 용이하다. ex)properties-project facet에서 자바 버전을 선언하고 dependencies에서 다음과 같이 활용 가능. <version>${java.version}</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 태그 안에는 프로젝트와 의존 관계에 있는 라이브러리들을 관리 한다.-->
	<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>




POM 엘리먼트 (element)

  • modelVersion : POM model의 버전
  • parent : 프로젝트의 계층 정보
  • groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.
  • artifactId : 프로젝트 빌드시 파일 대표이름 이다. groupId 내에서 유일해야 한다. Maven을 이용하여 빌드시 다음과 같은 규칙으로 파일이 생성 된다. artifactid-version.packaging의 규칙에 따라 생성된다.

    ex. 위의 프로젝트를 빌드할 경우 pom-1.0.0-BUILD-SNAPSHOT.war 파일이 생성된다.

  • version : 프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용하고, 어디에 붙이냐에 따라 Maven에서 라이브러리를 관리하는 방식이 다르다고 한다.
  • packaging : 패키징 유형(jar, war, ear 등)
  • name : 프로젝트, 프로젝트 이름
  • description : 프로젝트에 대한 간략한 설명
  • url : 프로젝트에 대한 참고 Reference 사이트
  • properties : pom.xml에서 중복해서 사용되는 설정(상수) 값들을 지정해놓는 부분, 다른 위치에서 ${...}로 표기해서 사용할 수 있다. 버전관리시 용이하다.

    ex. 자바 버전을 선언 하고 dependencies에서 다음과 같이 활용 가능 하다. ( "${java.version}") → 1.8이라고 쓴 것과 같다.
  • dependencies : dependencies태그 안에는 프로젝트와 의존 관계에 있는 라이브러리들을 관리 한다.
  • build : 빌드에 사용할 플러그인 목록



참고 사이트


https://woopi1087.tistory.com/30
https://junshock5.tistory.com/114

profile
공부한 것들을 기록합니다.

0개의 댓글