newmin
개발 이것저것
newmin
전체 방문자
오늘
어제
  • 전체 보기
    • Language
      • C
      • Java
    • Algorithm
      • Problem Solving
    • Dev
      • 개발일기장
      • Android
      • Spring
      • 회고록
    • Github
    • IDE
      • eclipse
      • visual studio 2019
    • 대외활동
      • 사피엔스4.0 대학생 서포터즈
      • 코드클럽 SW교육기부단
      • 한국대학생IT경영학회 KUSITMS

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이클립스
  • 안드로이드
  • C언어알고리즘
  • 알고리즘
  • 자바
  • 코드클럽
  • 프로그래밍
  • 이클립스에러
  • SW교육기부단
  • eclipse
  • C언어기초
  • 백준C언어
  • 대학생 서포터즈
  • 코린이
  • 사피엔스4.0 서포터즈
  • BOJ
  • 대학생 대외활동
  • 코드클럽 SW교육기부단
  • 사피엔스4.0
  • SW교육기부
  • 백준
  • 큐시즘
  • 개발자
  • code club
  • 대학생 교육기부
  • 중현초등학교
  • KB디지털멘토링
  • 코딩
  • c언어
  • 깃허브

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
newmin

개발 이것저것

[Spring] Maven이란?
Dev/Spring

[Spring] Maven이란?

2022. 2. 8. 14:24

지난 학기, 웹 프로젝트를 진행하면서 Maven을 이용했다. 그런데 필자는 Maven에 대한 이해가 부족한 상태로 개발을 진행했어서 중간중간 어려움이 많았다. 그래서 오늘은 Maven에 대해 공부한 내용을 정리하고자 한다.


Maven이 무엇이냐?

- Maven은 JAVA로 빌드되는 프레임워크에서 쓰이는 프로젝트 관리 도구이다. 

* 빌드 :  소스코드로 되어 있는 파일들이 컴퓨터에서 실행될 수 있도록 소프트웨어 가공물로 변환하는 과정이나 결과물을 말한다.

 

- 내가 경험한 팀 프로젝트를 예로 들어서 설명을 돕자면, 당시 기능중에 자정마다 일일 챌린지를 업데이트하는 스케줄러를 설정해야 했었다. 관련된 라이브러리를 찾아보면서 적용하는 방법을 찾아볼때는 Maven의 역할을 잘 몰랐어서 대충 하라는대로 따라 했었다.

 

pom.xml 파일에 해당 코드를 추가해주어 자동으로 다운로드되도록 했다.

이렇게 정의를 해놓으면 알아서 자동으로 라이브러리를 다운받고 사용할 수 있고, 팀원과 공유할 때도 편리했다.

 

- 이처럼 Maven은 필요한 라이브러리를 pom.xml에 명시해놓으면 알아서 네트워크를 통해 다운로드를 해주고,더 나은 개발이 가능하다.

 

Maven의 장점 

- 편리한 Dependecy LIbrary 관리 기능을 제공한다. 

- 개발 환경이 서로 다르더라도 pom.xml을 공유하면 정상적으로 실행이 된다.

- war 파일 기반의 배포용으로 자주 사용된다.

-CoC(Convention over Configuration)라는 아이디어에 따라 모든 프로젝트가 일관된 디렉토리 구조와 빌드 프로세스를 유지할 수 있다. 


pom(Project Object Model)

- XML 파일에 기반해 반복적으로 수행해온 의존성 설정, 프로젝트 빌드, 리포팅 ,문서화 작업 등을 자동화해주는 문서이다.

- 프로젝트마다 하나의 pom.xml 파일이 있다. 메이븐을 이용하는 프로젝트의 root에 존재하는 xml 파일이다.

<?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>dbp09.condinghip</groupId>
  <artifactId>dbp_HBTI</artifactId> 
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>dbp_HBTI Maven Webapp</name>
  <description>2021-2 DataBaseProgramming(01) 09 HBTI Service Project</description>
  <!-- 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> 
    
    <java.version>1.8</java.version>
	<servlet-api.version>4.0.1</servlet-api.version>
	<jsp.version>2.3.3</jsp.version>
	<jstl.version>1.2</jstl.version>
	<logback-classic.version>1.2.6</logback-classic.version>
	<commons-dbcp2.version>2.9.0</commons-dbcp2.version>
	<commons-fileupload.version>1.4</commons-fileupload.version>
	<jackson-databind.version>2.12.5</jackson-databind.version>
	<junit.version>4.13.2</junit.version>
	<mybatis.version>3.5.7</mybatis.version>
  </properties>

  <dependencies>
    <dependency>
    <!-- for unit test -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <!-- Servlet & JSP API -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${servlet-api.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>${jsp.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
		
  </dependencies>

  <build>
    <finalName>dbp_HBTI</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
          <configuration>
          	<source>1.8</source>
          	<target>1.8</target>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.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>
      </plugins>
    </pluginManagement>
  </build>
</project>

엘리먼트

- project : pom.xml 파일의 최상위 루트 엘리먼트

- modelVersion : POM model의 버전

 

- groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정. 일반적으로 도메인 이름을 거꾸로 적는다.

- artifactId : 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정한다. groupId 내에서 유일해야 한다. Maven을 이용하여 빌드할 경우 artifactId-version.packaging 과 같은 규칙으로 artifact가 생성된다. 

위의 예시라면 dbp_HBTI-0.0.1-SNAPSHOT.jar 파일이 생성된다.

- version : 프로젝트의 현재 버전. 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용한다.

- packaging : 어떤 형태로 packaging할 건지를 결정. jar, war, ear 등이 해당된다.

- name : 프로젝트 이름

- url : 프로젝트 사이트가 있다면 사이트 URL 등록 가능

 

- properties : 속성으로 정의해놓고 dependencies에서 변수처럼 활용할 수 있다. 버전 관리시 용이하다.

- dependencies : 해당 프로젝트와 의존 관계에 있는 라이브러리를 관리한다.

- build : 빌드에 사용할 플러그인 목록 

 


Maven 라이프 사이클

- Maven은 프로젝트의 전체적인 라이프 사이클을 관리하는 도구이기도 하다. 

- 라이프 사이클(Life Cycle)이란 Maven에서 미리 정해진 빌드 순서를 일컫는다. 각 빌드 단계를 phase라고 하고, 이들은 서로 의존 관계를 갖고 있다. 즉, 해당 phase가 수행되려면 이전 단계의 phase가 모두 수행되어야 한다는 것이다.

 

출처 - https://velog.io/@changyeonyoo/Maven-%EC%9D%B4%EB%9E%80

 

 

Eclipse에서 Maven Project를 Run as를 눌러보면 기본적인 Maven Build LifeCycle을 확인할 수 있다.

Maven build : 메이븐 빌드를 실행한다.

Maven build.... : 새로운 사용자 빌드를 만든다.

Maven clean : target에 지정된 모든 소스를 삭제한다.

Maven generate-sources : 컴파일 과정에 포함될 소스를 생성한다.

Maven install : Local Repository에 패키지를 복사한다.

 

일반적으로 Maven은 default, clean, site 세가지로 표준 정의한다. 

- Clean : 빌드 시 생성되었던 Output을 지워준다.

- Default (Build) : 일반적인 빌드 프로세스를 위한 모델이다.

- Site : 프로젝트 문서와 사이트 작성을 수행한다.

출처 - https://velog.io/@changyeonyoo/Maven-%EC%9D%B4%EB%9E%80

Maven은 모든 빌드 단위에 대한 Life Cycle이 예약되어 있어서 개발자가 임의로 변경할 수 없다.

 

각각의 라이프 사이클에 대한 자세한 설명은 이곳을 참고하도록 하자.


다른 라이브러리 관리 프로그램

1. Ant

- Ant는 소프트웨어 빌드 프로세스를 자동화하기 위한 소프트웨어 도구이다.

- 아주 복잡한 스크립트를 사용하고, 이 스크립트는 재사용이 불가하다.

- 스크립트가 복잡하기 때문에 점진적으로 개발 속도가 느려진다.

- 개발자가 직접 소스코드의 위치와 소스코드의 빌드가 된 파일의 위치 등을 build.xml에 정확하게 지정해주어야 한다.

- Life Cycle이 없기 때문에 각 goal에 일일이 작업에 대한 순서를 지정해주어야 한다.

 

2. Gradle

- XML 대신 groovy 스크립트를 사용하여 동적인 빌드가 가능하다.

- 멀티 프로젝트에서는 더 적합하다. 

 


참고 

https://maven.apache.org/what-is-maven.html

https://goddaehee.tistory.com/199

https://sjh836.tistory.com/131

https://mangkyu.tistory.com/8

 

'Dev > Spring' 카테고리의 다른 글

[Spring Boot] Heroku 서버 배포하기  (0) 2022.05.18
[Spring Boot] CORS 설정 시 addCorsMappings 에러 해결  (0) 2022.05.03
[Spring boot] JPA 카멜 표기법으로 이름 설정하기  (0) 2022.04.08
[Spring boot] 404 Not Found 에러 해결 - 경로  (0) 2022.04.08
[Back-end] JDBC Programming  (0) 2022.01.22
    'Dev/Spring' 카테고리의 다른 글
    • [Spring Boot] CORS 설정 시 addCorsMappings 에러 해결
    • [Spring boot] JPA 카멜 표기법으로 이름 설정하기
    • [Spring boot] 404 Not Found 에러 해결 - 경로
    • [Back-end] JDBC Programming
    newmin
    newmin
    매일 작심삼일로 작심일년

    티스토리툴바