툴 [Tool]

[Maven] Apache Maven. 메이븐이란? 메이븐 다운로드 및 설치 방법

도로락 2019. 5. 27. 09:00
Apache Maven. 메이븐이란?
Maven(메이븐)이란 Apache 재단이 개발하고 관리하는 오픈 소스 무료 빌드 도구(Tool)입니다.


빌드(Build)? 빌드란?
빌드라는것은 말그대로 우리가 작성한 소스코드(.java)들과 프로젝트에서 쓰인 각각의 자원들(.xml, .jpg, .jar, .properties) 을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징(묵어주는것) 해주는 과정을 말합니다.

예를 들어 JAVA웹 어플리케이션을 개발한다고 하면 개발은 이클립스등의 IDE에서 하겠지만 실제로 그 소스가 실행되는 환경은 Servlet/JSP 컨테이너인 톰캣이나 글래스피쉬 등입니다. 그러나 이런 플랫폼 환경들은 자신이 인식할 수 있는 구조가 정해져있고 그것을 규정해 놓았습니다. 예를 들어 서블릿컨테이너는 .war라는 패키징 파일 구조를 특정 규칙에 따라 인식하도록 되어있는데, 예를 들자면 다음과 같은 것들입니다.

  • webapp/WEB-INF/ 하위에 web.xml에 웹어플리케이션 구조를 서술한다.
  • jdbc 드라이버같은 웹어플리케이션에서 참조하는 라이브러리들은 webapp/WEB-INF/lib/ 하위에 위치하도록 한다.
  • WEB-INF/classes/ 하위에 컴파일된 .class 파일들을 위치하도록 한다.
  • webapp 하위에 html이나 이미지 파일 같은 정적 자원들을 위치하도록 한다.
  • webapp 하위에 .jsp 파일을 위치하며, 이것을 읽어들여 서블릿으로 변환한다.


즉 내가 소스코드를 어떤 구조로 개발을 하였던간에 최종적으로는 웹어플리케이션을 서비스하기 위해서는 WAS에 배포(Deploy) 해야 하고 WAS는 특정 규약대로 웹어플리케이션을 인식하기 때문에 위와 같은 규칙에 맞추어 빌드를 해야 하는것입니다.


학생때는 빌드에 대한 개념이 조금 생소했던 기억이 있는데요. 그 이유는 Hello World 같은 프로그램은 javac 등의 명령어로 한두개의 .java 파일만을 컴파일하며 학습시에 기본적으로 Eclipse 같은 IDE에서 자동으로 소스코드를 컴파일 및 컴퓨터에 설치된 톰캣으로 배포까지 다 해주었기 때문입니다.

그러나 잠시 생각해보면 현실에서는 개발된 소스가 제 이클립스에서 실행되는것이 아닙니다. AWS같은 클라우드 환경의 서버나 IDC에 있는 리눅스서버 등에 설치된 톰캣등에 실행되죠. 따라서 소스가 개발되고 수정되었을때 개발자의 컴퓨터에 있던 프로젝트를 빌드한 후 해당 서버에 FTP등을 동해 원격으로 배포를 해주어야 사용자들에게 변경된 내용이 서비스됩니다.





메이븐의 등장 배경
메이븐의 등장 배경은 당연하게도 빌드를 자동화 할 필요가 있기 때문입니다. 개발 5년차인 제가 경험해본것은 아니지만 이클립스같은 멋진 IDE도 없던 과거에는 모든 소스를 직접 수동으로 컴파일하고 필요한 라이브러리들을 classpath 설정을 직접 잡아주고 디렉터리 구조를 수동으로 만들어 빌드를 수행했을것입니다. 만약 코드에 한줄이라도 수정이 일어나게 되면 이 과정을 매번 되풀이 해야 할것이고 개발하는 시간보다 빌드 및 배포 하는 시간이 더 오래 걸렸을 것입니다.

그러다가 한줄기 빛같은 Ant라는 빌드도구가 등장하게 되는데, 이 Ant라는 빌드 도구는 XML을 기반으로 하는 빌드 스크립트를 작성하여 빌드를 수행하는 도구입니다. 즉 스크립트를 작성하여 그 스크립트가 수행되면서 빌드가 되는 구조입니다. 

예를 들면 특정 경로에 있는 .jar 파일들을 classpath에 추가해라. 그 이후에 src 아래 있는 .java 파일들을 컴파일 한 후 classes 디렉터리 하위에 이동시켜라. html파일등은 .webapp 하위로 이동시켜라 라는 식의 단순한 방식으로 동작합니다.

그러나 Ant에도 불편한점이 있었습니다. 스크립트로 작성해야 할 내용이 너무나도 많았고 결정적으로 라이브러리 의존관리가 되지 않았습니다.


예를 들어보죠. 프로젝트를 진행하면서 특정 기능이 필요해서 오픈소스 라이브러리를 알아보니 a.jar라는 라이브러리가 있다는 사실을 알게되었습니다. 다운로드 받아서 프로젝트에 classpath로 인식해주니 ClassNotFound 예외가 나타났습니다. 알아보니 a.jar를 개발한 오픈소스 개발자들이 프로젝트를 진행하면서 b.jar와 d.jar를 사용한것입니다. 또 그 둘은 다른 오픈소스인 c.jar를 사용한다는것을 알았습니다.

따라서 프로젝트를 진행하거나 빌드를 하기 위해서 손수 라이브러리들을 구하여 다운받아 빌드해야 했습니다. 매우 작은규모의 프로젝트라면 관계없겠지만 수십 수백개의 라이브러리를 사용하는 프로젝트의 경우에는 라이브러리 구성에만 엄청난 시간을 투자해야 했습니다.

그러나 메이븐이 등장하면서 중앙저장소라는 개념이 생겨났고 더이상 라이브러리를 직접 관리할 필요가 없게 되었습니다.





메이븐의 등장 및 중앙 저장소
메이븐은 Ant와 마찬가지로 빌드를 자동화하는 기능도 있지만 그밖에도 수많은 기능이 있고 가장 큰 특징으로 중앙 저장소를 통한 자동 의존성 관리가 있습니다. 


자동 의존성 관리라고 하니까 스프링의 DI/IOC가 생각나시죠? 비슷한 개념을 빌드 도구에 적용했다고 할 수 있습니다. 중앙 저장소는 라이브러리를 공유하는 파일 서버같은것입니다. 


이 중앙 저장소는 아파치재단에서 운영 관리합니다. 또한 메이븐은 자기 회사만의 중앙 저장소를 구축할수도 있습니다. 


어쨌든 여기서 c.jar를 개발한 개발자가 개발을 완료하고 중앙 저장소에 업로드합니다. b.jar 오픈소스 개발업체가 자신만의 오픈소스를 개발하려다가 c.jar가 필요해서 사용합니다. 이 개발업체는 메이븐을 사용하여 중앙저장소로부터 c.jar를 내려받아 아주 편-안 하게 b.jar 개발에 성공하고 b.jar만을 중앙저장소에 업로드합니다.

이런식으로 개발되고 업로드된 라이브러리들이 2019년 5월 현재 390만개입니다.


나중에 배우겠지만 메이븐또한 pom.xml이라는 XML 기반의 빌드 스크립트를 사용하는데, 이곳에 a.jar를 사용한다는것만 명시해주면 메이븐이 스스로 a.jar가 의존하는 라이브러리들까지 판단하여 내려받아줍니다. 이것이 메이븐의 가장 큰 장점이죠.





메이븐 다운로드 및 설치
위에서 설명한 메이븐의 기능은 일부분이며, 이 밖에도 수많은 기능이 있습니다. 자세한건 나중에 포스팅을 통해 알아보도록 하고 메이븐을 다운로드하고 설치하는 방법을 알아보도록 하겠습니다. 참고로 java IDE인 이클립스와 intelliJ에는 기본적으로 메이븐이 내장되어 있습니다.

그러나 메이븐만을 별도로 설치하여 사용할 수 있습니다.

메이븐 공식 홈페이지에 접속 후 다운로드 페이지로 이동합니다. 아래 주소로 접속해 주세요.

스크롤을 내리면 Files 부분이 있는데, Windows 사용자는 Binary zip archive 를 내려받으면 됩니다. 참고로 메이븐 3.6.1버전 기준으로 JDK 1.7 버전 이상이 설치되어 있어야 합니다.




다운로드한 압축파일을 c드라이브 하위같은 적당한 위치(?)에 풀어줍니다.



시스템 환경변수에 M3_HOME으로 메이븐 압축 해제 경로를 지정하여 추가해줍니다. 시스템 환경 변수 등록 방법을 모르시면 구글링 해주세요!



Path 설정에 %M3_HOME%\bin을 추가해주세요. Windows7 이하라면 ;(세미콜론) 이후에 추가하면 되며 Windows8 이상이라면 아래와 같이 추가하면 됩니다.




설치 확인
명령 프롬프트를 실행합니다. Windows 버튼 + R을 누른 후 cmd를 입력하여 실행해도 됩니다.



메이븐 버전을 확인했을때 아래와 같이 어떤 내용들이 출력되면 성공입니다.
mvn -v



다음글에서는 메이븐 프로젝트 생성 방법을 알아보도록 하겠습니다.