SW/DevOps

DevOps : 프로젝트 빌드 관리 : 방법, 개념

얇은생각 2019. 11. 19. 07:30
반응형

아파치 메이븐

아파치 메이븐

아파치 메이븐은 독립적으로 설치/실행할 수 있고 명령어 기반, 즉 Command 라인 인터페이스로 사용할 수 있습니다. 아파치 메이븐은 소프트웨어 객체 모델 기반의 프로젝트 관리 도구입니다. 프로젝트 관리에 필요한 대부분의 작업을 표준화했고 자동화하였습니다.

프로젝트 관리를 위한 여러 요소들에 대해서 일관된 기준을 제시해줍니다. 예를 들어 디렉토리 구조의 경우 프로젝트마다 혹은 개발자마다 다른 구조를 가져갈 수 있는데, 메이븐을 사용하게 되면 표준에 가깝게 정형화된 구조를 사용하여 많은 혼란을 줄일 수 있습니다. 빌드 절차 역시 메이븐에서 추상화한 프로세스를 따르면 일관된 방식으로 프로젝트를 관리/운영할 수 있습니다.

메이븐의 또 하나의 가장 큰 장점은 자동화된 의존성 관리입니다. 소프트웨어를 개발하다 보면 재사용을 높이기 위하여 모듈화하는 경우가 많고, 여러 개의 구성요소를 조합해야 할 경우가 많습니다. 게다가 오픈소스 라이브러리 사용도 증가하면서 관리해야 할 외부 라이브러리까지 증가하면서 프로젝트의 복잡도는 더욱 높아집니다. 이때 의존 관계에 있는 라이브러리를 관리하는 작업은 매우 번거로운 일입니다.

메이븐은 라이브러리 저장소를 통해 의존 관계에 있는 라이브러리를 자동으로 관리해줍니다. 메이븐의 많은 기능들은 플러그인을 통해서 확장할 수 있습니다. 소스코드 자동 생성이나 리포팅을 위한 작업 등 반복적인 작업을 자동화하는 편의 기능들이 플러그인을 통해 지원됩니다. 소프트웨어 개발은 구조화를 지향하기 때문에 많은 프로젝트의 경우 유사성을 가지게 됩니다.

메이븐은 아키타입 기능을 통해 반복적인 작업을 해소하고 자동화된 프로젝트 관리를 위한 표준화된 탬플릿을 제공합니다. 이를 사용하면 새로운 프로젝트를 시작할 때마다 반복되는 어려움을 덜어줄 수 있습니다. 메이븐은 크게 두 종류의 환경설정이 있습니다. 

하나는 세팅 설정이고 하나는 폼 설정입니다. 두 가지 다 XML 파일 형식으로 되어 있어 확장자는 XML로 끝납니다. 세팅 지점 XML은 메이븐 홈 디렉토리 아래에 위치합니다. 메이븐 빌드 시 다운로드 되는 라이브러리의 로컬 저장소의 경로를 지정하거나 사용자별 프로파일 정보를 설정할 수 있습니다. 

 

pom.xml

Pom.xml 파일은 메이븐을 사용하는 프로젝트마다 하나씩 필요한 설정 파일입니다. 폼(Pom)은 Project Object Model의 줄임말로 프로젝트 객체 모델이라는 형식으로 프로젝트와 관련된 정보를 관리합니다. 폼이 관리하는 정보를 크게 분류해보면 프로젝트의 기본 정보를 나타내는 정보, 메이븐 내부에서 반복적으로 사용되는 상수 값을 정의하는 속성 정보, 다른 라이브러리와의 의존관계를 나타내는 의존성 정보 그리고 프로젝트 빌드를 위한 정보로서 플러그인 정보나 빌드 환경을 관리하는 정보 등으로 구분할 수 있습니다. 이 중 프로젝트 기본 정보는 모델 버전, 그룹 아이디, Aartifact 아이디, 버전, 패키징 정보를 설정합니다.

모델 버전은 메이븐의 모델 버전을 나타내는 것으로 변경할 경우가 거의 없습니다. 그룹 아이디와 Aartifact 아이디는 메이븐에서 프로젝트를 구분하기 위해 사용되는 고유 값을 가지는 식별자입니다. 그룹 아이디는 일반적으로 조직의 도메인 명을 사용하게 되고, Aartifact 아이디는 프로젝트 이름을 사용하게 됩니다.

버전 정보는 프로젝트의 버전을 나타내며, 패키징 정보는 자르, 와르, 폼 등의 패키징 형태를 정의합니다. 메이븐의 기본적인 설정과 플러그인 정보를 포함하고 있는 최상위 폼이 있고, 모든 메이븐 파일은 이를 상속받습니다.

 

STS와 pom.xml

STS에서 메이븐 환경설정과 관련된 부분을 알아보고 실제 프로젝트의 Pom.xml 정보를 살펴보겠습니다. Preference에서 메이븐 메뉴를 통해 메이븐 설정 정보를 확인할 수 있습니다. 유저 세팅을 선택하게 되면 Settings XML 파일과 레파지토리 위치를 확인할 수 있습니다.

실제 프로젝트의 Pom.xml 파일을 보게 되면, 프로젝트 모델 정보와 프로젝트의 정보, Property 정보, 의존성 정보들을 확인할 수 있습니다. 빌드와 플러그인 정보도 정의되어 있는 것을 확인할 수 있습니다.

SRC 밑에, 메인 밑에, 자바 디렉토리 아래에 애플리케이션 소스파일이 위치하고, Resources 디렉토리에는 애플리케이션 설정 파일이나 자원 파일들이 위치합니다. SRC 테스트 아래에 자바 디렉토리에서는 테스트 소스파일이 위치하고, 마찬가지로 Resources 디렉토리 아래에서 테스트를 위한 설정 파일이나 자원 파일을 위치하게 됩니다.

디렉토리 설정은 Pom.xml 환경설정에서 변경할 수도 있습니다. 실제 프로젝트의 디렉토리 내용을 살펴보겠습니다. 소스 밑에, 메인 밑에, 자바 밑에 소스파일들이 위치합니다. Resource 밑에는 환경설정 파일과 여러 가지 자원 파일들이 위치해 있습니다. 테스트 밑에는 테스트 파일이 위치해 있습니다.

 

메이븐 수명 주기

메이븐은 빌드 공정을 미리 정의하고 있으며, 세 가지 형태의 수명주기로 구분하고 있습니다. 각 수명주기는 페이지라고 하는 단계로 구성되어 있습니다. 빌드 수명주기는 컴파일, 테스트, 패키징, 인스톨, 디플로이의 단계를 거칩니다.

컴파일은 소스코드를 컴파일하는 단계입니다. 테스트는 단위 테스트를 수행하는 단계이고, 이 단계가 실패하는 경우 빌드가 실패합니다.

패키징은 패키징의 종류에 따라 결과물을 압축하는 단계입니다. 인스톨은 로컬 환경의 로컬 저장소에 패키징한 결과물을 배포하는 단계입니다.

디플로이는 원격 저장소에 패키징한 결과물을 배포하는 단계입니다.

모든 페이지는 앞단의 페이지에 의존적입니다. 이 얘기는 디플로이는 인스톨을 실행하고, 인스톨은 패키지를, 패키지는 테스트를, 테스트는 컴파일을 실행하게 됩니다.

 

클린 수명 주기

클린 수명주기는 클린 단계로 구성되는데, 메이븐 빌드를 통해 생성된 산출물을 삭제합니다. 일반적으로 빌드 결과물은 타깃 디렉토리 밑에 생성이 되고, 클린을 수행하면 타깃 밑의 모든 내용이 삭제됩니다.

 

사이트 수명 주기

사이트 수명주기는 프로젝트의 문서 정보를 생성합니다. 사이트 페이지는 문서 산출물을 생성하고 사이트 디플로이 페이지는 문서 산출물을 서버에 배포합니다.

 

컴파일 페이지

컴파일하기 전에 먼저 자원을 복사하는 작업부터 시작됩니다. 소스코드 및 자원 파일을 타깃 디렉토리로 복사한 후 소스코드를 컴파일합니다. 컴파일을 위한 버전 정보, 인코딩 정보 등은 컴파일러 플러그인을 통해 설정할 수 있습니다. 일반 소스코드에 대해서 작업이 끝난 다음에는 테스트 소스코드와 자원을 타깃 디렉토리로 복사한 후 테스트 코드에 대한 컴파일을 수행합니다.

 

패키징, 인스톨 및 배포

컴파일과 테스트가 완료되면 빌드 산출물을 자르(Jar) 또는 와르(War) 로 패키징하게 됩니다. 패키징 다음에는 배포해야 하는데 인스톨은 로컬 저장소까지 배포하는 것이고, 디플로이는 원격 저장소까지 배포하는 것입니다. 클린은 타깃 디렉토리의 모든 내용을 삭제합니다. 경우에 따라서 이전에 빌드했던 결과물이 영향을 주기 때문에 빌드 오류가 발생할 수 있습니다. 이때는 명시적으로 클린을 수행한 다음에 다시 빌드를 수행해야 합니다.

일반 개발자가 임의로 여기에 라이브러리를 배포할 수 없습니다. 보통 메이븐 빌드 시 중앙 저장소의 라이브러리를 로컬로 가져올 때 사용하게 됩니다. 원격 저장소는 모든 라이브러리가 중앙 저장소에 있는 것이 아니기 때문에 별도로 저장소를 사용하는 것입니다. 스프링 같은 경우에는 외부에 공개되는 저장소를 운영하지만, 보통 사내 또는 프로젝트용으로 구축하여 사용하게 됩니다. 로컬 저장소는 개발자 PC의 저장소를 말합니다. 빌드를 위해서 다운로드되는 라이브러리들이 정해진 위치에 다운로드됩니다.

 

프로젝트와 모듈

프로젝트는 하나의 프로젝트로 진행할 수도 있고, 규모가 커지는 경우 프로젝트를 분리하기도 합니다. 최근에 마이크로서비스의 경우에는 매우 작은 단위로 프로젝트를 구성하기 때문에 멀티 모듈프로젝트로 관리하는 경우가 많습니다. 메이븐의 모든 설정은 최상위 폼을 상속하고 있습니다. 필요시에는 Parent 폼을 만들고, 그 Parent 폼을 상속받게 할 수 있습니다.

프로젝트에서 공통적으로 사용할 수 있는 모드를 상위 폼으로 활용할 수도 있습니다. 의존성이 있는 상태에서 프로젝트가 여러 모듈로 분리되는 경우에는 빌드하는 것이 쉽지 않습니다. 모듈 줄 설정을 통해서 여러 모듈을 한 번에 빌드할 수 있습니다. 모듈 간의 의존성은 기존의 Dependancy 설정과 동일하게 설정하여 사용도 합니다.

 

자체 저장소 및 아키타입 활용

자체 저장소와 아키타입 등을 활용하면 공통 탬플릿이나 라이브러리 또는 샘플 프로젝트 전파에 유용합니다. 렉서스를 사용하여 직접 원격 저장소를 구축하여 운영할 수 있습니다. 사내의 표준 프레임워크 등의 아키타입을 사용하면 메이븐에서 제공하는 아키타입처럼 원하는 탬플릿으로 프로젝트 뼈대를 제공할 수 있습니다. 프로젝트 시작부터 공통 라이브러리, 공통 설정, 샘플 소스 등을 쉽게 제공해서 프로젝트의 생산성 향상에 도움이 됩니다.

반응형