Spring

Maven 이란

728x90

참고한 강의 : www.udemy.com/course/spring-hibernate-tutorial/

 

 

- Maven

: Maven 은 자바 프로젝트 관리 툴로, 프로젝트와 프로젝트 내부에 필요한 의존성들에 대해서 빌드하는데 사용된다.

 

Maven 같은 툴이 없이 자바 프로그램을 개발한다면, 

자바가 기본적으로 제공하는 라이브러리 외의 내용들을 추가하고 싶을때 

매번 JAR 파일을 다운 받아서 프로젝트에 넣어준뒤, class path 를 설정해줘야했다.

 

예를들어,

Hibernate ORM 이 필요하면 Hibernate 사이트에가서 JAR 파일 받아오고,

Spring 관련 JAR 파일이 필요하면 Spring 사이트에 가서 JAR 파일 받아오고 등등

 

이런 귀찮은 작업을 매번해줘야 했다.

 

이런 수고를 덜어주기 위해 등장한게 Maven 이다.

(Javascript 를 해봤다면, npm 을 써봤을것이다. npm 과 거의 비슷하다고 보면 된다)

 

 

 

- Maven 이 작동하는 방식

출처 : www.udemy.com/course/spring-hibernate-tutorial/

 

Maven 이 동작하는 방식은 다음과 같다

 

1. 프로젝트에 작성된 설정 파일 (pom.xml) 을 읽어들인다

2. pom.xml 에 설정한 dependency 관련 JAR 파일이 있는지 찾기위해, local repository 를 찾아간다

3. local repository 에 없다면 maven central repository 를 찾아가서 관련 JAR 파일을 다운 받는다

4. maven central repository 에서 다운 받은 JAR 파일을 local repository 에 저장한다.

5. maven 이 다시 프로젝트를 빌드하고 실행한다.

 

 

 

- Maven 의 장점

Maven 을 사용함으로써, 얻는 장점들을 요약하면 다음과 같다

 

1. 프로젝트 빌드 관리

2. 표준화된 디렉토리 구조 제공

 

1은 위에서 언급했던 내용이고

2는 무엇일까?

 

maven 에는 archetype 이라는게 있는데

그냥 쉽게 말하면, starter project, starter files 정도로 볼 수 있다.

spring.io 사이트에 가면 spring initilizar 라는게 있는데, 프로젝트 생성시에 필요한 파일들을 자동으로 생성해준다.

이것처럼 archetype 이란것도 maven 프로젝트를 만드는데 있어서 관련 파일들을 자동으로 생성해주는 것을 말한다

 

이 archetype 에는 여러가지 타입이 존재하는데 자세한 사항은 아래 참조

maven.apache.org/archetypes

 

Apache Maven Archetypes – Maven Archetypes

 

maven.apache.org

 

아무튼 간에 maven archetype 으로 프로젝트를 생성하면, 다음과 같이 표준화된 구조를 갖게 된다.

 

출처 : www.udemy.com/course/spring-hibernate-tutorial/

 

이런 표준화된 디렉토리 구조를 가지면, 개발팀이 개발하는 도중 다른 개발자가 들어와서 일하더라도 그 구조가 표준화 되어있기 때문에 더 이해하기 쉬워지고, 유지보수가 편해진다.

또한 특정 IDE 에 종속되지 않는다는 장점이 있다.

 

 

- pom.xml 

pom 은 Project Object Model 의 약자이다.

이 파일은 maven 의 프로젝트 설정 파일로, 프로젝트 이름, 버전, 의존성 관리 등을 담당하는 파일이다.

이 파일의 구조는 아래와 같이 되어 있다

 

출처 : www.udemy.com/course/spring-hibernate-tutorial/

 

파일 내부를 좀 더 구체적으로 살펴보면 다음과 같은 구조로 되어 있다

 

출처 : www.udemy.com/course/spring-hibernate-tutorial/

 

Maven 이 어떤 JAR 파일이 필요한지 파악하고 찾기 위해서는, GAV 를 잘 작성해야만 Maven 이 찾아갈 수 있다.

 

GAV 란 GroupId, ArtifactId, Version 의 약자이다.

이 세가지를 주소로 비유하자면, GroupId 는 도시 이름, ArtifactId 는 도로명, Version 은 집 번호(동, 호수) 정도로 비유할 수 있다.

 

GroupId 는 보통 기업의 이름이나, 그룹의 이름 또는 조직의 이름등으로 구성하며

일반적으로 도메인 이름의 역순으로 기재한다. 

(ex. com.google, com.luv2code etc..)

 

ArtifactId 는 프로젝트의 이름을 기입한다

 

Version 은 말그대로 버전을 쓰는곳으로 해당 프로젝트가 개발 중 이면 SNAPSHOT 키워드를 붙인다

ex) 1.0-SNAPSHOT

 

 

- How to find dependencies ? 

: pom.xml 을 작성할때, 사용할 패키지에 대해서 의존성 주입을 명시해줘야한다.

근데 이 의존성 주입을 뭘써야하는지 어떻게 알까?

 

방법은 아래의 사이트에 가서 검색을 하면 된다

search.maven.org/

 

Maven Central Repository Search

 

search.maven.org

예를들면 이런식으로 검색해서 찾아가면

 

페이지에서 위와 같이 <dependency> 태그 값을 제공해준다.

 

만약 위 사이트에서 발견하지 못했으면 아래의 사이트에 가서도 찾을 수 있다

www.mvnrepository.com

 

Maven Repository: Search/Browse/Explore

A programming model for software-defined state Last Release on Dec 13, 2020

mvnrepository.com

 

추가적으로 maven 프로젝트에 java 버전을 설정해주고 싶으면 아래의 값을 바꾸면된다

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

 

1.8 로 설정된 값을 다른 자바 버전 값으로 바꾸면 버전 전환이 가능하다.

그리고 반드시 프로젝트를 재빌드 해줘야한다.

(<maven.compiler.target> 은 입력된 자바 버전에 따라서 바이너리 코드를 몇 버전으로 할건지 설정하는 것이고, <maven.compiler.source> 는 프로젝트의 자바 소스코드의 버전을 몇으로 했는지를 명시하는것)

 

 

 

- Types of Repository

maven 에서 제공하는 repository 타입은 local 과 central 그리고 private 이 있다.

 

local repository 는 위의 maven 작동원리에서 언급한 것을 의미하고, 일종의 cache 같은 역할을 한다

윈도우의 경우 C:\Users\<users-home-dir>\.m2\repository 에 저장되어 있으며

맥이나 리눅스의 경우 ~/.m2/repository 에 저장되어 있다.

 

central repository 는 local 에 없을때 maven 이 찾아가는 repo 를 말한다.

(찾아갈때 repo.maven.apache.org/maven2 이 주소를 찾아간다)

 

private repository 는 기업 내부에서만 사용하게 하는 저장소로, 외부에 코드를 공개하고 싶지 않을때 사용한다

private repository 와 관련된 대표적인 상품으로는 다음과 같은게 있다.

 

1) Archiva

: Apache 재단에서 제공

archiva.apache.org

 

Archiva – The Build Artifact Repository Manager

This is the recommended latest release of Archiva. File-Type Checksum Signature Archiva 2.2.5 Standalone zip sha256 asc Archiva 2.2.5 WAR war sha256 asc

archiva.apache.org

 

2) Artifactory

: JFrog 에서 제공

www.jfrog.com

 

JFrog - Universal Artifact Management for DevOps Acceleration

Share build artifacts & dependencies from development to production with a complete DevOps Platform, including artifact management, pipeline security & software distribution.

jfrog.com

 

3) Nexus

: Sonatype 에서 제공

www.sonatype.com

 

Sonatype | DevOps Automation - Open Source Governance

Sonatype Nexus helps software development teams use open source so they can innovate faster and automatically control risk.

www.sonatype.com

 

private 타입의 repo 를 클라우드 호스팅 할때는 아래의 사이트들을 주로 이용한다

 

1) www.packagecloud.io

 

packagecloud:enterprise - On premises Node.js, Debian, RPM, Maven, Python and RubyGem Repository

Run your own packagecloud server. Host your own Node.js, Debian, RPM, Java, Python and RubyGem repositories.

www.packagecloud.io:443

2) www.mymavenrepo.com

 

Your private maven repository hosting - myMavenRepo.com

"MyMavenRepo is just the perfect solutions for small companies and startups that need to keep private artifacts. A simple and affordable solution for a simple problem that many small organizations have to face at some point. The support team responds very

mymavenrepo.com

 

728x90

'Spring' 카테고리의 다른 글

Spring Security - Configuration  (0) 2021.03.05
Spring Security - Overview  (0) 2021.03.04
Spring Framework - AOP 코드 예제  (0) 2021.02.24
Spring Framework - AOP Overview  (0) 2021.02.17
Spring Framework - Layered Architecture  (0) 2021.02.16