Maven 빌드 시스템 이해하기: 프로젝트 관리와 자동화를 위한 필수 도구

개요

메이븐은 프로젝트 객체 모델(Project Object Model)이라는 개념을 바탕으로 프로젝트 의존성 관리, 라이브러리 관리, 프로젝트 생명 주기 관리 기능 등을 제공하는 프로젝트 관리 도구이다. 또한 플러그인을 기반으로 소스 코드로부터 배포 가능한 산출물을 만들어 내는 빌드 기능 뿐만 아니라 레포팅 및 documentation 작성 기능 등을 제공한다.

 

설명

Maven 특징

Maven 장점 Maven 단점
• 뛰어난 의존성 관리
- 의존성 자동 업데이트
-저장소를 통한 라이브리 일괄 관리 
• Repository 관리의 불편함
- Maven 프로젝트의 급속한 발전으로 central repository가 제공하는 라이브러리들이
빠르게 증가하고 있으나 아직 3rd 파티 라이브러 등 미제공 라이브러리들이 있음
• 모든 프로젝트에 걸쳐 쉽게 적용 가능한 일관적인 사용법  • pom.xml 파일 관리
- 메이븐 프로젝트 관리에 대한 모든 내용이
pom.xml 파일에 담기게 되믄로 길고 장황하게 될 수 있음
• 라이브러리 및 메타 데이터 저장을 위한 지속적으로 확장 되고 있는 저장소
• 프로젝트에 특화된 복잡한 빌드 기능 제약
- 메이븐 프로젝트 특성상 소프트웨어 빌드에 통용되는
라이프 사이클을 제공하고 있어 세부 항목 또는 특화된 빌드 환경에 대한 지원이 미약함.
• 쉽게 작성 가능한 플러그 인을 통한 확장성
• 동시에 다수의 프로젝트 핸들링 할 수 있는 쉬운 설정 기반의 메커니즘
• 간단한 설정을 통한 배포 관리
• Java, C++ 등 다수의 프로그래밍 언어 지원

 

리눅스에서 make 파일은 소프트웨어를 빌드하는 데 사용되는 중요한 도구입니다. make는 주로 C/C++ 프로그램의 컴파일과 링크 과정을 자동화하는 데 사용됩니다. make 파일, 또는 Makefile,은 소스 코드와 관련된 빌드 규칙을 정의한 파일입니다.

 

기본 개념

 

1. 목표(Target): Makefile에서 수행할 작업의 결과물입니다. 일반적으로 컴파일된 실행 파일이나 객체 파일입니다.

2. 의존성(Dependency): 목표를 만들기 위해 필요한 파일입니다. 예를 들어, 소스 파일이 객체 파일을 생성하는 데 필요합니다.

3. 명령(Command): 목표를 생성하기 위해 make가 실행할 명령어입니다. 주로 컴파일 명령어가 여기에 포함됩니다.

 

Makefile에서 **디펜던시(Dependency)**와 **레시피(Recipe)**는 서로 다른 역할을 수행합니다. 이 두 가지는 함께 작동하여 목표(target)를 성공적으로 빌드하는 데 필요한 프로세스를 정의합니다. 각각의 개념을 자세히 살펴보겠습니다.

 

디펜던시 (Dependency)

 

디펜던시는 목표를 생성하는 데 필요한 파일이나 다른 목표를 의미합니다. 어떤 파일이 변경되었을 때 그 파일에 의존하는 다른 파일들도 재생성해야 할 필요가 있음을 나타냅니다. 즉, 디펜던시는 목표를 업데이트하기 위한 입력 파일입니다.

 

목표디펜던시에 의존한다는 것은, 디펜던시가 변경될 경우 목표도 다시 빌드해야 한다는 의미입니다.

디펜던시는 소스 파일, 객체 파일, 다른 목표 등일 수 있습니다.

 

레시피 (Recipe)

 

레시피는 목표를 빌드하기 위해 실행되는 명령어들의 집합입니다. 레시피는 목표가 디펜던시에서 어떤 식으로 생성될지를 설명합니다.

 

레시피는 디펜던시를 기반으로 목표를 생성하는 실제 명령어들입니다.

각 레시피 명령어는 탭으로 시작해야 하며, 쉘 명령어일 수 있습니다.

 

요약

 

디펜던시 (Dependency): 목표를 생성하기 위해 필요한 파일들입니다. 디펜던시가 변경되면 목표도 재생성해야 합니다.

레시피 (Recipe): 목표를 생성하기 위해 실행되는 명령어들의 집합입니다. 디펜던시에 대한 변경 사항을 반영하여 목표를 업데이트하는 작업을 수행합니다.

 

디펜던시와 레시피는 함께 작동하여 소스 코드의 변경 사항을 자동으로 감지하고, 필요한 부분만 재컴파일하여 효율적인 빌드를 지원합니다.

 

Maven 아키텍처

Maven은 프로젝트 전체 내용에 대한 기술 및 설정을 담당하는 POM과 라이브러리(Maven에서는 artifact라 호칭함) 관리에 대한 dependency/repository 관리 모델 그리고 컴파일, 테스트, 패키징 등의 빌드 생명 주기를 다루는 lifecycle 및 관련된 plugin들과의 연동을 다루느 부분으로 구성된다.

 

프로젝트 객체 모델: 메이븐 엔진 내장 + POM.xml 파일에서 선언적으로 제공
종속성 관리 모델: 로컬 및 리모트 저장소를 이용
프로젝트 생명 주기 모듈: 메이븐 엔진은 플러그인을 통해 파일을 다루는 거의 모든 작업을 수행

 

 

pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.intheeast</groupId>
    <artifactId>JDBCAPIsTutorials</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- 필요한 경우 종속성 추가 -->
        <dependency>
	    	<groupId>mysql</groupId>
	    	<artifactId>mysql-connector-java</artifactId>
	    	<version>8.0.28</version>
	</dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Compiler plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <release>17</release>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

 

Maven Repository

Repository는 artifact들의 저장소로 로컬 및 리모트 repository로 구성되며 프로젝트는 pom.xml에서 선언한 dependency들을 저장소로부터 불러와서 사용한다.

1. Maven 설치 시 로컬에 Maven artifact들을 저장하고 관리하는 repository가 자동으로 구성된다. 
    ⦁ 기본 설정은 C:\Users\xxx\.m2\repository\repository 디렉토리에 구성된다. 

2. Maven 리모트 repository
    ⦁ Maven에서 제공하는 central respositoty와 각 기업 또는 organization에서 제공하고 있는 
      리모트 repository들이 있으며 개발자는 환경 설정을 통해 하나 이상의 외부 repository에서 필요로 하는 
      artifact들을 다운로드 받아 사용할 수 있다.

3. repository 호출 프로세스 
    ⦁ 일반적인 개발 시에 주로 사용되는 라이브러리 관리 메커니즘은, 필요한 라이브러리를 프로젝트 
       내부 디렉터리에 담고 path 설정을 통해 사용하고 있으나 Maven에서는 의존성 설정 메커니즘
       (라이브러리를 설정 파일에 선언하여 사용함) 통해 사용하고 관리한다. 
    3.1 프로젝트의 pom.xml에서 라이브러리 선언 
    3.2 개발자 로컬 리포지토리에서 선언한 라이브러리 검색 
        ⦁ 존재 시 프로젝트에 라이브러리 cache 
        ⦁ 존재하지 않을 경우 리모트 리포지토리에 요청 
    3.3 리모트 리포지토리에서 선언한 라이브러리 검색 
       ⦁ 로컬 리포지토리는 리모트 리포지토리에서 검색된 artifact를 내려 받아 저장한다.


 

  • local repository : artifact들을 로컬 파일 시스템에 cache하는 기능으로 원격 repository에서 다운로드 받아 artifact들을 저장하고 관리한다.
  • remote repository :  주로 HTTPS 서버로 3rd 파티에서 제공하는 artifact들을 제외한 거의 모든 artifact들을 제공한다.

[https://mvnrepository.com/]

 

이 웹사이트는 개발자들이 필요로 하는 라이브러리의 메타데이터를 쉽게 검색하고 다운로드할 수 있도록 도와줍니다. 주요 기능과 특징은 다음과 같습니다: 
1. 라이브러리 검색: 다양한 라이브러리와 모듈을 검색할 수 있습니다. 특정 키워드, 그룹 ID, 아티팩트 ID 등을 입력하여 관련된 종속성을 쉽게 찾을 수 있습니다. 
2. 버전 관리: 각 라이브러리의 여러 버전을 제공하며, 특정 버전의 메타데이터, 릴리스 날짜, 변경 사항 등을 확인할 수 있습니다. 
3. 종속성 정보 제공: 각 라이브러리 페이지는 해당 라이브러리를 프로젝트에 추가하는 데 필요한 Maven, Gradle, SBT 등의 종속성 정보를 제공합니다. 
4. 인기 라이브러리: 많이 사용되는 인기 라이브러리 목록을 제공하여, 최신 트렌드와 추천 라이브러리를 쉽게 찾을 수 있습니다. 
5. 문서화 및 링크: 라이브러리에 대한 자세한 문서, 프로젝트 홈페이지 링크, 소스 코드 저장소 링크 등을 제공합니다. 
6. 커뮤니티 피드백: 라이브러리에 대한 사용자 리뷰와 평가를 통해 품질을 가늠할 수 있습니다. 
이 웹사이트는 Java 개발자들이 프로젝트에서 필요로 하는 다양한 종속성을 효율적으로 관리하고 통합할 수 있도록 도와주는 중요한 도구입니다.

 

Maven Directory 구조

Spring Tool Suite IDE에서 Maven 기반 자바 프로젝트를 생성할 때, 다음과 같이 첫번째 체크 박스를 체크해서 프로젝트를 생성해 주세요

 

 

메이븐은 Best practices을 기반으로 정규화된 디렉터리 구조를 제공하고 있으며 모든 소스 파일들은 /src 디렉터리 밑에 그리고 빌드 된 output은 /target 디렉터리 밑에 위치한다.

Maven 표준 디렉토리 구조

 

스프링 부트 프로젝트 기본 구조 (Maven 사용 시)

my-spring-boot-app
|-- pom.xml
|-- src
|   |-- main
|   |   |-- java
|   |   |   |-- com
|   |   |       |-- example
|   |   |           |-- MySpringBootApplication.java
|   |   |-- resources
|   |       |-- application.properties
|   |-- test
|       |-- java
|       |   |-- com
|       |       |-- example
|       |           |-- MySpringBootApplicationTests.java
|       |-- resources
|-- target


주요 디렉토리 및 파일 설명

  • src/main/java: 애플리케이션의 주요 소스 코드가 위치합니다.
  • src/main/resources: 애플리케이션 리소스 파일 (예: application.properties 설정 파일)이 위치합니다.
  • src/test/java: 애플리케이션의 테스트 소스 코드가 위치합니다.
  • src/test/resources: 테스트 리소스 파일이 위치합니다.
  • target: Maven 빌드 결과물이 저장되는 디렉토리로, 컴파일된 클래스 파일, JAR 파일, WAR 파일 등이 여기에 포함됩니다.
  • pom.xml: Maven 빌드 설정 파일로, 프로젝트의 종속성, 플러그인, 빌드 설정 등을 정의합니다.

 

가상 디렉토리

1. JRE System Library

Maven 프로젝트 디렉토리 구조에서 JRE System Library는 Java Runtime Environment (JRE) 관련 라이브러리들을 포함하는 가상 디렉토리입니다. 이 디렉토리는 Java 애플리케이션이 실행될 때 필요한 기본적인 Java 클래스 라이브러리들을 나타내며, 일반적으로 IDE(통합 개발 환경)에서 표시됩니다. 예를 들어, Eclipse와 같은 IDE에서 Maven 프로젝트를 열면, 프로젝트 탐색기에서 JRE System Library라는 항목을 볼 수 있습니다. 

주요 기능 및 역할

1. Java 기본 클래스 포함: java.lang, java.util, java.io 등과 같은 표준 Java 클래스 라이브러리를 포함합니다. 이러한 라이브러리들은 모든 Java 프로그램에서 기본적으로 사용되는 클래스들을 제공합니다.

2. JRE 버전 관리: JRE System Library는 프로젝트가 특정 JRE 버전을 대상으로 빌드되고 실행될 것임을 나타냅니다. 이를 통해 프로젝트가 어떤 Java 버전과 호환되는지를 명확히 할 수 있습니다.

3. 컴파일 및 실행 환경 설정: IDE에서 JRE System Library를 통해 프로젝트의 컴파일 및 실행 환경을 설정할 수 있습니다. 이는 Maven의 pom.xml 파일에 설정된 Java 버전과 일치해야 합니다.

4. IDE 통합: Eclipse와 같은 IDE에서는 프로젝트의 Java 빌드 경로에 JRE System Library를 자동으로 추가하여 개발자가 프로젝트를 설정하는 데 도움이 됩니다. 이를 통해 프로젝트의 코드가 JRE의 클래스에 접근할 수 있도록 합니다.

 

Maven과 JRE System Library의 관계 

Maven 프로젝트의 경우, pom.xml 파일을 통해 프로젝트의 Java 버전을 명시할 수 있습니다. 예를 들어, 아래와 같이 maven-compiler-plugin을 사용하여 Java 버전을 설정할 수 있습니다: 

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


이 설정을 통해 Maven은 프로젝트를 Java 8로 컴파일하고 실행하도록 설정하며, IDE는 이에 맞춰 JRE System Library를 설정합니다. 

따라서 JRE System Library는 Maven 프로젝트의 Java 실행 환경을 정의하고 관리하는 중요한 요소이며, 개발자가 프로젝트에서 필요한 기본적인 Java 클래스를 사용할 수 있도록 지원합니다.

 

2. Maven Dependencies

Maven Dependencies는 Maven 프로젝트 디렉토리 구조에서 외부 라이브러리와 모듈 종속성을 나타내는 가상 디렉토리입니다. 이 디렉토리는 pom.xml 파일에 정의된 모든 종속성을 포함하며, 프로젝트 빌드와 실행에 필요한 라이브러리들을 보여줍니다. 

주요 기능 및 역할 

1. 종속성 관리: Maven Dependencies는 pom.xml 파일에 정의된 종속성(dependencies)들을 나타냅니다. Maven은 프로젝트 빌드 과정에서 필요한 외부 라이브러리를 중앙 저장소(Maven Central Repository)나 커스텀 저장소에서 다운로드하여 이 디렉토리에 추가합니다.

2. 라이브러리 제공: 프로젝트에 필요한 외부 라이브러리들을 제공하여 컴파일, 테스트, 실행 단계에서 사용할 수 있도록 합니다. 예를 들어, 로깅 라이브러리인 Log4j, JSON 파싱 라이브러리인 Jackson 등의 라이브러리를 포함할 수 있습니다.

3. 트랜스티브 종속성 관리: Maven은 직접 선언된 종속성뿐만 아니라, 이러한 종속성들이 필요로 하는 다른 라이브러리(트랜스티브 종속성)도 자동으로 해결하고 다운로드합니다. Maven Dependencies는 이 모든 트랜스티브 종속성도 포함합니다.

4. 버전 관리: 각 라이브러리의 특정 버전을 관리합니다. Maven은 동일한 라이브러리의 여러 버전이 충돌하지 않도록 관리하며, pom.xml 파일에 설정된 버전을 기준으로 종속성을 처리합니다.


Maven Dependencies의 예시
pom.xml 파일에 종속성을 추가하는 예시는 다음과 같습니다: 

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
    <dependency>
        <groupId>cohttp://m.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.5</version>
    </dependency>
</dependencies>


위의 예시에서는 commons-lang3와 jackson-databind 라이브러리를 종속성으로 추가하였습니다. Maven은 이 종속성들을 다운로드하여 Maven Dependencies 섹션에 추가합니다. 

IDE 통합
Eclipse, Spring Tool Suite, IntelliJ IDEA와 같은 통합 개발 환경(IDE)은 Maven 프로젝트를 열 때 Maven Dependencies 섹션을 자동으로 생성하여, pom.xml 파일에 정의된 모든 종속성을 이 디렉토리에서 볼 수 있게 합니다. 이를 통해 개발자는 프로젝트에서 사용하는 모든 외부 라이브러리와 그 버전을 쉽게 확인하고 관리할 수 있습니다. 

종속성 충돌 해결
Maven은 종속성 충돌을 해결하기 위한 여러 메커니즘을 제공합니다. pom.xml 파일에서 특정 라이브러리의 버전을 명시하거나, dependencyManagement 섹션을 사용하여 종속성 버전을 중앙에서 관리할 수 있습니다. 이를 통해 프로젝트에서 사용되는 라이브러리들의 호환성을 유지하고 충돌을 방지할 수 있습니다. 

요약하면, Maven Dependencies는 Maven 프로젝트에서 외부 라이브러리 종속성을 관리하고, 프로젝트 빌드와 실행에 필요한 모든 라이브러리를 포함하여 개발자가 쉽게 접근하고 사용할 수 있도록 도와주는 중요한 기능입니다.

 

추가 디렉토리

스프링 부트 프로젝트에서 추가 디렉토리를 사용하고자 할 때는 주로 아래와 같은 용도로 사용할 수 있습니다: 
1. src/main/resources/static: 정적 자원(HTML, CSS, JavaScript 파일 등)이 위치합니다. 
2. src/main/resources/templates: 템플릿 파일(Thymeleaf, Freemarker 등)이 위치합니다. 
3. src/main/resources/META-INF: 메타데이터 파일이 위치합니다.

 

 

Maven 기본 생명 주기

메이븐 빌드는 소프트웨어 프로젝트의 핵심적인 빌드 라이플 사이클 개념을 따르고 있으며, 빌드 초기화 단계부터 artifact의 배포까지의 생명 주기를 정의하고 있다.

Maven 생명 주기 단계는 각각의 플러그인과 바인딩 되어 실제로 바인딩된 플러그인이 명령을 실행 하며 단계 순서에 따라 순차적으로 빌드가 실행되어 개발자가 실행한 명령을 수행한다. 
예) mvn install 명령을 실행하면 generate-sources 단계부터 compile, test 명령 등을 거쳐 install 명령을 실행한다.
Life Cycle Step Description
validate 현재 설정과 POM의 내용이 유효한지 확인
generate-
sources
코드 생성기가 이 다음의 단계들에서 컴파일되고 처리할 소스 코드를 생성하기 시작하는 순간
compile 소스 코드를 컴파일한다. 컴파일된 클래스들은 타겟 디렉토리 트리 구조에 저장된다.
test 컴파일된 단위 테스트를 실행하고 그 결과를 표시한다.
package 실행 가능한 바이너리 파일들을 WAR나 JAR같은 배포용 압축 파일로 묶는다.
install 압축 파일로 로컬 메이븐 저장소에 추가한다.
deploy 압축 파일을 원격 메이븐 저장소에 추가한다

 

 

 

메이븐2 기본 생명주기 단계

생명주기 단계  설명 
validate 현재 설정과 POM의 내용이 유효한지 확인한다. 이 과정은 POM.XML 파일 트리 구조를 검증한다.
initialize 빌드 사이클에서 수행할 주요 작업 이전에 초기화를 할 수 있는 순간
generate-sources 코드 생성기가 이 다음의 단계들에서 컴파일 되고 처리할 소스 코드를 생성하기 시작하는 순간
process-sources 소스의 파싱, 수정, 변경을 제공한다. 일반 코드 또는 생성된 코드 모두 여기서 처리한다.
generate-resources 소스 코드가 아닌 리소스를 생성하는 단계. 보통 메타데이터 파일과 설정 파일을 포함한다.
process-resources 이전 과정의 소스 코드가 아닌 리소스 파일들을 다룬다. 이 단계에서 리소스 파일들이 수정, 변경 재배치 된다.
compile 소스 코드를 컴파일한다. 컴파일된 클래스들은 카깃 디렉터리 트리 구조에에 저장된다.
process-classes 클래스 파일 변환과 개선 단계를 다룬다. 바이트 코드 위버(weaver)와 instrument 도구가 동작하는 단계다.
generate-test-sources 단위 테스트 코드를 생성하는 모조가 동작하는 순간
process-test-sources 컴파일하기 전에 테스트 소스 코드에 필요한 작업을 수행한다. 이 단계에서 소스 코드는 수정, 변환 또는 복사될 수 있다.
generate-test-resources 테스트 관련 리소스 생성을 허용한다.
process-test-resources 테스트 관련 리소소의 처리, 변환, 재배치가 가능하다.
test-compile 단위 테스트 소스 코드를 컴파일한다.
test 컴파일된 단위 테스트를 싱행하고 그 결과를 표시한다.
package 실행 가능한 바이너리 파일들을 JAR나 WAR 같은 배포용 압축 파일로 묶는다.
pre-integration-test 통합 테스트를 준비한다. 이 경우 통합 테스트는 실제 배치 환경의 코드를 테스트 하는 것을 말한다. 이 단계에서 위에서 묶은 압축 파일을 서버에 배치할 수 있다.
integration-test 실제 통합 테스트를 수행한다.
post-integration-test 통합 테스트 준비 상태를 해제한다. 이것은 테스트 환경의 리셋 또는 재초기화 과정을 포함할 수 있다.
verify 배치 가능한 압축 파일의 무결성과 유효성을 검증한다. 이 과정 이후에 압축 파일들이 설치 된다.
install 압축 파일을 로컬 메이븐 디렉터리에 추가한다. 이로 인해 이것에 의존하는 다른 모듈들을 사용할 수 있게 된다.
deploy 압축 파일을 원격 메이븐 디렉터리에 추가한다. 더 많은 사용자들이 이 artifact를 사용할 수 있게 된다.

 

 

Plug-in

Maven의 플러그인(plugins)은 빌드 프로세스의 다양한 단계를 수행하기 위해 사용되는 추가 기능 모듈입니다. Maven은 자체적으로 프로젝트 빌드를 관리하는 기본적인 기능만을 제공하고, 실제 빌드 과정에서 발생하는 여러 작업은 플러그인을 통해 처리됩니다. 예를 들어, 컴파일, 테스트 실행, 패키징, 배포, 코드 분석 등의 작업은 모두 각기 다른 플러그인을 사용하여 수행됩니다. 

Maven 플러그인의 주요 개념

1. goal: 플러그인이 실행하는 특정 작업을 의미합니다. 하나의 플러그인은 여러 개의 goal을 가질 수 있습니다. 예를 들어, maven-compiler-plugin에는 compile  testCompile 같은 goal이 있습니다. 

2. Default Plugins: Maven은 특정 작업을 위해 기본적으로 제공되는 플러그인이 있습니다. 예를 들어, 소스 코드를 컴파일하기 위해 maven-compiler-plugin이 기본적으로 제공됩니다. 

3. Custom Plugins: 사용자는 자신의 요구에 맞는 플러그인을 추가하거나 기존 플러그인의 동작을 재정의할 수 있습니다. 이를 위해 pom.xml 파일에서 플러그인을 설정합니다. 

4. Build Lifecycle: Maven의 빌드 라이프사이클은 여러 단계(예: validate, compile, test, package, install, deploy)로 구성되며, 각 단계에서 특정 플러그인이 호출됩니다.

 

플러그인 예시

  • maven-compiler-plugin: Java 소스 파일을 컴파일합니다.
  • maven-surefire-plugin: 유닛 테스트를 실행합니다.
  • maven-jar-plugin: 컴파일된 코드를 JAR 파일로 패키징합니다.
  • maven-clean-plugin: 이전 빌드에서 생성된 파일을 삭제합니다.

플러그인 설정 예시

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


위의 예시에서 maven-compiler-plugin을 사용하여 Java 8 소스 코드와 바이트코드를 컴파일하는 방법을 보여주고 있습니다. 

이처럼 Maven 플러그인은 빌드 과정의 다양한 작업을 자동화하고 간소화하는 데 중요한 역할을 합니다.

 

Pom.xml 태그

<properties>

Maven의 properties 섹션은 pom.xml 파일에서 공통적으로 사용되는 값들을 변수로 정의하여 관리하는 부분입니다. properties 섹션에 정의된 값들은 다른 설정에서 ${propertyName} 형태로 참조할 수 있습니다. 이를 통해 설정 값들을 중앙에서 관리하고, 필요할 때 쉽게 변경할 수 있게 됩니다. 

properties 섹션의 주요 용도

1. 버전 관리: 특정 의존성(dependency)이나 플러그인의 버전을 한 곳에서 관리하여 여러 곳에서 참조할 수 있습니다. 
2. 컴파일러 설정: 자바 버전 등과 같은 빌드 설정을 한 번에 관리할 수 있습니다. 
3. 환경 변수 관리: 데이터베이스 접속 정보나 파일 경로 등 환경 설정 값을 중앙에서 관리할 수 있습니다. 

위 예시의 properties 섹션

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>


위 properties 섹션에서는 두 가지 속성이 정의되어 있습니다:

  • maven.compiler.source: 자바 소스 코드의 버전을 지정합니다. 예를 들어, Java 17을 사용하여 소스를 컴파일합니다.
  • maven.compiler.target: 생성된 바이트코드의 타겟 JVM 버전을 지정합니다. 이 경우에도 Java 17을 타겟으로 지정하고 있습니다.

이렇게 정의된 속성들은 Maven의 다른 섹션에서 ${maven.compiler.source} ${maven.compiler.target}로 참조할 수 있습니다. 예를 들어, maven-compiler-plugin에서 이 값들을 참조하여 컴파일 소스와 타겟 버전을 설정합니다. 

이처럼 properties 섹션은 중복되는 설정 값들을 줄이고, 관리하기 쉽게 해줍니다. 프로젝트가 커지거나 복잡해질수록 이 방식은 매우 유용하게 작용합니다.

자바에서의 Property는 다양한 상황에서 사용되며, 그 의미는 문맥에 따라 다를 수 있습니다. 가장 일반적으로 사용되는 두 가지 경우는 시스템 프로퍼티 프로퍼티 파일입니다. 
1. 시스템 프로퍼티 (System Properties) 
시스템 프로퍼티는 자바 애플리케이션 실행 시 JVM에 의해 관리되는 키-값 쌍의 설정 정보입니다. 이들은 보통 애플리케이션의 동작을 제어하거나 특정 환경 정보를 제공하는 데 사용됩니다.

⦁ 예시:
String osName = System.getProperty("os.name"); 
String userHome = System.getProperty("user.home");​

 

⦁ 설정 방법**: 시스템 프로퍼티는 자바 애플리케이션을 실행할 때 `-D` 옵션을 사용하여 설정할 수 있습니다.
java -DmyProperty=myValue MyApp​

 

⦁ 활용 예: 운영체제 이름, 사용자 홈 디렉토리 위치, 자바 클래스 패스 등의 정보를 가져올 때 사용됩니다. 

2. 프로퍼티 파일 (Properties File)
`Properties` 파일은 자바 애플리케이션에서 자주 사용되는 구성 설정을 저장하는 데 사용되는 파일 형식입니다. 이 파일은 일반적으로 `.properties` 확장자를 가지며, 키-값 쌍으로 이루어져 있습니다. 자바에서 `java.util.Properties` 클래스를 사용하여 이 파일을 쉽게 로드하고 사용할 수 있습니다. 
- **예시** (`config.properties` 파일): ``` db.url=jdbc:mysql://localhost:3306/mydb db.user=root db.password=secret ``` -
**로드 및 사용**: ```java Properties prop = new Properties(); try (InputStream input = new FileInputStream("config.properties")) { prop.load(input); String dbUrl = prop.getProperty("db.url"); String dbUser = prop.getProperty("db.user"); String dbPassword = prop.getProperty("db.password"); } catch (IOException ex) { ex.printStackTrace(); } ``` 
- **활용 예**: 데이터베이스 연결 설정, 애플리케이션 구성 정보, 국제화(i18n) 메시지 등을 외부화하여 코드와 분리된 형태로 관리할 수 있습니다. 

### 요약 
- **시스템 프로퍼티**: JVM에 의해 관리되는 키-값 쌍으로, 운영체제 정보, JVM 설정 등을 포함하며, `System.getProperty()` 메서드를 통해 접근할 수 있습니다. 
- **프로퍼티 파일**: 애플리케이션 설정을 키-값 쌍으로 저장하는 파일 형식으로, `java.util.Properties` 클래스를 통해 쉽게 로드하고 사용할 수 있습니다. 이러한 `Property`들은 자바 애플리케이션의 유연성과 확장성을 높여주는 중요한 역할을 합니다.

 

org.codehaus.mojo

org.codehaus.mojo는 Maven 플러그인과 관련된 다양한 프로젝트를 관리하는 조직 중 하나입니다. 이 조직은 Maven 프로젝트의 빌드 프로세스를 확장하고 개선하는 데 사용되는 여러 유용한 플러그인을 제공합니다. 

주요 특징 
1. 플러그인 제공: org.codehaus.mojo는 여러 가지 Maven 플러그인을 제공하는데, 이들 플러그인은 Maven 빌드 주기를 확장하거나 특정 작업을 자동화하는 데 사용됩니다. 예를 들어, exec-maven-plugin은 자바 프로그램을 실행하거나 다른 명령을 실행하는 데 사용되며, sql-maven-plugin은 데이터베이스와 관련된 작업을 Maven 빌드 프로세스에 통합할 수 있게 해줍니다. 

2. 오픈 소스: org.codehaus.mojo가 제공하는 플러그인들은 오픈 소스 프로젝트의 일환으로 개발되며, 커뮤니티에서 활발하게 유지 보수되고 있습니다. 

3. 다양한 플러그인: org.codehaus.mojo 그룹 ID 아래에는 수많은 Maven 플러그인이 있으며, 이들은 다양한 빌드 관련 작업을 지원합니다. 예를 들어, 코드 품질 도구와의 통합, 문서 생성, 테스트 데이터베이스 설정 등 많은 기능을 포함합니다. 

 

예시 플러그인

  • exec-maven-plugin: 자바 메인 클래스를 실행하거나 시스템 명령을 실행하는 데 사용됩니다. 이를 통해 빌드 과정에서 실행이 필요한 프로그램을 실행할 수 있습니다.
  • sql-maven-plugin: SQL 스크립트를 실행하거나 데이터베이스 작업을 자동화하는 데 사용됩니다. 데이터베이스 생성, 테이블 생성, 데이터 삽입 등을 Maven 빌드 주기에 통합할 수 있습니다.

이러한 플러그인들은 Maven을 사용하는 프로젝트에서 다양한 작업을 자동화하고, 복잡한 빌드 프로세스를 단순화하는 데 매우 유용합니다. org.codehaus.mojo는 특히 커뮤니티가 필요로 하는 다양한 기능을 제공하여 Maven 생태계의 중요한 부분을 구성합니다.

 

자바에서 **아티팩트(Artifact)**란 소프트웨어 개발 과정에서 생성된 결과물이나 산출물을 의미합니다. 주로 빌드 프로세스의 결과물로서 소프트웨어의 실행에 필요한 파일이나 라이브러리들을 포함합니다. 아티팩트는 다양한 형태로 존재할 수 있으며, 다음과 같은 것들이 포함됩니다:

 

1. JAR 파일 (Java ARchive)

 

JAR 파일은 자바 클래스 파일과 메타데이터를 포함하는 패키지 파일입니다. 실행 가능한 JAR 파일은 메인 클래스와 함께 애플리케이션을 실행할 수 있는 정보를 포함합니다.

예: myapp.jar

 

2. WAR 파일 (Web Application Archive)

 

WAR 파일은 웹 애플리케이션을 배포하기 위해 사용됩니다. 서블릿, JSP 파일, HTML, 자바스크립트, CSS 등 웹 애플리케이션의 모든 구성 요소를 포함합니다.

예: myapp.war

 

3. EAR 파일 (Enterprise Archive)

 

EAR 파일은 엔터프라이즈 애플리케이션을 배포하기 위해 사용됩니다. EJB 모듈, 웹 모듈, 자바 애플리케이션 클라이언트 모듈 등 다양한 자바 EE 구성 요소를 포함할 수 있습니다.

예: myapp.ear

 

4. 클래스 파일

 

클래스 파일은 자바 소스 파일을 컴파일한 결과로 생성됩니다. 이 파일들은 자바 가상 머신(JVM)에서 실행될 수 있는 바이트코드를 포함합니다.

예: MyClass.class

 

5. 라이브러리 (Library)

 

라이브러리는 다른 애플리케이션에서 재사용할 수 있는 자바 클래스 및 API를 포함하는 JAR 파일입니다. 일반적으로 오픈 소스 라이브러리나 상용 라이브러리로 제공됩니다.

예: commons-lang3-3.12.0.jar

 

6. 문서 (Documentation)

 

문서는 소프트웨어의 사용법이나 API 문서와 같은 정보를 포함할 수 있습니다. Javadoc으로 생성된 API 문서가 여기에 해당합니다.

예: apidocs.zip

 

7. 구성 파일 (Configuration Files)

 

구성 파일은 애플리케이션이 실행될 때 필요한 설정 정보를 포함합니다. 예를 들어, application.properties 또는 log4j.xml 같은 파일입니다.

 

아티팩트 관리

 

리포지토리: 아티팩트는 일반적으로 리포지토리에 저장됩니다. Maven Central, JFrog Artifactory, Nexus Repository 같은 중앙 저장소를 통해 관리되고 배포됩니다.

버전 관리: 아티팩트는 버전 관리를 통해 관리됩니다. 이는 다양한 버전의 아티팩트를 식별하고, 필요한 버전을 사용할 수 있게 해줍니다.

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유