https://sundaland.tistory.com/51
메이븐은 프로젝트 객체 모델이라는 개념을 바탕으로 프로젝트 의존성 관리, 라이브러리 관리, 프로젝트 생명 주기 관리 기능 등을 제공하는 프로젝트 관리 도구이다. 또한 플러그인을 기반으로 소스 코드로부터 배포 가능한 산출물을 만들어 내는 빌드 기능 뿐만 아니라 레포팅 및 문서 작성 기능 등을 제공한다.
# 자바 빌드 시스템의 업그레이드, 빌드 명세서
메이븐의 장점
- 뛰어난 의존성 관리 : 의존성 자동 업데이트, 저장소를 통한 라이브러리 일괄 관리
- 모든 프로젝트에 걸쳐 쉽게 적용 가능한 일괄적인 사용법
- 라이브러리 및 메타 데이터 저장을 위한 지속적으로 확장되고 있는 저장소
- 쉽게 작성 가능한 플러그 인을 통한 확장성
- 동시에 다수의 프로젝트 핸들링을 할 수 있는 쉬운 설정 기반의 메커니즘
- 간단한 설정을 통한 배포 관리
- 자바, C++ 등 다수의 프로그래밍 언어 지원
메이븐의 단점
- 저장소 관리의 불편함 : 중앙 저장소(자바 오픈소스 라이브러리)가 제공하는 라이브러리가 빠르게 증가하고 있으나, 서드파티 라이브러리 등 미제공 라이브러리들이 있음
- pom.xml 파일 관리 : 메이븐 프로젝트 관리에 대한 모든 내용이 pom.xml에 담기므로 길고 장황해질 수 있음
- 프로젝트에 특화된 복잡한 빌드 기능 제약 : 특성한 SW 빌드에 통용되는 라이프 사이클을 제공하고 있어 세부 항목 또는 특화된 빌드 환경에 대한 지원이 미약하다
메이븐 아키텍쳐
메이븐 프로젝트 전체 내용에 대한 기술 및 설정을 담당하는 POM과 라이브러리(메이븐에선 아티팩트라고 한다) 관리에 대한 dependency/저장소 관리 모델 그리고 컴파일, 테스트, 패키징 등의 빌드 생명주기를 다루는 라이프 사이클 및 관련된 플러그인들과의 연동을 다루는 부분으로 구성된다.
- 프로젝트 객체 모델 : 메이븐 엔진 내장 + POM.xml 파일에서 선언적으로 제공
- 종속성 관리 모델 : 로컬 및 원격 저장소를 이용
- 프로젝트 생명 주기 모듈 : 메이븐 엔진은 플러그인을 통해 파일을 다루는 거의 모든 작업을 수행
프로젝트 객체 모델 (POM)
프로젝트의 세부 데이터 정보를 포함한다. (버전 및 설정 관리, 빌드 환경, 라이브러리 저장소 및 의존성 등)
XML 내용이라 사용하지 않아서 패스
메이븐 저장소
아티팩트들의 저장소로 로컬 및 원격 저장소로 구성되며 프로젝트는 pom.xml에서 선언한 dependency들을 저장소로부터 불러와서 사용한다.
- 메이븐 설치시 로컬에 메이븐 아티팩트를 저장하고 관리하는 저장소가 자동으로 구성된다.
- 메이븐 원격 저장소 : 메이븐에서 제공하는 중앙 저장소와 각 기업 또는 조직에서 제공하고 있는 원격 저장소들이 있으며, 개발자는 환경설정을 통해 하나 이상의 외부 저장수오세 필요로하는 아티팩트를 다운로드 받아 사용할 수 있다.
- 저장소 호출 프로세스 : 일반적인 개발 시에 주로 사용되는 라이브러리 관리 메커니즘은, 필요한 라이브러리를 프로젝트 내부 디렉터리에 담고 path 설정을 통해 사용하고 있으나 메이븐에서는 의존성 설정 매커니즘을 통해 사용하고 관리 한다.
- local repositiory : 아티팩트들을 로컬 파일 시스템에 cache하는 기능으로 원격 저장소에서 다운로드 받아 아티팩트들을 저장하고 관리한다.
- remote repositiory : 주로 HTTP/HTTPS 서버로 서드 파티에서 제공하는 아티팩트들은 제외한 거의 모든 아티팩트들을 제공한다.
이 웹사이트는 개발자들이 필요로 하는 라이브러리 메타데이터를 쉽게 검색하고 다운로드할 수 있도록 도와준다.
주요 디렉토리 및 파일 설명
- src/main/java : 애플리케이션의 주요 소스 코드가 위치한다.
- src/main/resources : 애플리케이션 리소스 파일이 위치한다.
- src/test/java : 애플리케이션 테스트 소스 코드가 위치한다.
- src/test/resources: 테스트 리소스 파일이 위치한다.
- target : 메이븐 빌드 결과물이 저장되는 디렉토리로, 컴파일된 클래스 파일, JAR 파일, WAR 파일 등이 포함된다.
- pom.xml : 메이븐 빌드 설정 파일로, 프로젝트의 종속성, 플러그인, 빌드 설정 등을 정의한다.
가상 디렉토리
1. JRE System Library
메이븐 프로젝트 디렉토리 구조에서 JRE 시스템 라이브러리는 자바 런타임 Environment(JRE) 관련 라이브러리들을 포함하는 가상 디렉토리이다. 이 디렉터리는 자바 애플리케이션이 실행될 떄 필요한 자바 클래스 라이브러리들을 나타내며, 일반적으로 IDE(통합 개발 환경)애서 표시된다.
예를 들어 Eclipse와 같은 IDE에서 메이븐 프로젝트를 열면, 프로젝트 탐색기에서 JRE System Library라는 항목을 볼 수 있다.
- 자바 기본 클래스 포함 : java.lang, java.util, java.io 등과 같은 표준 자바 클래스 라이브러리를 포함한다. 이러한 라이브러리들은 모든 자바 프로그램에서 기본적으로 사용되는 클래스들은 제공한다.
- JRE 버전 관리 : JRE 시스템 라이브러리는 프로젝트가 특정 JRE 버전을 대사응로 빌드되고 실행될 것임을 나타낸다. 이를 통해 어떤 자바 버전과 호환되는지를 명확히 할 수 있다.
- 컴파일 및 실행 환경 설정 : IDE에서 JRE 시스템 라이브러리를 통해 프로젝트의 컴파일 및 실행 환경을 설정할 수 있다. 이는 메이븐의 pom.xml 파일에 설정된 자바 버전과 일치해야한다.
- IDE 통합 : Eclpise와 같은 IDE에서는 프로젝트의 자바 빌드 경로에 JRE 시스템 라이브러리를 자동으로 추가하여 개발자가 프로젝트를 설정하는데 도움이 된다. 이를 통해 프로젝트 코드가 JRE 클래스에 접근할 수 있도록 한다.
메이븐과 JRE 시스템 라이브러리의 관계
메이븐 프로젝트의 경우, pom.xml 파일을 통해 프로젝트의 자바 버전을 명시할 수 있다.
▼ maven-compiler-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>
따라서 JRE 시스템 라이브러리는 메이븐 프로젝트의 자바 실행 환경을 정의하고 관리하는 중요한 요소이며, 개발자가 프로젝트에서 필요한 기본적인 자바 클래스를 사용할 수 있도록 지원한다.
메이븐 종속성 (Dependencies)
메이븐 프로젝트 디렉토리 구조에서 외부 라이브러리와 모듈 종속성을 나타내는 가상 디렉터리이다. 이 디렉터리는 pom.xml 파일에 정의된 모든 종속성을 포함하며, 프로젝트 빌드와 실행에 필요한 라이브러리들을 보여준다.
- 종속성 관리 : pom.xml 파일에 정의된 종속성들을 나타낸다. 메이븐은 프로젝트 빌드 과정에서 필요한 외부 라이브러리를 메이븐 중앙 저장소나 커스텀 저장소에서 다운로드하여 이 디렉터리에 추가한다.
- 라이브러리 제공 : 프로젝트에 필요한 외부 라이브러리들을 제공하여 컴파일, 테스트, 실행 단계에서 사용할 수 잇도록 한다. 예를 들어, 로깅 라이브러리인 Log4j, JSON 파싱 라이브러리인 Jackson 등의 라이브러리를 포함할 수 있다.
- 트랜스티브 종속성 관리 : 메이븐은 직접 선언된 종속성뿐만 아니라, 이러한 종속성들이 필요로 하는 다른 라이브러리(트랜스비트 종속성)도 자동으로 해결하고 다운로드한다. 메이븐 종속성은 이 모든 트랜스티브 종속성도 포함한다.
- 버전 관리 : 걱 라이브러리의 특정 버전을 관리한다. 메이븐은 동일한 라이브러리의 여러 버전이 충돌하지 않도록 관리하며, pom.xml 파일에 설정된 버전을 기준으로 종속성을 처리한다.
▼ 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>
메이븐은 이 종속성들을 다운로드하여 메이븐 종속성 섹션에 추가한다.
IDE 통합
통합 개발 환경 (IDE)는 메이븐 프로젝트를 열 때 메이븐 종속성 섹션을 자동으로 생성하여, pom.xml 파일에 정의된 모든 종속성을 이 디렉터리에서 볼 수 있게 한다. 이를 통해 개발자는 프로젝트에서 사용하는 모든 외부 라이브러리와 그 버전을 쉽게 확인하고 관리할 수 있습니다.
종속성 충돌 해결
메이븐은 종속성 충돌을 해결하기 위한 여러 매커니즘을 제공한다. pom.xml 파일에서 특정 라이브러리의 버전을 명시하거나, dependencyManagement 섹션을 사용하여 종속성 버전을 중앙에서 관리할 수 있다. 이를 통해 프로젝트에서 사용되는 라이브러리들의 호환성을 유지하고 충돌을 방지할 수 있다.
요악하면, 메이븐 종속성을 메이븐 프로젝트에서 외부 라이버르리 종속성을 관리하고, 프로젝트 빌드와 실행에 필요한 모든 라이브러리를 포함하여 개발자가 쉽게 접근하고 사용할 수 있도록 도와주는 중요한 기능이다.
추가 디렉터리
스프링 부트 프로젝트에서 추가 디렉터리를 사용하고자 할 때는 주로 아래와 같은 용도로 사용할 수 있다.
- src/main/resources/static : 정적 자원 (HTML, CSS, 자바스크립트 파일 등)이 위치한다.
- src/main/resources/templates : 템플릿 파일 (Thymeleaf, Freemarker 등)이 위치한다.
- src/main/resources/META-INF : 메타데이터 파일이 위치한다.
메이븐 기본 생명 주기
메이븐 빌드는 S/W 프로젝트이 핵심적인 빌드 라이프 사이클 개념을 따르고 있으며, 빌드 초기화 단계부터 아티팩트의 배포까지 생명 주기를 정의하고 있다.
메이븐 생명주기 단계는 각각의 플러그인과 바인딩 되어 실제로 바인딩된 플러그인 명령을 실행하며 단계 순서에 따라 순차적으로 빌드가 실행되어 개발자가 실행한 명령을 수행한다.
Plug-in
메이븐 플러그인은 빌드 프로세스의 다양한 단계를 수행하기 위해 사용되는 추가 기능 모듈이다. 메이븐은 자체적으로 프로젝트 빌드를 관리하는 기본적인 기능만을 제공하고, 실제 빌드 과정에서 발생하는 여러 작업은 플러그인을 통해 처리된다.
- goal : 플러그인이 실행하는 특정 작업을 의미한다. 하나의 플러그인은 여러 개의 goal을 가질 수 있다.
- Default Plugins : 메이븐은 특정 작업을 위해 기본적으로 제공되는 플러그인이 있다.
- Custom Plugins : 사용자는 자신의 요구에 맞는 플러그인을 추가하거나 기존 플러그인의 동작을 재정의할 수 있다. 이를 위해 pom.xml 파일에서 플러그인을 설정한다.
- Build Lifecycle : 메이븐 빌드 라이프사이클은 여러 단계로 구성되며, 각 단계에서 특정 플러그인이 호출된다.
▼ 플러그인 설정 예
<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>
이 처럼 메이븐 플러그인은 빌드 과정의 다양한 적업을 자동화하고 간소화하는데 중요한 역할을 한다.
Pom.xml 태그
메이븐의 properties 섹션은 pom.xml 파일에서 공통적으로 사용되는 값들을 변수로 정의하여 관리하는 부분이다. propertoes 섹션에 정의된 값들은 다른 설정에서 ${propertName} 형태로 참조할 수 있다. 이를 통해 설정 값들을 중앙에서 관리하고, 필요할 때 쉽게 변경할 수 있게 된다.
- 버전 관리 : 특정 의존성이나 플러그인 버전을 한 곳에서 관리하여 여러 곳에서 참조할 수 있다.
- 컴파일러 설정 : 자바 버전 등과 같은 빌드 설정을 한 번에 관리할 수 있다.
- 환경 변수 관리 : DB 접속 정보나 파일 경로 등 환경 설정 값을 중앙에서 관리할 수 있다.
▼ properties 섹션의 예시
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
이렇게 정의된 속성들은 메이븐의 다른 섹션에서 ${maven.compiler.source}와 ${maven.compiler.target}로 참조할 수 있다.
이처럼 properties 섹션은 중복되는 설정 값들을 줄이고, 관리하기 쉽게 해준다. 프로젝트가 커지거나 복잡해질수록 이 방식은 매우 유용하게 작용한다.
자바에서 Property는 다양한 상황에서 사용되며, 그 의미는 문맥에 따라 다를 수 있다. 가장 일반적으로 사용되는 두 가지 경우는 시스템 프로터티와 프로퍼티 파일이다.
시스템 프로퍼티
자바 애플리케이션 실행시 JVM에 의해 관리되는 키-값 쌍의 설정 정보이다. 이들은 보통 애플리케이션의 동작을 제어하거나 특정 환경 정보를 제공하는데 사용된다.
OS 이름, 사용자 홈 디렉터리 위치, 자바 클래스 패스 등의 정보를 가져올때 사용된다.
System.getProperty() 메서드를 통해 접근할 수 있다.
▼ 예시
String osName = System.getProperty("os.name");
String userHome = System.getProperty("user.home");
시스템 프로퍼티는 자바 애플리케이션을 실행할 떄 -D 옵션을 사용하여 설정할 수 있다.
java -DmyProperty=myValue MyApp
프로퍼티 파일
자바 애플리케이션에서 자주 사용되는 구성 설정을 저장하는데 사용되는 파일 형식이다. 이 파일은 일반적으로 ".properties" 확장자를 가지며, 키-값 쌍으로 이루어져 잇다. 자바에서는 java.util.Properties 클래스를 사용하여 이 파일을 쉽게 로드하고 사용할 수 있다.
DB 연결 설정, 애플리케이션 구성 정보, 국제화(i18n) 메시지 등을 외부화하여 코드와 분리된 형태로 관리할 수 있다.
자바 애플리케이션의 유연성과 확장성을 높여주는 중요한 역할을 한다.
org.codehaus.mojo
메이븐 플러그인과 관련된 다양한 프로젝트를 관리하는 조직 중 하나이다. 이 조직은 메이븐 프로젝트 빌드 프로세스를 확장하고 개선하는데 사용되는 여러 유용한 플러그인을 제공한다.
- 플러그인 제공 : org.codehaus.mojo는 여러가지 메이븐 플러그인을 제공하는데, 이 플러그인은 메이븐 빌드 주기를 확장하거나 특정 작업을 자동화하는데 사용된다.
- 오픈 소스 : org.codehaus.mojo가 제공하는 플러그인들은 오픈 소스 프로젝트의 일환으로 개발되며, 커뮤니에서 활발하게 유지보수되고 있다.
- 다양한 플러그인 : or.codehaus.mojo 그룹 ID 아래에는 수많은 메이븐 플러그인이 있으며, 이들은 다양한 빌드 관련 작업을 지원한다.
이러한 플러그인들은 메이븐을 사용하는 프로젝트에서 다양한 작업을 자동화하고, 복잡한 빌드 프로세스를 단순화하는데 매우 유용하다. org.codehaus.mojo는 특히 커뮤니티가 필요로 하는 다양한 기능을 제공하여 메이븐 생태계의 중요한 부분을 구성한다.
'스프링 프레임워크' 카테고리의 다른 글
The IoC Container [4] (0) | 2024.08.14 |
---|---|
The IoC Container (3) (0) | 2024.08.09 |
The IoC Container (2) (0) | 2024.08.09 |
The IoC Container (1) (0) | 2024.08.08 |
POJO (Plain Old Java Object) (0) | 2024.08.05 |