데이터를 저장하고 전달하기 위해 고안되었습니다.
기계뿐만 아니라 사람도 쉽게 읽을 수 있습니다.
계층적인 데이터 구조를 가집니다.
다양한 프로그래밍 언어에 의해 파싱 될 수 있습니다.
XMLHttpRequest 객체를 이용하여 서버로부터 데이터를 전송받을 수 있습니다
<member>
<name>마르코</name>
<id>marco<id>
<age>31</age>
<weight>70</weight>
</member>
{
"name": "마르코",
"id": "marco",
"age": 31,
"weight": 70
}
package com.google.gson;
public final class Gson {
//...
}
//이후 사용시
import com.google.gson.*;
No build tools
로 Hello 프로젝트 생성
settings.json 확인
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 tools
로 calculator
프로젝트 생성
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 컴파일
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 실행하기
java -cp "./hello.jar:../lib/calculator.jar" com.nhnacademy.hello.Main
소프트웨어 개발에 있어서 소스 코드를 실행할 수 있는 애플리케이션으로 만들어 주는 도구
빌드 도구는 반복적이고 오류가 발생하기 쉬운 활동을 자동화하여 생산성 일관성 및 의존성을 개선합니다.
빌드 도구는 소프트웨어 개발 과정의 핵심 부분으로, 소프트웨어 응용 프로그램의 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에서 기본적으로 지원하지 않는 빌드 과정 추가가 복잡해짐
플러그인의 설정이 상이하거나 장황해지면 재사용성 및 확장성이 떨어짐
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
Archetype
을 기반으로 새로운 Maven 프로젝트를 생성하도록 도와주는 기능을 제공Archetype 기반 프로젝트 생성
미리 정의된 아키타입 템플릿을 선택하여 프로젝트를 생성할 수 있습니다.
프로젝트의 구조, 의존성, 설정 등을 편리하게 설정할 수 있습니다.
기존 Project에서 Archetype 생성
이미 개발한 Project를 Archetype으로 변환하여 나중에 유사한 요구사항을 가진 프로젝트에 재사용할 수 있습니다.
compiler.source 11로 변경
Maven-compiler-plugin >= 3.6.0
mvn package
cd target/classes/com/nhnacademy/app
javap -verbose App.class | grep "major version"
clean
프로젝트를 정리하고 이전 빌드에서 생성된 모든 파일을 제거합니다.
project_root/target
삭제합니다.
validate
프로젝트의 상태를 점검하고, 필드에 필요한 정보의 존재 여부를 체크합니다.
프로젝트의 POM 및 구성을 검증합니다.
compile
프로젝트의 소스 코드를 컴파일합니다.
test
프로젝트에 대한 테스트를 실행합니다.
package
프로젝트에 대한 JAR(Java ARchive)
또는 WAR(Web Archive)
파일을 생성하여 배포할 수 있는 형식으로 변환합니다.
verify
패키지가 품질 기준에 적합한지 검사합니다.
install
패키징된 JAR/WAR 파일을 로컬 저장소에 배포합니다.
site
프로젝트 문서를 생성합니다.
deploy
프로젝트를 컴파일
, 테스트
, 빌드
후 패키징된 JAR/WAR 파일
을 원격 저장소에 복사합니다.
<project>
Maven의 XML Namespace를 지정합니다.
<modelVersion>
Maven의 model Version
<groupId>
group id
<artifactId>
artifact id
<name>
project 이름
<url>
-- 프로젝트 정보를 다른 사람들이 프로젝트에 대한 자세한 정보를 찾을 수 있도록 안내
-- 프로젝트 관련된 문서, 소스코드(git)등 관련된 정보를 제공
<properties>
프로젝트에서 사용할 공통 속성
<dependencies>
프로젝트가 참조하고 있는 라이브러리
org.apache.commons.math3.random.RandomDataGenerator
를 이용한 random 생성mvn -B archetype:generate -DgroupId=com.nhnacademy.app -DartifactId=random -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
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
생성됨
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
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>
컴파일 및 패키징
jar 파일로 실행
mvn -B archetype:generate -DgroupId=com.nhnacademy.app -DartifactId=movies -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
movies.csv
파일 복사
컴파일러 버전 변경
Movie.java
작성
MovieParser.java
작성
ApacheCommonsCsvMovieParser.java
작성
Apache Commons CSV 이용해서 구현
https://commons.apache.org/proper/commons-csv/apidocs/index.html 참고
의존성 추가
클래스 작성
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;
}
}
-- 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>
.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>
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
compile
-- default scope
-- 모든 상황에 포함됩니다.
provided
-- compile과 유사하게 모든 상황에 포함되어 수행되지만 package단계에서 포함하지 않습니다.
-- 즉 배포환경(실행환경)에서 해당 Library를 제공합니다.
runtime
-- compile시 불필요하지만 runtime시 필요할 경우.
-- 즉 runtime 및 test할 때 classpath에 추가 되지만, compile시 추가 되지 않음
test
-- test시에만 사용합니다.
-- junit
system
-- provided와 유사하지만 maven의 central repository를 사용하지 않습니다.
--즉 system내의 특정 path를 지정하여 참조.
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>