Maven이란? 그리고 Dynamic Web Project?

들어가며

당근시장 프로젝트를 진행하면서 Dynamic Web Project로 프로젝트를 작성하는 것과 Maven으로 프로젝트를 작성하는 것이 얼마나 다른 지 의문점이 생겼다. 그러면서 Maven에 대한 개념과 그 둘의 차이점에 대해 알아보려고 한다.


Maven이란?

  • Maven은 지금까지 애플리케이션을 개발하기 위해 반복적으로 진행해왔던 작업들을 지원하기 위하여 등장한 도구
  • Maven을 사용하면 빌드(Build), 패키징, 문서화, 테스트와 테스트 리포팅, git, 의존성관리, svn등과 같은 형상관리서버와 연동(SCMs), 배포 등의 작업을 손쉽게 할 수 있다.
  • Maven은 자바용 프로젝트 관리도구이다.
  • Maven을 사용한다는 것은 어쩌면 이러한 관습 즉 CoC에 대해서 알아나가는 것이라고도 할 수 있다.

* CoC(Convention over Configuration)란 일종의 관습을 말하는데, 예를 들자면 프로그램의 소스파일은 어떤 위치에 있어야 하고, 소스가 컴파일된 파일들은 어떤 위치에 있어야 하고 등을 미리 정해놨다는 것입니다.


Maven을 사용할 때 장점

  • 가장 큰 장점 : 편리한 의존성 라이브러리 관리
    • JSTL을 학습할 때, 몇 가지 파일을 다운로드 하여 /WEB-INF/lib폴더에 복사하여 사용했다. 이렇게 관련된 라이브러리가 많아질수록 이러한 방식은 상당히 불편해진다.
    • Maven을 사용하면 설정 파일에 적어줌으로써 직접 다운로드 받지 않아도 라이브러리를 사용할 수 있다.
  • Maven에 설정한 대로 모든 개발자가 일관된 방식으로 빌드를 수행
    • 개발자가 많을수록 프로젝트를 빌드하는 방법에 대해 가이드하는 것도 쉽지 않기 때문에


Maven 디렉터리 구조

  • WEB-INF폴더 :
    • web.xml파일 : 배포 기술자(DeploymentDescriptor). 웹 어플리케이션에 대한 정보들을 다 가지고 있는 파일. Servlet 3.0 미만에서는 필수, 3.0 이상에서는 어노테이션을 사용
    • lib폴더 : library의 약자, 각종 자료 파일들을 넣는 곳
    • classes 폴더 : java 패키지들, 실제 class들이 있는 곳, 내가 작성한 서블릿 파일들
  • 내가 원하는 각종 폴더 : 프론트엔드에서 작성했던 파일들, 이미지 등 다양한 리소스 들

소스 디렉터리

  • main : (기본 디렉토리)소스 코드용이며 아래에는 java, resources, webapps 등과 같은 더 많은 디렉토리가 있다.
  • test : (테스트 디렉토리) 테스트 코드용이다.
  • java : 모든 자바 코드와 패키지를 포함
  • resources : 프로젝트에 필요한 다른 리소스가 포함되어있다. 예를 들면 응용 프로그램의 국제화에 사용되는 속성 파일 등
  • webapp : 웹 응용 프로그램의 경우 디렉토리, 자바 웹 응용 프로그램이 포함되어 있다.

대상 디렉터리

  • target : Maven에 의해 생성. Maven에서 생성 한 모든 컴파일 된 클래스, JAR 파일 등을 포함한다. 정리 빌드 단계를 실행할 때 정리되는 디렉토리이다.


pom.xml 파일

pom : Project Object Model의 약어
pom.xml을 보면 해당 프로젝트의 모든 설정, 의존성 등을 알 수 있다.

태그의 의미

  • project : pom.xml 파일의 최상위 루트 엘리먼트(Root Element).
  • modelVersion : POM model의 버전.
  • groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정. 일반적으로 도메인 이름을 거꾸로 적습니다.
  • artifactId : 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정. Maven을 이용하여 pom.xml을 빌드할 경우 다음과 같은 규칙으로 artifact가 생성. artifactid-version.packaging. 위 예의 경우 빌드할 경우 examples-1.0-SNAPSHOT.jar 파일이 생성.
  • packaging : 해당 프로젝트를 어떤 형태로 packaging 할 것인지 결정. jar, war, ear 등
  • version : 프로젝트의 현재 버전. 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용. Maven의 버전 관리 기능은 라이브러리 관리를 편하게 한다.
  • name : 프로젝트의 이름.
  • url : 프로젝트 사이트가 있다면 사이트 URL을 등록하는 것이 가능.

pom.xml 예시 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// project : pom.xml 파일의 최상위 루트 엘리먼트(Root Element)
<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/maven-v4_0_0.xsd">
	// modelVersion : POM model의 버전입니다.
    <modelVersion>4.0.0</modelVersion>
    // groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정. 일반적으로 도메인 이름을 거꾸로 적습니다. 도메인 이름 : connect.or.kr
    <groupId>kr.or.connect</groupId>
    // artifactId : 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정. Maven을 이용하여 pom.xml을 빌드할 경우 다음과 같은 규칙으로 artifact가 생성. "artifactid-version.packaging"
    <artifactId>examples</artifactId>
    // packaging : 해당 프로젝트를 어떤 형태로 packaging 할 것인지 결정. jar, war, ear 등
    <packaging>jar</packaging>
    // version : 프로젝트의 현재 버전. 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용
    <version>1.0-SNAPSHOT</version>
    // name : 프로젝트의 이름
    <name>mysample</name>
    // url : 프로젝트 사이트가 있다면 사이트 URL을 등록하는 것이 가능
    <url>http://maven.apache.org</url>
    // dependencies : Dependency Management 기능의 핵심. 해당 엘리먼트 안에 필요한 라이브러리를 지정
    <dependencies>
        <dependency>
            <groupId>carrot</groupId>
            <artifactId>carrot</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>


Dynamic Web Project

  • 동적 웹 프로젝트
  • PHP, JSP, ASP, Servlet 등과 같은 파일들을 만드는 프로젝트이다.


Maven과 Dynamic Web Project

  • Maven은 많은 개발자들이 모여 프로젝트를 만들 때 좀더 편리하게 개발하기 위한 프로젝트 관리도구, 관습인 것이다.
  • Dynamic Web Project는 동적인 웹을 만들기 위한 프로젝트이다.
    • Static Web Project는 정적인 웹을 만들기 위한 프로젝트


참고