CS 기초

[JAVA] Maven pom.xml 구조

root_bridger 2023. 7. 1. 20:47

Maven이란?


  • Java application의 빌드 도구
  • Build tool : 프로젝트 생성, 테스트 빌드, 배포등의 작업을 위한 전용 프로그램
  • 빠른 기간 동안 계속해서 늘어나는 라이브러리 추가, 프로젝틀르 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장
  • Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라, 해당 라이브러리가 작동 하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운 받음
  • Maven은 중앙 저장소를 통한 자동 의존성 관리를 중앙 저장소(Apache 재단에서 운영 관리)는 라이브러리를 공유하는 파일 서버라고 볼 수 있고, 메이븐은 자기 회사만의 중앙 저장소를 구축할 수도 있음.
  • 간단한 설정을 통한 배포 관리가 가능.

Maven 장 단점


장점

  • Compile과 Build를 동시에 수행할 수 있음
  • 서버의 Deploy 자원을 관리할 수 있는 환경을 제공
  • pom.xml 파일을 통해 관리하므로, 개발 및 유지보수 측면에서 오픈소스 라이브러리, 프로젝트 등 관리가 용이
  • IDE에 종속된 부분들을 제거할 수 있음
  • Maven Profile 기능을 통해 배포 설정 파일을 관리하고 배포 파일을 생성

단점

  • Maven에서 기본적으로 지원하지 않는 build 과정을 추가해야 하는 경우 상당한 고생이 따름
  • 특정 플러그인의 설정이 조금만 달라도 해당 설정을 분리해서 중복 기술할 때가 발생 → 불필요하게 설정이 길어지고, 중복/가독성 저하가 발생, 유지보수성을 떨어뜨림

    ⇒ 이러한 단점을 해결하기 위해 Gradle이라는 빌드 툴 등장

Maven 특징


  • 미리 만든 프레임워크 이므로 미리 정의하고 있는 빌드 순서가 있음, 이 순서를 라이프 사이클이라고 함.
  • Phase
    • Maven의 각 빌드 단계를 지칭
    • phase들은 의존 관계를 가지고 있음→ 해당 phase가 수행되기 위해서는 이전 단계의 phase가 모두 수행되어야 함.
    • 모든 빌드 단계는 이전 단계가 성공적으로 실행 되었을 때, 실행됨. → Dependency
    • 각각의 phase는 어떤 일을 할지 정의하지 않고 어떤 플러그인의 goal를 실행할 지 설정
  • goal
    • 플러그인에서 실행할 수 있는 각각의 기능(명령)
    • Maven에서는 하나의 플러그인에서 여러 작업을 수행할 수 있도록 지원
    • 각각의 Phase에 연계된 Goal을 실행하는 과정을 build라고 함.

Maven Life Cycle


출처 :  https://velog.io/@changyeonyoo/Maven-이란

Clean

  • 빌드 시 생성되었던 파일들을 지우는 단계

Vaildate

  • 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계

Compile

  • 프로젝트의 소스 코드를 컴파일 하는 단계

Test

  • 유닛(단위) 테스트를 수행하는 단계(테스트 실패→빌드 실패로 처리, 스킵 가능)

Package

  • 실제 컴파일 된 소스 코드와 리소스들을 jar, war 등등의 파일 등의 배포를 위한 패키지로 만드는 단계

Verify

  • 통합 테스트 결과에 대한 검사를 실행해 품질 기준을 충족하는지 확인하는 단계

Install

  • 패키지를 로컬 저장소에 설치하는 단계

Site

  • 프로젝트 문서와 사이트 작성, 생성하는 단계

Deploy

  • 만들어진 Package를 원격 저장소에 release 하는 단계

최종 빌드 순서

  • Compile ⇒ Test ⇒ Package
    • Clean → init → compile → test-compile → test → package → integration-test → verify → install → deploy → site
  • Compile : src/main/java
    • 해당 디렉토리 아래의 모든 소스코드가 컴파일
  • Test : src/test/java, src/test/resources
    • 테스트 자원 복사 및 테스트 코드 컴파일
  • Packaging
    • 컴파일과 테스트가 완료된 후 jar, war과 같은 형태로 압축하는 작업

Maven pom.xml 구조


  • 다른 build tools와 다르게 선언적 접근 방법(Declarative Approach)를 사용
  • 빌드 프로세스를 이벤트 단위로 기술하는 것이 아니라, 프로젝트를 설명하고, 프로젝트 구조에 대해서 정의하고 이와 관련된 연관 정보들을 기술하는 형태
  • pom.xml에 들어가는 정보 내용
    • 기본 정보
      • 프로젝트 정의(Context, artifact 정의) → 필수
      • 연관 정보(라이브러리 연관 관계, 상위 프로젝트 등 정보) → 필수
    • 프로젝트 정보
      • 선택
    • 빌드 설정
      • 빌드 정의(기본 설정 되어 있는 빌드 프로세스에 변경을 위하여 별도의 플러그인을 적용할 때 사용) → 선택
      • 리포트 정의(빌드 프로세스에 대한 리포팅 뿐 아니라, 연관된 시스템과 결과 정보 등을 리포트로 만들기 위해 정의) → 선택
    • 환경 설정
      • 선택
  • 최상위 태그는 <project> xml의 루트 태그
  • 모든 pom.xml은 최상위 pom.xml을 참조
    • Super POM, 재 정의 하지 않는 이상 기본 값으로 적용되어 동작
    • Maven에서 기본적으로 제공하고 있는 것, 개발자가 만드는 모든 pom.xml은 이를 상속 받아 사용
  • 주요 태그 별 설명
    • <build>
      • Maven의 기본 디렉터리 구조가 정의되어 있음.
      • 이 정의를 변경하여 Maven의 기본 구조를 변경할 수 있음
    • <version>
      • Maven에서 version 에 대한 명명규칙을 SNAPSHOT과 RELEASE로 구분
      • SNAPSHOT : 완성되지 않은 버전, RELEASE : 완성되어 공식 배포된 버전
    • <properties>
      • pom.xml 파일 내부에서 사용할 속성을 정의
      • 주로 버전 정보와 같이 공통적으로 많이 사용하는 내용을 속성으로 정의
    • <scm>
      • 버전 관리 시스템과 연계하기 위한 정보를 기술
    • <repositories>
      • 메이븐 저장소 정보를 기술
      • 주로 사내 사설 저장소의 정보를 사용
    • <distributionManagement>
      • 빌드의 결과물을 배포할 위치를 지정
      • 주로 사내 사설 저장소의 정보를 사용
    • <profiles>
      • 특정 항목 혹은 특정 속성에 따라 빌드를 다르게 수행할 수 있음
      • 하나의 pom.xml 파일로 개발, 테스트, 운영 환경에서 모두 실행 가능하도록 할 때 유용하게 사용
  • 최소 pom 
<project>
	<modelVersion></modelVersion>
	<groupId></groupId>
	<artifactId></artifactId>
	<version></version>
</project>
  • 우리가 흔히 아는 오픈소스 라이브러리 등에 대한 참조 정보 역시 해당 라이브러리 프로젝트 속성 정보 3개를 이용
  • 향후 Maven 중앙 저장소, 사설 저장소에 등록해서 관리해야 하는 ㄱ영우 등록을 위한 필수 키도 바로 이 3개 항목
  • groupId
    • 프로젝트 구분하기 위해 사용, 일반적으로 도메인 명을 주로 사용
    • 전 세계의 수 많은 개발자들이 만들어내고 있는 Maven 기반 프로젝트들과 중복되지 않도록 정의하는 명명 규칙
  • artifactId
    • 프로젝트 이름으로 인식하는 경우가 많음
    • groupId와 artifactId를 조합해서 식별자로 사용
  • groupId:artifactId:version형태로 문장을 만들어 메이븐 주소라고 부름

 

간단한 예제를 통해 Maven 프로젝트 생성 → 패키징


https://jhleeeme.github.io/create-jar-with-maven-in-vscode/

 

Maven으로 jar파일 생성 & 실행 | 내가 다시 보려고 만든 블로그

OS는 Ubuntu18.04vscode상에서 진행한다.시나리오 Maven Project 생성 & Run jar파일 생성 & Run1. Maven Project 생성 & Runtest라는 폴더 안에 Maven Project를 생성하고, 돌려보았다. grou...

jhleeeme.github.io

감사히도 잘 설명해주시는 blog를 찾음

 

참고 한 자료들.. 
늘 좋은 글 감사합니다..!


'CS 기초' 카테고리의 다른 글

[OS] Zero Copy  (0) 2023.07.14
Java 개념 정리  (0) 2023.05.23
[CS 기초] 03. 캐시 메모리(Cache Memory)  (0) 2022.12.01