빌드 툴 중 하나인 Maven에 대해서 알아보려고 한다.
빌드 툴은 여러가지가 있지만 Maven부터 알아보고 나중에 다른 것도 작성해보려고 한다.
우선, 빌드란 무엇인가?
웹을 만든다고 가정을 했을때, 웹을 만들고 배포하고 리포팅을 한다. 그 이후에 우리가 아는 웹들을 사용할 수 있는 것이다.
자세히 보면 아래와 같다.
빌드 과정
- 1 - 프로젝트 생성
- 2 - 라이브러리 설정
- 3 - 구현
- 4 - 컴파일
- 5 - 테스트
- 6 - 패키징
- 7 - 배포
- 8 - 리포팅
위의 과정을 통해 결과적으로 웹이 생성이 되는데 이의 과정을 도와주는 것을 빌드 툴이라고 하며 각각의 빌드 툴은 서로 조금씩 다른 방식으로 빌드를 개발자에게 지원을 한다. 그 중 하나인 Maven에 대해서 알아보려고 하는 것이다.
빌드 용어정리
빌드 과정에 대한 용어를 먼저 알아보자.
앞서 정리한 빌드 과정 전체를 '라이프 사이클' 이라고 한다.
라이프 사이클의 각 단계를 '페이즈' 라고 한다.
각 페이즈가 동작하는 기반을 '플러그인'이라고 한다.
플로그인은 여러가지 동작을 또 하는데 각각의 작업을 '골'이라고 한다. 해당 과정에 결과물이라고 볼 수도 있다.
빌드과정 중 패키징을 예시로 들어보겠다.
결과적으로 패키징 과정을 통해 해당 웹을 war 파일로 만든다.
1. 전체 빌드 과정은 라이프 사이클이다.
2. 빌드 과정 중 하나인 패키징은 페이즈라고 부른다
3. 패키징을 처리되는 기반이 org.apache.maven.plugins:maven-jar-plugin:2.4이고 이를 플러그인이라고 한다.
4. 처리된 결과물로 war파일이 생성되는데 war가 골이 되는 것이다.
(+) JAR vs WAR
JAR
- JAVA 어플리케이션이 동작할 수 있도록 자바 파일들을 압축한 파일입니다.
- JAVA 관련 파일들로 구성됩니다.
WAR
- WEB Application 압축파일입니다.
- Servlet, JSP, jar(JAVA), JavaScript 등 웹 관련 파일들로 구성됩니다.
라이브러리 설정
모든 과정이 자세히 어떻게 처리되는지 알면 좋지만 다른 블로그로 정리하는 걸로 하고
개발에 있어서 가장 먼저 직면하는 라이브러리 설정만을 다룰 생각이다.
" 라이브러리란 웹을 제작할 때, 우리가 사용하는 도구들이라고 생각하면 된다."
예를들어, 우리가 클래스를 만들고 setter, getter 등의 메서드를 구현한다고 가정해보자.
당연하게 모두 작성하는 것도 방법이지만 우리는 이를 쉽게 설정하기 위해 lombok이라는 라이브러리를 사용한다.
이 라이브러리를 사용하면 작은 설정으로 실제로 작성하진 않았지만 setter, getter 등이 작성된 것 처럼 사용이 가능하다.
이러한 것이 라이브러리이며 라이브러리를 사용하기 위해서는 라이브러리를 해당 프로젝트에 설치를 해야 사용이 가능하다.
기존의 방식은 인터넷에서 파일(jar)을 설치하고 이 후 build path 를 설정해 빌드를 직접하고 사용을 하였다.
Maven 빌드 툴은 이 과정을 훨씬 간단하게 만들어 준다.
프로젝트를 생성할때 Maven 빌드 툴을 사용함을 명시하고 생성을 하면 pom.xml 파일이 설정 된다.
이 파일에 dependancy 태그를 통해 라이브러리를 간단히 설치 가능하다.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
이 후, 로딩을 한번 해주거나 자동으로 라이브러리가 설치되어 사용이 가능하다.
라이브러리 설정 - Dependancy Management
프로젝트를 하나 만든다고 가정을 하자.
Video web site를 만든다고 가정을 할때, 한 개발자는 Video Service 개선을, 한 개발자는 DB 환경 관리를 한다고 할때,
나중에 작업 후 합쳐서 하나의 프로젝트를 만드는 것이다.
이 때, 두 개발자는 연결되는 부분에 동일한 라이브러리를 사용했는데, 만약 라이브러리 버전이 같지 않다면 작동하지 않을 것이다.
이를 방지하기 위해 사용해야 해야 하는 것이 Dependancy Management이다.
한마디로 버전 관리이다.
이는 아래 사이트에서 확인이 가능하고 예를들어, lombok 사용을 원할시 밑에 사이트에 접속해 코드를 가져와 pom.xml에 작성하되, 개발자들은 같은 버전을 사용할 것을 서로 알아야 한다.
local Repository - Remote Repository - Central Repository
요새는, Central Repository(위의 사이트)와 개발자 사이에 Remote Repository를 두어 특정 라이브러리는 어떤 버전을 사용하는지 정리를 해두고 사용한다. 설정 방법은 간단하다.
부모 프로젝트를 Video Web Site라고 하고 지금 내가 하고 있는 자식 프로젝트를 Video DB Handle 이라고 했을 때,
다음을 자식 프로그램에 작성한다면 부모 프로젝트의 dependancy를 따라 자식 프로그램을 빌드한다고 명시하는 것과 다름 없다.
<parent>
<groupId>Video Web Site</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.4</version>
<relativePath/>
</parent>
정리하는 김에 pom.xml에 있는 태그들을 간단하게 정리하려고 한다.
(-> artifactId를 갖는 여러가지 프로젝트가 모여 groupId를 갖는 큰 프로젝트를 갖는다고 생각)
- 1) mavenVersion : maven의 버전
- 2) groupId : 큰 프로젝트
- 3) artifactId : 작은 프로젝트
- 4) name : 프로젝트의 이름
- 5) description : 프로젝트 설명
- 6) version : 프로젝트의 버전
- 7) build : 빌드와 관련된 플러그인들 정의