Maven

Moom2n·2024년 4월 15일
0

Java

목록 보기
26/26

1. JSON 과 XML

- 공통점

  • 데이터를 저장하고 전달하기 위해 고안되었습니다.

  • 기계뿐만 아니라 사람도 쉽게 읽을 수 있습니다.

  • 계층적인 데이터 구조를 가집니다.

  • 다양한 프로그래밍 언어에 의해 파싱 될 수 있습니다.

  • XMLHttpRequest 객체를 이용하여 서버로부터 데이터를 전송받을 수 있습니다

- XML

  • 하나의 마크업 언어
  • 여는 태그와 닫는 태그가 있으며, 속성값들이 사이에 존재한다.
<member>
    <name>마르코</name>
    <id>marco<id>
    <age>31</age>
    <weight>70</weight>
</member>

JSON

{
    "name": "마르코",
    "id": "marco",
    "age": 31,
    "weight": 70
}

2. 패키지와 jar

- 패키지

  • 클래스들의 모음
  • package를 사용하는 이유는 클래스명의 고유성을 보장하기 위해서 사용한다.
  • 만약 다른 java프로그래머가 협업과정에서 서로 다른 목적을 가진 클래스를 생성 했는데 이름이 같다고 가정할 때, 서로 다른 패키지를 사용함으로써 충돌을 피할 수 있다.
package com.google.gson;

public final class Gson {
 //...
}

//이후 사용시 
import com.google.gson.*;
  • 폴더 구조 형태로 계층적으로 구성되어 있다.

- jar

  • 클래스 파일, 리소스(텍스트, 이미지) 등을 묶은 압축파일
  • 컴파일된 class 파일을 jar 묶어서 배포하면 , 경로나 파일의 위치에 상관없이 프로그램 실행 가능
  • https://mvnrepository.com/
    사이트에서 다운로드 또는 XML 코드 환경설정으로 이용가능

- 실습

  • No build tools 로 Hello 프로젝트 생성

  • settings.json 확인

  • package 설정

  1. src 폴더 내에 폴더 만들기
  2. package 명시
package com.nhnacademy.hello;
  • hello 패키지의 Main.java compile

    javac ./src/com/nhnacademy/hello/*.java -d ./bin

  • bin 폴더로 이동해 .jar 파일 생성하기

    jar --file hello.jar --main-class com.nhnacademy.hello.Main -c ./com

  • jar 파일로 실행하기

    java -jar hello.jar

  • jar 파일의 내용확인

    jar -tf hello.jar

  • jar 압축풀기

    unzip hello.jar

  • No build toolscalculator 프로젝트 생성

  • package 설정

  1. src 폴더 내에 폴더 만들기
  2. package 명시
  • hello.util 패키지의 Calculator.java 컴파일

    javac ./src/com/nhnacademy/hello/util/*.java -d ./bin

  • bin 폴더로 이동해 .jar 파일 생성하기

    jar --file calculator.jar -c ./com

  • hello 패키지의 Main.java 수정하기

  • hello 패키지의 Main.java 컴파일

  1. Calculator 프로젝트의 bin 폴더에 있는 calculator.jar 파일을 Hello 프로젝트의 lib 폴더에 복사한다.

javac ./src/com/nhnacademy/hello/*.java -d ./bin --class-path ./lib/calculator.jar

  • bin 폴더로 이동해 hello 패키지의 hello.jar 만들기

    jar --file hello.jar --main-class com.nhnacademy.hello.Main -c ./com

  • jar 실행하기

  1. hello.jar 안에 calculator.jar 가 같이 묶이지 않는다. 고로 따로 경로를 지정해주어야 한다

java -cp "./hello.jar:../lib/calculator.jar" com.nhnacademy.hello.Main


3. Maven

- 빌드 도구

  • 소프트웨어 개발에 있어서 소스 코드를 실행할 수 있는 애플리케이션으로 만들어 주는 도구

  • 빌드 도구는 반복적이고 오류가 발생하기 쉬운 활동을 자동화하여 생산성 일관성 및 의존성을 개선합니다.

  • 빌드 도구는 소프트웨어 개발 과정의 핵심 부분으로, 소프트웨어 응용 프로그램의 building 및 Depoly(배포)를 빠르고 효율적으로 수행하기 위한 다양한 중요한 특성과 기능을 제공합니다.

  • 자동화
    빌드 도구는 루틴한 작업을 자동화하여 수동 참여와 오류를 제거합니다. 이는 복잡한 프로젝트에서 작업하거나 코드를 자주 수정하는 경우에 유용합니다.

  • 일관성
    빌드 도구는 지정된 빌드 프로세스를 엄격히 준수하여 다양한 개발 환경 및 플랫폼에서 재현 가능한 결과를 보장합니다. 따라서 잘못된 구성으로 인한 소프트웨어 배포 문제가 줄어듭니다.

  • 의존성 관리
    외부 라이브러리와 프레임워크의 요구 사항을 처리함으로써 프로젝트에 타사 코드를 포함하기가 더욱 간단해집니다. 이들은 의존성을 자동으로 다운로드, 관리 및 변경하여 개발 프로세스를 간소화할 수 있습니다.

  • 작업 병렬 처리
    많은 빌드 도구는 여러 작업을 동시에 실행하여 빌드 시간을 줄이고 생산성을 높일 수 있습니다. 이는 많은 부분으로 구성된 대형 프로젝트에 유용합니다.

  • 점진적 빌드
    빌드 도구를 사용하면 점진적인 빌드가 가능해져 시간과 자원을 절약할 수 있습니다. 전체 애플리케이션을 다시 컴파일하는 대신 소스 코드의 변경 사항을 감지하고 영향을 받은 부분만 다시 컴파일합니다.

  • CI/CD 통합
    빌드 도구는 CI/CD 파이프라인과 투명하게 통합되어 개발자에게 완전한 빌드 및 배포 프로세스 자동화를 지원합니다. 이 동기화로 인해 지속해서 통합하고 업데이트를 본문 설정에 계속 배포함으로써 신뢰성 있는 소프트웨어 전달이 가능해집니다.

  • 코드 컴파일
    빌드 도구는 소스 코드를 이진 실행 파일이나 중간 표현으로 변환하는 과정을 말합니다. 이 과정은 개발 단계에서 구문 오류 및 기타 문제를 감지하는데 도움이 됩니다.

  • 테스트 및 품질 보증
    빌드 프로세스의 일부로 자동화된 테스트를 실행하여 새로운 기능과 코드 수정이 문제를 일으키지 않도록 하고 코드가 수립된 품질 기준을 충족하는지 확인할 수 있습니다.

  • 호환성 및 확장성
    이러한 도구는 다양한 언어, 프레임워크 및 운영 체제와 호환됩니다. 플러그인이나 직접 작성한 스크립트와 같은 새로운 기능을 추가하여 프로젝트 요구 사항에 맞게 수정할 수 있습니다.

  • 배포 및 패키징
    빌드 도구는 소프트웨어를 최종 사용자나 다른 그룹에 전달하기 쉽게 만들어 주며 배포할 수 있는 형식으로 패키징하는 과정을 도와줍니다.

빌드 도구 종류 및 차이점

  • make
    -- 원조 빌드 툴
    -- 주로 c/c++를 위해 사용
    -- Makefile을 통한 통일된 구조 제공

  • ant
    -- Java를 위한 빌드 툴
    -- XML 파일을 통해 빌드 내용을 기술
    -- make의 플랫폼 의존 문제를 해결
    -- 복잡한 처리를 하려면 빌드 스크립트가 장황해지는 단점
    -- 라이브러리 의존 관계를 관리하는 구조의 부재

  • maven
    -- ant의 후속으로 ant의 문제점을 해결하기 위해 개발
    -- ant와 마찬가지로 XML 파일을 통해 빌드 내용을 기술
    -- 빌드 라이프사이클과 POM(프로젝트 객체 모델) 개념 도입
    -- 라이브러리 관리를 위해 메이븐 중앙 저장소 제공

  • gradle
    -- groovy나 kotlin과 같은 스크립트 언어를 통해 빌드 내용을 기술
    -- DSL(Domain Specific Language) 제공
    -- 현재 안드로이드 앱을 만드는 데 필요한 안드로이드 스튜디오의 공식 빌드 시스템
    -- 메이븐 중앙 저장소를 동일하게 사용할 수 있음


- Maven 이란?

  • Java의 대표적인 빌드 툴(Build Tool) 중 하나
  • apache 재단에서 개발하는 오픈소스 https://maven.apache.org/
  • apache ant의 후속으로 개발
  • XML을 사용하여 빌드 파일을 기술
  • 중앙 저장소를 이용한 편리한 의존 관계 라이브러리 관리
  • 중앙 저장소: 메이븐에서 이용할 수 있는 라이브러리를 모아서 관리하는 웹 서비스

장점

  • 편리한 의존 관계 라이브러리 관리

  • 일관된 디렉토리 구조와 빌드 프로세스 관리

  • 다양한 플러그인

단점

  • maven에서 기본적으로 지원하지 않는 빌드 과정 추가가 복잡해짐

  • 플러그인의 설정이 상이하거나 장황해지면 재사용성 및 확장성이 떨어짐


- 프로젝트 생성

mvn -B archetype:generate -DgroupId=com.nhnacademy.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
  • -B : batch Mode, Interactive 한 입력이나 진행 상황 표시 없이 명령어를 실행

  • archetype:generate : 미리 정의된 템플릿을 기반으로 새로운 프로젝트를 생성

  • -DgroupId=com.nhnacademy.app : Project의 그룹 ID

  • (ex) nhnacademy.com → com.nhnacademy

  • -DartifactId=my-app : 프로젝트의 artifact ID

  • artifact 사전적 의미 : 인공물, 공예품, 인공 유물, 인공 산물

  • Project를 식별할 수 있는 ID

  • -DarchetypeArtifactId=maven-archetype-quickstart

  • maven-archetype-quickstart 이라는 archetype을 사용하여 프로젝트를 생성

  • 빠르게 시작할 수 있는 간단한 Java 프로젝트 템플릿을 제공합니다.

  • -DarchetypeVersion=1.4 archetype version


Maven Archetype Plugin

  • Maven에서 제공하는 도구 중 하나로, 사용자가 미리 정의된 템플릿인 Archetype을 기반으로 새로운 Maven 프로젝트를 생성하도록 도와주는 기능을 제공

  • Archetype 기반 프로젝트 생성

  • 미리 정의된 아키타입 템플릿을 선택하여 프로젝트를 생성할 수 있습니다.

  • 프로젝트의 구조, 의존성, 설정 등을 편리하게 설정할 수 있습니다.

  • 기존 Project에서 Archetype 생성

  • 이미 개발한 Project를 Archetype으로 변환하여 나중에 유사한 요구사항을 가진 프로젝트에 재사용할 수 있습니다.


Java 11 환경을 구성한다면

  • compiler.source 11로 변경

  • Maven-compiler-plugin >= 3.6.0

  • mvn package 실행

    mvn package

  • 버전 확인

cd target/classes/com/nhnacademy/app
javap -verbose App.class | grep "major version"


- Life Cycle

  • clean
    프로젝트를 정리하고 이전 빌드에서 생성된 모든 파일을 제거합니다.
    project_root/target 삭제합니다.

  • validate
    프로젝트의 상태를 점검하고, 필드에 필요한 정보의 존재 여부를 체크합니다.
    프로젝트의 POM 및 구성을 검증합니다.

  • compile
    프로젝트의 소스 코드를 컴파일합니다.

  • test
    프로젝트에 대한 테스트를 실행합니다.

  • package
    프로젝트에 대한 JAR(Java ARchive) 또는 WAR(Web Archive) 파일을 생성하여 배포할 수 있는 형식으로 변환합니다.

  • verify
    패키지가 품질 기준에 적합한지 검사합니다.

  • install
    패키징된 JAR/WAR 파일을 로컬 저장소에 배포합니다.

  • site
    프로젝트 문서를 생성합니다.

  • deploy
    프로젝트를 컴파일, 테스트, 빌드패키징된 JAR/WAR 파일을 원격 저장소에 복사합니다.


- pom.xml

POM 이란?

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

주요 Tag

  • <project>
    Maven의 XML Namespace를 지정합니다.

  • <modelVersion>
    Maven의 model Version

  • <groupId>
    group id

  • <artifactId>
    artifact id

  • <name>
    project 이름

  • <url>
    -- 프로젝트 정보를 다른 사람들이 프로젝트에 대한 자세한 정보를 찾을 수 있도록 안내
    -- 프로젝트 관련된 문서, 소스코드(git)등 관련된 정보를 제공

  • <properties>
    프로젝트에서 사용할 공통 속성

  • <dependencies>
    프로젝트가 참조하고 있는 라이브러리


실습 1. 1부터 100까지 난수 생성

  • Java.util.Random 사용
  • Apache Commons Math의 org.apache.commons.math3.random.RandomDataGenerator를 이용한 random 생성
  • project 생성

mvn -B archetype:generate -DgroupId=com.nhnacademy.app -DartifactId=random -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

  • 의존성 추가 및 컴파일러 버전 Java 11로 변경

  • 소스 코드 작성

  • 실행
  1. 생성되는 jar 파일에 org.apache.commons.math3.random.RandomDataGenerator 클래스를 포함 시키기 위해 build 속성 변경

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.nhnacademy.app.RandomExample</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- 여기에 다른 플러그인 구성을 포함할 수 있습니다. -->
    </plugins>
    <pluginManagement>
      <!-- pluginManagement 내 플러그인 버전 관리 설정 -->
    </pluginManagement>
</build>

mvn compile

mvn package

이후 target 폴더에 random-1.0-SNAPSHOT.jar 생성됨

  1. jar 파일로 실행하기

실습 2. 문자열의 Null 또는 빈 문자열 체크

  • Objects.isNull , java.lang.String.isEmpty() 사용

  • Apache Commons Lang 3.x 의 org.apache.commons.lang3.StringUtils.isEmpty()를 이용한 empty 체크

  • project 생성

mvn -B archetype:generate -DgroupId=com.nhnacademy.app -DartifactId=null-check -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

  • 의존성 추가 및 컴파일러 버전 11로 변경

  • 소스 코드 작성

  • 실행
  1. 생성되는 jar 파일에 org.apache.commons.lang3.StringUtils 클래스를 포함시키기 위해 build 속성 수정

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.nhnacademy.app.StringCheck</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  1. 컴파일 및 패키징

  2. jar 파일로 실행


실습 3. moives.csv 파일 파싱하기

  • 프로젝트 생성

mvn -B archetype:generate -DgroupId=com.nhnacademy.app -DartifactId=movies -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

  1. 의존성 추가

  2. 클래스 작성

package com.nhnacademy.app;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

public class ApacheCommonsCsvMovieParser implements MovieParser {
    BufferedReader br = new BufferedReader(new InputStreamReader(getMovieFileAsStream()));
    List<Movie> moiveList = new ArrayList<>();

    @Override
    public List<Movie> parse() throws IOException {
        CSVParser parser = CSVParser.parse(br, CSVFormat.EXCEL);

        List<CSVRecord> csvRecordList = parser.getRecords();
        
        for(int record_i=1; record_i<csvRecordList.size(); record_i++){
            CSVRecord csvRecord = csvRecordList.get(record_i);
        
            long movieId = Long.parseLong(csvRecord.get(0));
            String title = csvRecord.get(1);
            Set<String> genres =  Arrays.stream(csvRecord.get(2).split("\\|")).collect(Collectors.toSet());
            moiveList.add(new Movie(movieId, title, genres));
        }

        return moiveList;
    }
}
  • MovieMain.java (main) 작성

실행 가능한 jar 만들기 1

-- maven-dependency-plugin
-- 필요한 모든 dependency를 ${project.build.directory}/libs에 복사합니다.
-- maven-jar-plugin

Manifest-Version: 1.0
Created-By: Apache Maven 3.9.4
Built-By: nhn
Build-Jdk: 11.0.18
Class-Path: libs/commons-math3-3.6.1.jar libs/commons-lang3-3.13.0.jar libs/commons-csv-1.10.0.jar
Main-Class: com.nhnacademy.app.movie.MovieMain

-- pom.xml 수정

<build>
    <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <executions>
            <execution>
              <id>copy-dependencies</id>
              <phase>prepare-package</phase>
              <goals>
                <goal>copy-dependencies</goal>
              </goals>
              <configuration>
                <outputDirectory>
                  ${project.build.directory}/libs
                </outputDirectory>
              </configuration>
            </execution>
          </executions>
      </plugin>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <archive>
              <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>
                  com.nhnacademy.app.MovieMain
                </mainClass>
              </manifest>
            </archive>
          </configuration>
      </plugin>
    </plugins>
</build>
  • ./target/libs 폴더 내 .jar 파일들 추가됨
  • 실행결과 1

실행 가능한 jar 만들기 2 (Shade, uber-jar, fat-jar)

-- uber는 독일어로 above (… 보다위에, …를 넘는) or over(… 위에)를 의미합니다.
-- 즉 uber-jar는 하나의 jar 파일에 package의 모든 dependency를 포함합니다.

-- pom.xml 수정

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <shadedArtifactAttached>true</shadedArtifactAttached>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.nhnacademy.app.MovieMain</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  • 실행결과 2


- Standard Directory Layout

  • src/main/java
    Application/Library sources

  • src/main/resources
    Application/Library resources

  • src/main/filters
    Resource filter files

  • src/main/webapp
    Web application sources

  • src/test/java
    Test sources

  • src/test/resources
    Test resources

  • src/test/filters
    Test resource filter files

  • src/it
    Integration Tests (primarily for plugins)

  • src/assembly
    Assembly descriptors

  • src/site
    프로젝트의 문서나 기타 리포팅 정보를 빌드시 자동으로 생성

  • LICENSE.txt
    Project’s license

  • NOTICE.txt
    Notices and attributions required by libraries that the project depends on

  • README.txt
    Project’s readme


- Dependency Scope

  • compile
    -- default scope
    -- 모든 상황에 포함됩니다.

  • provided
    -- compile과 유사하게 모든 상황에 포함되어 수행되지만 package단계에서 포함하지 않습니다.
    -- 즉 배포환경(실행환경)에서 해당 Library를 제공합니다.

  • runtime
    -- compile시 불필요하지만 runtime시 필요할 경우.
    -- 즉 runtime 및 test할 때 classpath에 추가 되지만, compile시 추가 되지 않음

  • test
    -- test시에만 사용합니다.
    -- junit

  • system
    -- provided와 유사하지만 maven의 central repository를 사용하지 않습니다.
    --즉 system내의 특정 path를 지정하여 참조.


- Dependency Management

  • Junit5
    -- JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

  • JUnit Platform
    -- JUnit 테스트를 실행하고 테스트 엔진과 통신하기 위한 인프라를 제공합니다. 테스트 실행, 확장, 리포팅 등의 기능을 담당합니다.

  • JUnit Jupiter
    -- JUnit 5에서 도입된 새로운 테스트 프레임워크입니다. Jupiter는 JUnit 5의 주요 기능으로서 다양한 테스트 유형을 지원하고, 확장할 수 있는 테스트 API를 제공합니다. @Test, @Display ,@BeforeEach, @AfterEach

  • JUnit Vintage
    -- JUnit 4 및 이전 버전과 호환성을 제공하기 위한 모듈입니다. 이전에 작성된 JUnit 4 스타일의 테스트 코드를 JUnit 5 플랫폼에서 실행할 수 있도록 도와줍니다.

  • BOM (Bill Of Materials)
    -- 프로젝트나 라이브러리에서 사용되는 dependency 버전을 관리하는 데 도움을 주는 메커니즘입니다. Maven BOM은 Maven 프로젝트에서 여러 모듈 또는 하위 프로젝트 간에 공유되는 의존성의 버전을 일관되게 유지하기 위해 사용되는 특별한 종류의 POM 파일입니다.

<dependencies>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit</groupId>
            <artifactId>junit-bom</artifactId>
            <version>5.10.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

0개의 댓글

관련 채용 정보