728x90
spring 프로젝트를 만들면 maven 또는 gradle을 사용하는 것을 볼 수 있다.
오늘은 maven에 대해 공부를 해보려고 한다.
Apache Maven 이란?
- Apache에서 만든 Java 기반 프로젝트 관리도구
- POM(Project Object Model)의 개념을 기반으로 한다.
- pom.xml 파일에 필요한 라이브러리만 적으면 Maven이 자동으로 다운받고 설치해주고 경로도 지정해줌.
- 자동으로 의존성 관리를 해주는 중앙 저장소(라이브러리를 공유하는 파일 서버)라고 볼 수도 있다.
maven이 없는 세상
- 프로젝트를 만듦. mysql 라이브러리가 필요하다.
- mysql 사이트에서 다운을 받음
- 해당 파일을
3-1. 프로젝트 폴더에 카피해옴.(lib)
3-2. 외부 폴더에 카피해옴 - 빌드함 (프로젝트가 인식할 수 있게)
- 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의 종류
- compile(디폴트): 모든 상황에서 포함됨
- provided: 모든 상황에서 수행되지만, 다른 외부 컨테이너에서 기본 제공되는 API인 경우 provided로 지정 시 마지막 패키징할 때 포함되지 않음.
(예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외) - runtime: 실행 시에 필요한 경우. 런타임 및 테스트 시 classpath에 추가 되지만, 컴파일 시에는 추가되지 않음
- test: 테스트 시에만 사용.
- system: provided와 유사함. system의 특정 path를 참조하도록 지정한다. Maven의 central repository를 사용하지 않는다.
- 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://goddaehee.tistory.com/199
728x90
'Backend > Spring' 카테고리의 다른 글
git-commit-id-maven-plugin (0) | 2023.01.20 |
---|---|
SDK 17 is not compatible with the source version 17 (4) | 2023.01.09 |
Spring Framework란? (2) | 2022.12.28 |
springboot H2 데이터베이스 사용 에러: Failed to load ApplicationContext (2) | 2022.10.02 |
Spring Boot Devtools 사용하기 (2) | 2022.10.01 |