메이븐(Maven)

wellsbabo·2023년 7월 26일
0
post-thumbnail

이전에 자바 빌드툴에 대한 내용을 남겼습니다.
거기에 이어서 메이븐에 대해서 조금 더 자세히 적어보려고 합니다.


메이븐의 구성

  1. settings.xml
  • maven 툴 자체에 대한 설정을 담당하는 것으로서, 실제로 건드릴 일은 거의 없습니다.
    2. pom.xml
  • 메이븐으로 빌드 툴을 설정하고 자바 프로젝트를 생성하면 최상위 디렉토리에 생성되는 파일로서, 실질적으로 각종 프로젝트 정보, 라이브러리, 빌드 설정 등을 담당하는 곳입니다.
  • 일반적으로 개발시 사용되는 라이브러리들은 모두 프로젝트 내부 디렉터리에 담고 경로설정을 통해 사용해야 하지만 메이븐에서는 의존성 설정을 통해 (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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion> <!--POM model의 버전-->
	<!-- 부모 설정 -->
	<!-- 부모 pom.xml에 자주 사용하는 라이브러리들의 버전정보나 dependency들을 넣어놓고 참조 -->
	<parent> 
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.0</version>
		<relativePath/> <!-- parent가 상위 폴더가 아닌, 다른 폴더에 있는 경우 해당 폴더의 상대 경로 혹은 절대 경로를 적어준다 -->
	</parent>

	<!-- 자신의 프로젝트 정보 -->
	<groupId>kr.co.gravity</groupId> <!-- 프로젝트를 생성하는 조직 또는 그룹명으로 보통 URL의 역순으로 지정 -->
	<artifactId>sample</artifactId> <!-- 프로젝트에서 생성되는 기본 아티팩트의 고유 이름 -->
									<!-- 메이븐에 의해 생성되는 일반적인 아티팩트의 이름은 <artifactId>-<version>.<extension>이다. ex) sample-1.0.0.war -->
	<version>1.0.0</version> <!-- 현 프로젝트의 버전. 뒤에 SNAPSHOT이 붙으면 아직 개발 단계라는 의미이며 라이브러리를 관리하는 방식이 달라진다 -->
	<packaging>war</packaging> <!-- 패키징 유형 (jar, war, ear 등) -->
	<name>sample</name> <!-- 프로젝트 이름 -->
	<description>Sample project</description> <!-- 프로젝트 설명 -->
	<properties> <!-- pom.xml에서 사용하는 속성값들 정의 -->
		<java.version>11</java.version>
		<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>
		<restdocs.version>2.0.6.RELEASE</restdocs.version>
		<timezone>GMT+9</timezone>
	</properties>
	<dependencies> <!-- 프로젝트와 의존관게에 있는 라이브러리 관리 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion> <!-- 특정 의존 라이브러리를 제외시키는 기능 -->
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build> <!-- 빌드와 관련된 정보를 설정할 수 있는 곳 -->
		<plugins> <!-- 빌드에 사용할 플러그인 목록 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<profiles> <!-- 특정 빌드 환경에 맞춰 리소스의 재배치 및 환경에 대한 옵션들을 설정하여 실행할 수 있게 한다 -->
		<profile>
			<id>local</id>
			<properties>
				<spring.profiles.active>local</spring.profiles.active>
			</properties>
		</profile>
		<profile>
			<id>test</id>
			<properties>
				<spring.profiles.active>test</spring.profiles.active>
			</properties>
		</profile>
	</profiles>

</project>

artifact란?
자바 프로젝트를 빌드할때 많이 사용되는 maven에서는 빌드로 생성되는 프로젝트의 결과물을 의미한다. 아티팩트는 자바 프로젝트의 성격에 따라 다르지만 일반적으로는 . jar, . war, .ear 등의 확장자를 갖게 된다.

exclusion을 사용하는 예

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

이때 exclusion을 사용해야할 상황이 2가지 정도 있을것 같습니다.
첫번째로 spring-context-4.1.0.jar을 사용하지만 commons-logging은 2.0.0을 사용하고 싶은 경우입니다.
두번째로 spring-context를 사용하지만 로깅 프레임웍을 commons-logging(log4j)가 아닌 logback(slf4j)을 사용하고 싶은 경우입니다.

위와 같이 사용하는 라이브러이에서 이미 정해져 있는 의존 라이브러리가 아닌 특정 라이브러리를 지정해서 사용하고 싶은 경우에 exclusin으로 기존 의존 라이브러리를 제외한 이후에 진행을 해야합니다.


우선 제가 사용하면서 알아둬야겠다고 생각하고 공부한건 위에 있는 내용 정도입니다.

하지만 당연하게도 메이븐과 관련된 내용은 더욱 많이 있습니다.
예를 들면 빌드 관련 더욱 상세한 옵션이라던가, 관련된 라이프 사이클 혹은 배포나 테스트와 관련된 설정들도 있습니다.
아직 그것까지는 직접 해보지 않았기 때문에 관련 링크를 남겨놓고 필요해졌을 때 다시 공부하고 글을 작성해보겠습니다..

너무 잘 정리되어 있어서 도움을 정말 많이 받았습니다. (또 한명의 거인을 찾았다!)
링크

2개의 댓글

comment-user-thumbnail
2023년 7월 26일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

1개의 답글