Backend/Spring

maven이란?

fladi 2023. 1. 9. 01:14
728x90

 

spring 프로젝트를 만들면 maven 또는 gradle을 사용하는 것을 볼 수 있다. 

오늘은 maven에 대해 공부를 해보려고 한다.

 

 

 

출처: apache maven 사이트(https://maven.apache.org/)

Apache Maven 이란?

  • Apache에서 만든 Java 기반 프로젝트 관리도구
  • POM(Project Object Model)의 개념을 기반으로 한다.
  • pom.xml 파일에 필요한 라이브러리만 적으면 Maven이 자동으로 다운받고 설치해주고 경로도 지정해줌.
  • 자동으로 의존성 관리를 해주는 중앙 저장소(라이브러리를 공유하는 파일 서버)라고 볼 수도 있다.

 

maven이 없는 세상

  1. 프로젝트를 만듦. mysql 라이브러리가 필요하다.
  2. mysql 사이트에서 다운을 받음
  3. 해당 파일을
    3-1. 프로젝트 폴더에 카피해옴.(lib)
    3-2. 외부 폴더에 카피해옴
  4. 빌드함 (프로젝트가 인식할 수 있게)
  5. mysql 라이브러리에서 필요한 기능을 import해서 사용가능

 

  • 3-1: 배포할 때 프로젝트 파일을 배포하면 관련 라이브러리도 알아서 옮겨진다. 프로젝트 각각 해당 라이브러리를 중복해서 가지고 있다. 
  • 3-2: 같은 컴퓨터의 프로젝트들이 하나의 파일을 공유해서 사용할 수 있다. 하지만 배포 시 다운받고 카피하는 과정을 거쳐야함

 

이 때 중앙저장소 maven을 사용하면?

  • 각각 회사의 사이트에서 다운받을 필요없이 중앙저장소만 접근해서 다운받으면 된다.
  • pom.xml에 필요한 라이브러리만 기술하면 maven이 알아서 다운로드 받고 빌드까지 해준다 (.m2)
  • 배포 시에 프로젝트만 배포하면 된다. pom.xml을 가지고 있으니 maven만 설치하면 다 알아서 해준다.

 

기능

  • 빌드: 빌드를 자동화 해주는 빌드툴. 의존성을 관리한다.
  • 패키징: 배포 가능한 파일을 생성해준다.
  • 프로젝트 관리: 버전, release, 라이프사이클 등을 관리
  • test: 단위 테스트를 수행할 수 있고, 빌드 결과가 정상적인지 점검할 수 있다.
  • 배포: 해당 프로젝트의 버전을 관리하기 위해 특정 원격 저장소에 배포가능. 빌드 후 생성된 아티팩트(컴포넌트)를 로컬 혹은 원격 저장소에 배포한다
  • 라이브러리 관리

 

장점

  • 컴파일과 빌드를 동시에 수행가능
  • 서버의 deploy 자원을 관리할 수 있는 환경을 제공한다.
  • pom.xml 파일을 통해 관리하므로 개발, 유지보수하기 좋다. 
  • IDE에 종속된 부분을 제거가능
  • Maven Profile 기능을 통해 배포 설정 파일을 관리하고 배포 파일을 생성할 수 있다.

 

단점

  • Maven에서 기본적으로 지원하지 않는 빌드 과정을 추가해야 하는 경우 힘들다
  • 특정 플러그인의 설정이 약간만 달라도 해당 설정을 분리해서 중복 기술할 때가 발생한다. 불필요하게 설정이 길어지고 중복, 가독성 저하가 발생하여 유지보수성을 떨어뜨린다.
  •  
  • 이와 같은 단점을 해결하기 위해, Gradle이라는 새로운 빌드 툴이 등장
    (Gradle은 안드로이드 애플리케이션의 기본 빌드 툴)

 

Maven 설정파일

 

1. settings.xml

  • maven tool 과 관련된 설정파일
  • MAVEN_HOME/conf/ 밑에 있다. (환경변수 MAVEN - Maven 설치 시 기본 제공)
  • 손댈 일이 잘 없다.

 

2. pom.xml

  • project obejct model
  • Maven 프로젝트의 root에 존재함
  • 프로젝트 내 빌드 옵션, 의존성 등 설정을 관리하는 파일
  • pom.xml이 아닌 다른 이름으로 설정할 수 있지만, 그냥 pom.xml을 쓰기를 권장함.

 

Maven 디렉터리 구조

 

src/main/java 기본 소스코드 디렉터리
src/main/resources 리소스 넣는 곳
src/test/java 테스트 코드 디렉터리
target compile 결과 디렉터리
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jpa-basic</groupId>
    <artifactId>ex1-hello-jpa</artifactId>
    <version>1.0.0</version>

    <build></build>

    <dependencies></dependencies>
</project>

 

<modelVersion> pom.xml을 이루고 있는 maven xml문서 형식의 버전이다. 현재는 무조건 4.0.0
<groupId> 프로젝트를 생성한 조직 또는 그룹명. 관례적으로 회사의 도메인명(google.com)을 거꾸로한 명칭을 사용.
<artifactId> 해당 프로젝트의 명칭. groupId 범위 내에서 유일하다.
<version> 해당 artifact의 버전. 접미사로 SNAPSHOT이 붙으면 아직 개발단계라는 의미.
<build> build 정보 관리
<dependencies> 의존성 라이브러리 정보들을 포함

 

 

build 관련

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

 

<plugins> 빌드에서 사용할 플러그인들 모음
<plugin> 어떠한 액션 하나를 담당하는 것. 
<configuration> 플러그인에서 필요한 설정 값 지정

 

 

 

dependency 관련

<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
    <scope>test</scope>
</dependency>

 

<version> dependency의 버전정보
<scope> 해당 dependency가 포함되는 범위에 대한 타입

* scope의 종류

  1. compile(디폴트): 모든 상황에서 포함됨 
  2. provided: 모든 상황에서 수행되지만, 다른 외부 컨테이너에서 기본 제공되는 API인 경우 provided로 지정 시 마지막 패키징할 때 포함되지 않음.
    (예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외)
  3. runtime: 실행 시에 필요한 경우. 런타임 및 테스트 시 classpath에 추가 되지만, 컴파일 시에는 추가되지 않음
  4. test: 테스트 시에만 사용.
  5. system: provided와 유사함. system의 특정 path를 참조하도록 지정한다. Maven의 central repository를 사용하지 않는다.
  6. import: scope는 dependencyManagement 섹션에서 pom의 의존관계에 대해 사용

 

// test로 했다가 로드할 수 없다는 오류가 나와서 당황했었다. 혹시 dependency가 추가가 안되는 것 같으면 scope를 바꿔보자

 

 

Repository

  • 3가지 종류
Local Repository dependency 및 패키징한 프로젝트 결과물을 local의 특정 위치에 저장한다.(windows: C:\Users\유저이름\.m2)
여러 프로젝트에서 중복된 라이브러리 다운로드를 피하기 위한 목적
Repository 의존성을 다운로드 받을 위치의 repository
<repositories> 밑에 여러 개를 기술할 수 있다.
Plugin Repository maven plugin을 다운로드 받을 수 있는 저장소 위치를 기술한다.

 

 

 

Maven repository 간단한 사용법

 

자바 Maven 프로젝트의 pom.xml 파일에 들어간다.

 

 

Maven repository 사이트에 들어가서 원하는 라이브러리 등을 검색한다.

 

 

 

클릭 후 원하는 버전을 선택한다.

 

 

 

maven 코드를 복사한다(클릭만 해도 자동으로 클립보드에 들어간다)

 

 

 

pom.xml 파일을 수정한다. <dependencies> 밑에 넣어준다. 여러 개가 있다면 줄줄이 넣어주면 된다.

 

 

 

pom.xml파일을 마우스 우클릭하여 Maven-Reload project를 해준다.

 

 

 

 

 

참고:

https://www.youtube.com/watch?v=jtur8oAAXYg&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=17

https://maven.apache.org/

https://goddaehee.tistory.com/199

https://namu.wiki/w/Maven

https://jeong-pro.tistory.com/168

https://wikidocs.net/book/1910

 

Maven 정복

Maven에 대해 정리해봅니다.

wikidocs.net

728x90