STEP#01. 빌드 개념
빌드( build )란 무엇일까? 위키( Wikipedia )의 정의에 따르면 소프트웨어 빌드( software build )란
소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정을 말하거나 그에 대한 결과물을 일컫는다.
소프트웨어 빌드에 있어 가장 중요한 단계 중 하나는 소스코드 파일이 실행 코드로 변환되는 컴파일 과정이다.
이와 같은 정의와 함께, 같이 빌드 자동화라는 단어가 나온다.
이 단어들의 의미를 좀 더 파헤쳐 보자.
프로그래밍 언어를 사용하여 소스코드를 작성하고 나면 실행까지 여러 작업들이 필요하다.
디렉터리를 만들고, 파일을 이동하고, 컴파일을 하고, 테스트를 수행하고, 압축을 하거나 해제하고, 웹 서버나 형상 관리 서버에 올리거나 하는 등의 여러 작업들을 수행한다.
경우에 따라서는 소스코드는 단 한 줄 변경했는데 이러한 작업들을 여러번 반복해야 할 때가 있다.
매우 비효율 적이기도 하며, 개발자들이 늦게 퇴근하는 이유가 되기도 한다.
빌드는 컴파일보다 훨씬 많은 것을 의미하는데, 테스트를 포함한 소스코드 컴파일 작업,
zip파일이나 자바의 jar 파일 혹은 윈도우의 exe 파일 같은 배포할 수 있는 컴포너트를 묶는 패키징 작업
파일과 디렉터리를 만들고 복사하고 지우는 작업, 자동화된 테스트 작업, 버전관리 도구 사용,
Java Doc등의 문서 생성, 각종 서버에 배포 작업, 자동화된 검사도구( FindBugs, CHeckStyle, PMD 등 )를 통한
코드 품질 분석 등의 많은 작업을 수행할 수 있다.
이런 작업들은 자동화된 절차에 따라서 수행할 수 있어야 한다.
■ 개인 빌드 작업
① 개발자가 소프트웨어 소스코드를 작성한다.
② 개인 빌드를 통해 실행 가능한 바이너리 코드를 생성한다.
③ 정상 코드 여부를 판별 후 형상 관리 서버로 작성한 코드를 커밋한다.
■ 통합 빌드 작업
① 개발 서버는 형상 관리 서버로부터 최신의 소스코드를 체크아웃한다.
② 주기적 자동 빌드 프로세스를 통해 코드 빌드 후 동작 가능한 소프트웨어 패키지를 생성한다.
③ 운영 서버로 패키징한 소프트웨어를 배포한다.
프로그램을 빌드하는 과정은 보통 다른 프로그램을 제어하는 프로그램인 빌드 도구에 의해 관리된다.
빌드 도구로는 메이크( Make ), 그래들( Gradle ), 앤트( Ant ), 메이븐( Maven ), SBT 등이 있다.
빌드 도구를 사용하여 자동화 시스템을 구축해 놓는다면 반복 작업과 야근에서 벗어날 수 있다.
STEP#02. 메이븐 개념
메이븐( Mavne )은 유대어로 '지식 축적기'라는 뜻이며, 숙달한 사람, 프로라는 의미로도 사용된다.
소프트웨어를 개발할 때 반복되는 작업을 자동화 하는 빌드 도구다.
메이븐은 빌드 관리 작업의 단순화와 소프트웨어 프로젝트에 참여하는 개발자들에게 공통 인터페이스를 제공하여
프로젝트를 더욱 풍성하게 해주기 때문에 빌드 도구보다는 더 다양한 것들을 포함 하고 있다.
따라서 도구라는 표현보다는 플랫폼이라는 표현이 더 어울릴 듯 하다.
메이븐은 확장 가능한 구조와 나름의 정형화된 구조를 지녀 단지 몇 가지 명령어만 익히면
별도의 스크립트에 대한 지식 없이도 명령어를 사용할 수 있다.
메이븐을 사용하면 표준 프로젝트를 일관된 방식과 구조로 관리하고 배포하고 운영할 수 있다.
① 정형화된 구조와 절차를 제공한다.
메이븐은 컴파일( complie ), 패키징( package ), 테스트( test ) 등의 작업 프로세스를 정형화하고 이를 준수하도록 강제한다.
프로젝트의 소스 트리 구성도 src/main/java 등과 같은 정형화된 패턴을 따르도록 가이드해준다.
모든 프로젝트에 일관된 디렉터리 구조와 빌드 프로세슬르 유지할 수 있게 된다.
따라서 표준에 따른 개발이 가능해진다.
예를 들어 앤트와 같은 빌드 도군느 절차적이어서 항상 컴파일( compile ), 패키징( package ), 테스트( test )처럼
모든 과정을 사용자가 코딩으로 무엇을 할 것인지와 언제 할 것인지에 대하여 정확하게 알려 주어야 하며,
프로젝트를 처음 생성한 개발자에 따라 디렉터리 구조와 빌드 명령이 일관되지 않을 때가 많다.
메이븐은 공식적인 관례( convention )를 가지고 있기 때문에 소스코드의 위치, 바이트 코드의 위치, jar 파일의 위치 등을 알 수 있다.
② 디펜던시 라이브러리 해결을 자동화한다.
디펜던시 라이브러리 혹은 라이브러리 디펜던시는 라이브러리 의존성( 혹은 종속성 )을 의미한다.
어플리케이션을 실행하기 위해 필요한 라이브러리들과 그 라이브러리들이 필요로 하는 라이브러리들을 가리킨다.
JDK가 제공하는 기본적인 라이브러리 이외에 외부 라이브러리를 사용하려면, 먼저 라이브러리를 제공하는 사이트에 버전에 맞게 다운로드 하고,
관계되는 다른 라이브러리들도 다운로드하여 클래스 패스에 등록하는 번거로운 작업을 해야한다.
메이븐을 사용하면 의존 관계인 라리브러리 관리가 용이하다.
오픈소스 라이브러리의 경우 메이븐 중앙 저장소( central repository )에 모두 저장하고 있어서,
디펜던시가 있는 라이브러리의 명세만 입력해주면, 자동으로 다운로드하여 클래스 패스로 걸어주기 때문에, 따로 처리할 필요가 없다.
메이븐의 가장 큰 장점중 하나이다.
③ 라이브러리 관리가 용이하다.
일반적으로 프로젝트 진행 시 사용되는 라이브러리를 형상관리( SCM : Software Configuration Management )도구에서 관리하는데,
이는 불필요한 공간을 낭비할 뿐만 아니라, 버전별로 관리하는 것도 어렵다.
메이븐에서 라이브러리 전용 저장소( repository )를 제공하므로, 통합 관리가 가능하다.
④ 라이프 사이클을 가진다.
메이븐은 사이클을 가지고 있어서 라이프 사이클에 따라서 연속적으로 단계를 실행한다.
플러그인의 골( goal )에 따라 라이프 사이클의 각 단계가 실행된다.
⑤ 다양한 플러그인을 활용할 수 있다.
메이븐은 기본적으로 플러그인으로 기능을 확장한다.
플러그인을 사용하면 IDE 프로젝트로 자동 변환, 데이터베이스 통합, 다양한 리포트 생성등의 작업을 수행할 수 있다.
메이븐은 pom.xml 파일에 위의 내용을 기술한다.
메이븐은 javac, jar, java 등과 같은 기본 명령어는 이미 내장되어 있어 별도로 스크립트를 작성할 필요가 없다.
그 이유는 메이븐의 경우 디렉터리 구조가 정형화되어 있기 때문이다.
따라서 항상 메이븐에서 제시하는 구조를 따라가야 한다.
물론 이러한 점은 유연성이 떨어진다고 할 수 있지만, 다양한 프로젝트들이 메이븐의 표준에 맞추어 개발되어 있다면
어떠한 프로젝트에 가서 진행하더라도 쉽게 해당 프로젝트에 적응할 수 있다.
그뿐만 아나리 메이븐이 제시한느 구존느 이미 자바 프로젝트에서는 표준 구조이므로
오히려 메이븐의 구조에 맞추어 개발하면 보다 표준에 맞는 구조 설계가 가능하다.
메이븐을 사용하여 단위 테스트를 작성하고 실행하고 싶다면, 테스트 코드를 작성하여 ${basedir}/src/test/java에 두고,
JUnit을 test scope의 디펜던시로 추가하고 메이븐의 test 명령을 실행하면 된다.
메이븐은 메이븐 플러그인의 형태로 공통 프로젝트 태스크들을 내장으로 가지고 있기 때문에 이러한 것이 가능하다.
메이븐에 대한 레퍼런스 사이트를 참고하면 더 많은 정보들과 다양한 플러그인들에 대한 문제를 해결할 수 있다.
http://maven.apache.org/plugins/index.html
https://github.com/mojohaus
STEP#03. 메이븐 특징
메이븐을 사용하는 프로젝트에서는 디펜던시 관리, 로컬 및 원격 저장소 사용, 빌드 로직의 전역적인 재사용,
툴에 대한 이식성과 통합 등의 기능을 사용할 수 있으며,
프로젝트 산출물( Project Artifacts )들의 쉬운 검색과 필터링이 가능하다.
다음 그림은 메이븐의 구성을 보여준다.
① Project Object Model( 프로젝트 객체 모델 )
POM은 메이븐의 기본이 되는 모델을 의미한다.
이 모델의 일부는 메이븐 엔진에 이미 내장되어 있고 다른 부분은 pom.xml 파일을 통해 선언적으로 만들어 주어야 한다.
② Dependency Management Model( 디펜던시 관리 모델 )
메이븐 프로젝트의 디펜던시가 어떻게 관리되는지 파악한다.
디펜던시 관리 모듈은 메이븐에 내장되었고 대부분의 요구사항들을 채택했다.
이 모델이 제대로 동작하는 것으로 검증됐으며 현재 주요 오픈소스 프로젝트에 의해 배포된 모델이다.
③ Project Life cycle and Phases( 빌드 라이프 사이클 각 단계 )
POM에 관련된 개념으로 빌드 라이프 사이클과 각 단계들이 있다.
메이븐을 사용할 때 대부분의 작업을 플러그인을 사용하여 수행한다.
메이븐은 잘 정의된 단계들과 빌드 사이클에 따라 이러한 플러그인들을 조율한다.
메이븐을 사용하기 위해 필요한 주요 개념들을 살펴보기로 하자.
'Spring' 카테고리의 다른 글
[Spring] 로그 출력하기 (0) | 2020.12.16 |
---|---|
[Spring] 메이븐 웹 어플리케이션 생성하기 (0) | 2020.12.12 |
[Spring] Spring Tool Suit 다운 및 설정 (0) | 2020.10.23 |
[Spring] Spring 데이터 MongoDB (1) | 2020.10.19 |