Java

[Java] Maven (메이븐)

Joo.v7 2024. 9. 11. 21:30

1. JSON과 XML

2. Package와 jar

 

3. Maven


1. JSON과 XML

공통점

  • 데이터를 저장하고 전달하기 위해 고안됨.
  • 기계뿐만 아니라 사람도 쉽게 읽을 수 있다.
  • 계층적인 데이터 구조를 가진다.
  • 다양한 프로그래밍 언어에 의해 파싱될 수 있다.
  • XMLHttpRequest 객체를 이용하여, 서버로부터 데이터를 전송받을 수 있다.

XML (Extensible Markup Language)

<member>
    <name>마르코</name>
    <id>marco<id>
    <age>31</age>
    <weight>70</weight>
</member>

JSON (Java Script Object Notation)

/* "name":"value", "name2:value2" */
{
    "name": "마르코",
    "id": "marco",
    "age": 31,
    "weight": 70
}

 

2. Package와 jar

Package

  • Class들의 모음.
  • 고유성: 이름이 같은 서로 다른 목적의 클래스를 생성해도, 서로 다른 패키지를 사용함으로써 충돌을 피함.
  • 최상위 패키지명은 도메인 주소를 앞뒤로 바꿔서 사용한다. ex) com.nhnacademy.study ...
  • GSON: json관련해서 google에서 제공해주는 라이브러리.
package com.google.gson;

public final class Gson {
 //...
}
  • 폴더 형식의 package구조: Springframework 패키지구조, 폴더 구조 형태로 계층적으로 구성.

  • package 사용법
    1. 직접 package 주소를 명시: java.util.Collections.sort(list1);
    2. Import: import java.util.*; -> Copllections.sort(list);
    3. Static Import: import static java.util.Collections.*; -> 특정 클래스의 static을 직접 사용 sort(list);

 

jar

  • Java에서 제공하는 압축 파일, zip 압축
  • class 파일, resource(text, img) 등등 메타 데이터를 하나로 모아서 Java 플랫폼의 응용SW/lib를 배포하기 위한 SW 패키지 파일.
  • 컴파일된 class 파일을 jar로 묶어서 배포하면, 경로나 파일의 위치에 상관없이 프로그램 실행 가능.
  • http://mavenrepository.com 에서 제공하는 다양한 오픈소스 라이브러리들을 Maven, Gradle을 통해 추가 

 

3. Maven

빌드 도구

  • SW 개발에 있어서 source code를 실행할 수 있는 application으로 만들어주는 도구.

참조: https://www.browserstack.com/guide/build-tools

 

What is a Build Tool? (with Top 5 Build Tools) | BrowserStack

Learn how build tools allow programmers to focus on creating code as well as providing high-quality software efficiently and affordably.

www.browserstack.com

 

Maven

  • Java의 대표적인 Build Tool 중 하나.
  • apache 재단에서 개발하는 오픈소스로 apache ant의 후속작.
  • XML을 사용하여 빌드 파일을 기술.
  • 중앙 저장소를 이용한 편리한 의존 관계 라이브러리 관리.
    (중앙 저장소: maven에서 이용할 수 있는 라이브러리를 모아서 관리하는 웹 서비스 -> https://mvnrepository.com/ )
  • 장점
    • 편리한 의존 관계 라이브러리 관리
    • 일관된 디렉토리 구조와 빌드 프로세스 관리
    • 다양한 플러그인
  • 단점
    • maven에서 기본적으로 지원하지 않는 빌드 과정 추가가 복잡해진다.
    • 플러그인의 설정이 상이하거나 장황해지면 재사용성 및 확장성이 떨어진다.

 

Project Structure

  • 일관된 프로젝트 구조
  • src/main/java: project source code
  • src/main/test: project test code
  • pom.xml: Project Object Model
my-app
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── nhnacademy
    │               └── app
    │                   └── App.java
    └── test
        └── java
            └── com
                └── nhnacademy
                    └── app
                        └── AppTest.java

 

POM

더보기
<?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>com.nhnacademy.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

 

Maven Archetype Plugin

  • Maven에서 제공하는 도구로, 사용자가 미리 정의된 템플릿인 'Archetype'을 기반으로 새로운 Maven 프로젝트를 생성하도록 도와주는 기능.
  • Archetype List: https://maven.apache.org/archetypes

 

Life Cycle

  1. clean
    • 프로젝트를 정리하고, 이전 빌드에서 생성된 모든 파일을 제거 -> project_root/target 삭제.
  2. validate
    • 프로젝트 상태를 점검하고, 필드에 필요한 정보의 존재 여부를 체크.
    • 프로젝트의 POM 및 구성을 검증.
  3. compile
  4. test
  5. package
    • 프로젝트에 대한 JAR(Java ARchive) 또는 WAR(Web Archive)파일을 생성하여 배포할 수 있는 형식으로 변환.
  6. verify
    • 패키지가 품질 기준이 적합한지 검사.
  7. install
    • 패키징된 JAR/WAR 파일을 로컬 저장소에 배포.
  8. site
    • 프로젝트 문서를 생성.
  9. deploy
    • 프로젝트를 컴파일, 테스트, 빌드 후 패키징된 JAR/WAR 파일을 원격 저장소(remote)에 복사.

 

pom.xml

  • POM (Project Object Model)
    • Maven의 기본 작업 단위.
    • Maven이 프로젝트를 빌드하는 데 사용하는 프로젝트 및 구성에 대한 세부 정보가 포함된 XML 파일.

 

주요 Tag

  • <project>
    • Maven의 XML Namespace를 지정.
  • <modelVersion>
    • Maven의 model Version
  • <groupId>
  • <artifactId>
  • <name>
    • project 이름.
  • <url>
    • 프로젝트 정보를 다른 사람들이 찾을 수 있도록 안내.
    • 프로젝트 관련된 문서, 소스코드(git)등 관련된 정보를 제공.
  • <properties>
    • 프로젝트에서 사용할 공통 속성.
  • <dependencies>
    • 프로젝트가 참조하고 있는 라이브러리.
더보기
<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>
    <url>https://github.com/nhn-academy-marco/nhn-academy-dev-settings</url>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.13</version>
        <relativePath/>
    </parent>
    <groupId>com.nhnacademy</groupId>
    <artifactId>maven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>maven-study</name>
    <description>Manven 기반 환경설정</description>
    <properties>
        <java.version>11</java.version>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <jacoco.version>0.8.8</jacoco.version>
        <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
        <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
        <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
        <sonar.language>java</sonar.language>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        ...

 

Plugin 관리

  • Maven에서 주로 사용하는 clean, compile, package ... 등의 goal 명령어들도 사실상 plugin으로 내장되어 있다.
더보기
<plugin>
  <artifactId>maven-clean-plugin</artifactId>
  <version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.0.2</version>
</plugin>
<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.0</version>
</plugin>
<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.22.1</version>
</plugin>
<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.0.2</version>
</plugin>
<plugin>
  <artifactId>maven-install-plugin</artifactId>
  <version>2.5.2</version>
</plugin>
<plugin>
  <artifactId>maven-deploy-plugin</artifactId>
  <version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
  <artifactId>maven-site-plugin</artifactId>
  <version>3.7.1</version>
</plugin>
<plugin>
  <artifactId>maven-project-info-reports-plugin</artifactId>
  <version>3.0.0</version>
</plugin>

 

Standard Directory Layout

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

 

Maven – Introduction to the Standard Directory Layout

Introduction to the Standard Directory Layout Having a common directory layout allows users familiar with one Maven project to immediately feel at home in another Maven project. The advantages are analogous to adopting a site-wide look-and-feel. The next s

maven.apache.org

 

Dependency Scope

  • compile
    • default scope
  • provided
    • 모든 상황에 포함되어 수행되지만, package 단계에서 포함되지 않는다. (배포 환경에서 이 lib는 이미 제공되고 있음)
  • runtime
    • compile시 불필요하지만, runtime시 필요할 경우.
  • test
    • test시에만 사용.
    • junit과 같은 테스트 프레임워크는 일반적으로 test 스코프를 사용하여 설정. (오직 단위 테스트 수행시에만 필요해서)
  • system
    • maven의 central repository를 사용하지 않고, system내의 특정 path를 지정해서 참조.
  • import
    • '<dependency Management>'에 포함된 의존관계로 대체됨.
      (특정 lib 버전을 개별 모듈에서 명시하지 않고, dependencyManagement에서 중앙에서 관리된 버전을 사용)

 

Dependency Management

  • Junit5
    • Junit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
  • JUnit Platform
    • JUnit 테스트를 실행하고, 테스트 엔진과 통신하기 위한 인프라를 제공.
    • 테스트 실행, 확장, 리프팅 등의 기능을 담당.
  • JUnit Jupiter
    • JUnit 5에서 도입된 새로운 테스트 프레임워크.
    • JUnit 5의 주요 기능으로, 다양한 테스트 유형을 지원하고 확장할 수 있는 테스트 API를 제공 ex) @Test, @Display
  • JUnit Vintage
    • JUnit 4 및 이전 버전과 호환성을 제공하기 위한 모듈
  • BOM (Bill Of Materials)
    • 프로젝트나 라이브러리에서 사용되는 dependency 버전을 관리하는 데 도움을 주는 메커니즘.
    • Maven 프로젝트에서 여러 모듈 또는 하위 프로젝트 간에 공유되는 의존성의 버전을 일관되게 유지해줌.

 


 

 

출처: https://github.com/nhnacademy-bootcamp/java-dev-settings/tree/main/docs/06.maven

'Java' 카테고리의 다른 글

[Java] Java에서의 Stream (스트림)  (0) 2024.09.12
[Java] Java Logging  (0) 2024.09.11
[Java] 14. Collections Framework  (0) 2024.09.02
[Java] 13. Anotation(어노테이션)  (0) 2024.09.02
[Java] 12. Lambda Expression(람다식)  (2) 2024.09.01