본문 바로가기
XML

[Spring] Maven, pom.xml

by 요리하다그만둠 2022. 7. 29.

POM ( Project Object Model )

pom은 프로젝트의 구조와 내용을 설명하고 있으며pom.xml 파일에 프로젝트 관리, 빋르데 필요한 환견 설정, 의존성 관리 등의 정보들을 기술합니다.

간단히말하면 pom.xml은 메이븐(Maver)의 빌드 정보를 담고 있는 파일입니다.

 

참고로 의존성은 https://mvnrepository.com/ 에 검색해서 가져오면됨.

원하는 버전 선택 해주면 됩니다.

그러면 의존성 정보가 나오는데 이걸 pom.xml에 복사 붙여넣기 해주시면 됩니다.

 

그러면 Maven은 무엇일까여?(https://maven.apache.org/what-is-maven.html)

자바용 프로젝트 관리 도구입니다.

(1.라이브러리 관리, 2.빌드 기능, 3. 높은 범용성(pom.xml은 다른 프로젝트에 복/붙 가능))

  • 빌드 프로세스를 쉽게 만들기
  • 균일한 빌드 시스템 제공
  • 양질의 프로젝트 정보 제공
  • 더 나은 개발 관행 장려

 

빌드는 프로젝트를 위해 작성한 Java코드나 여러 자원들(.xml, .jar, .properties)를 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과 물입니다. 또 단순히 커파일해주는 작업 말고도 테스팅, 검사, 배포까지 일련의 작업들을 빌드라고 부릅니다.

 

pom.xml의 기본형태

pom.xml은 파일 형식이 XML이므로 태그 형태로 구성되어 있습니다.

<project>태그 : 루트 태그이며 메이븐의 XML 네임스페이스를 지정해줍니다.

<modelVersion> : 메이븐의 모델 버전

<groupID> : 그룹 ID의 태그

<artifactID>: 아티팩트ID의 태그

<version> : 버전명 태그

<packageing> : 패키징 형식을 지정하는 태그 ex) war

<name> : 프로젝트 이름

<url> : 메이븐의 url

<properties> : 프로젝트 관련 속성

<parent> : pom.xml의 상속에 관련된 태그

<dependency> : 프로젝트가 의존하는 라이브러리들의 정보

<exclusions> : 특정 의존 라이브러리 제외

 

<exclusions>를 예로 설명해보면 Spring-context-4.1.0.jar이 commons-logging-1.0.0.jar를 의존한다고 했을때 spring-context-4.1.0을 dependency 설정으로 동록했을때 자동으로 commons-logging-1.0.0.jar를 내려받아 빌드환경에 추가됩니다.

여기서 2가지 문제가 있는데 첫번째는 spring-context-4.1.0.jar을 사용하지만 commons-logging는 2.0.0을 사용하고 싶은 경우입니다. sprign-context를 사용하지만 로깅 프레임웍을 commons-logging(log4j)가 아닌 logback(slf4j)을 사용하고 싶은 경우 입니다.

 

이경우 명시적으로 <exclusions>를 통해 commonst-logging-1.0.0이 추가되지 않도록 할수 있습니다.

exclusions 태그 사용

그렇지만 이대로 테스트를 하거나 빌드를 하면 실패할것입니다. 의존하는 logging라이브러리가 없기 떄문인데 

exclusions를 사용한 경우에는 그 빈자리를 dependency를 추가로 정의해주어야 합니다.

 

<dependency>는 프로젝트에 사용하는 라이브러리를 정의하는 태그입니다.

라이브러리는 groupId와 artifactId로 구별되므로, 이 두 가지 태그는<dependency>에 꼭 입력해주어야 합니다.

<groupId> : 라이브러리의 그룹 ID

<artifactld> : 라이브러리의 아티팩트 ID

<version> : 라이브러리를 사용할 버전

<scope> : 라이브러리가 프로젝트 내에서 사용하는 범위

 

예시 )

<?xml version="1.0" encoding="UTF-8"?> // XML 문서입을 명시
<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/maven-v4_0_0.xsd">
    // XML 문서에 단 한개만 존재하는 root 요소 생성
	<modelVersion>4.0.0</modelVersion> // 메이븐의 모델 버전
	<groupId>com.springbook</groupId> // 그룹의 id 태그 
	<artifactId>biz</artifactId> // 아티팩트 id 태그
	<name>BoardWeb</name>	// 프로젝트 이름
	<packaging>war</packaging>	// 패키징 형식 지정하는 태그
	<version>1.0.0-BUILD-SNAPSHOT</version>	// 버전명 태그
	<properties> // 프로 젝트 관련 속성입니다.
		<java-version>1.8</java-version>
        // 자바 버전
		<org.springframework-version>4.2.4.RELEASE</org.springframework-version>
        // 스피링프레임워크 버전 정보
		<org.aspectj-version>1.6.10</org.aspectj-version>
        // 확장성 참고 : https://www.eclipse.org/aspectj/
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- H2 데이터베이스 -->
		<dependency> // 의존성
			<groupId>com.h2database</groupId> 
			<artifactId>h2</artifactId> // 데이터베이스 이름
			<version>1.4.196</version> // 데이터베이스 버전
		</dependency>

		<!-- DBCP -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</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>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.8</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>

의존성 추가를 하면 Maven이 자동으로 jar파일을 생성시켜줍니다.

(의존성을 변경하는 경우에는 주석처리를 해두고 새로운 코드를 추가시키는 방법도 좋다.)

 

'XML' 카테고리의 다른 글

XML 네임스페이스~문서의 종류  (0) 2022.07.29
XML 요소~속성  (0) 2022.07.29
XML 문법~주석  (0) 2022.07.28
XML 개요~구조  (0) 2022.07.28