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



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

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!

  • 엄지영 2019.10.01 12:11  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다~ ^^
    저는 스프링 입문자로 인텔리제이 ultimate 버전으로 공부하고 있습니다~

    인텔리제이나 이클립스 같은 IDE에 메이븐이 이미 내장 되어 있는데
    메이븐을 따로 설치하는 이유가 뭔가요?

    검색을 통하여 찾다보니 커맨드라인 실행이나 서버에서 빌드를 해야할때 설치해야 한다고 하는데
    서버에서 빌드를 한다는 것이 무슨 뜻인지 잘 모르겠습니다...
    웹 개발 현업에서 일을 할 때 서버에서 빌드 할 일이 많은가요?

    • 도로락 2019.10.13 20:05 신고  댓글주소  수정/삭제

      일이 너무 바빠 답변이 늦었습니다. 언젠가 이 답글을 읽으실지 모르겠네요.

      현실적으로 대부분의 기업들은 개발환경이 좋지 못하기에 빌드만을 수행하는 빌드서버를 따로 두지 않고 자신의 개발 PC에서 빌드를 진행하게 됩니다.

      빌드란 쉽게 말씀드리자면 소스코드를 컴파일하고 여러가지 파일들을 하나로 묶는것입니다.

      예를 들어 어플리케이션에 필요한 이미지파일이나 이미지파일 pdf , 웹환경이라면 css나 js html 파일같은것들을 실제 어플리케이션이 구동되는 환경에 맞게 묶는것이지요.

      프로젝트가 작다면 수동으로 직접 폴더를 만들어가며 해도 되게지만 프로젝트가 커질수록 코드를 수정할때마다 빌드를 수행하기도 번거롭고 시간도 오래걸리기에 큰 프로젝트의 경우에는

      SVN이나 Git에 소스코드를 커밋하고 젠킨스같은 빌드를 수행할 수 있는 서버를 따로 두어 SVN이나 Git 서버와 연동하여 자동 빌드를 수행하는 구조로 프로젝트를 하는 경우도 있습니다.

      메이븐의 경우 이러한 빌드를 수행하는 도구이면서 라이브러리 의존성을 관리하는 도구입니다. 원래는 리눅스나 윈도우의 cmd같은 커맨드라인 기반으로 명령어를 입력해야 합니다.

      프로젝트가 위치한 디렉터리 위치와 수행하고 싶은 빌드 타입 등을 입력하는 형식이지요. 그런데 커맨드라인은 아무래도 많이 불편하기에 이클립스나 인텔리J에서 자체적으로 플러그인을 만들어서 내장하여 배포하는것입니다.

      따라서 인텔리J나 이클립스에 자체적으로 메이븐 핵심 엔진을 자신의 ide에 맞게 이식하여 내장한것이라 보시면 됩니다.