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 사용법
- 직접 package 주소를 명시: java.util.Collections.sort(list1);
- Import: import java.util.*; -> Copllections.sort(list);
- 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
- clean
- 프로젝트를 정리하고, 이전 빌드에서 생성된 모든 파일을 제거 -> project_root/target 삭제.
- validate
- 프로젝트 상태를 점검하고, 필드에 필요한 정보의 존재 여부를 체크.
- 프로젝트의 POM 및 구성을 검증.
- compile
- test
- package
- 프로젝트에 대한 JAR(Java ARchive) 또는 WAR(Web Archive)파일을 생성하여 배포할 수 있는 형식으로 변환.
- verify
- 패키지가 품질 기준이 적합한지 검사.
- install
- 패키징된 JAR/WAR 파일을 로컬 저장소에 배포.
- site
- 프로젝트 문서를 생성.
- 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>'에 포함된 의존관계로 대체됨.
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 |