빌드 도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램이다.
History
1. Make
- 빌드 개념을 확립
- Unix 계열 OS에서 사용
2. Ant
- 1990년대 자바가 등장하면서 Make를 java적용시 생긴 문제를 보안하기 위해 탄생
- Java + XML 도입 하여 Make의 약점이었던 플랫폼 의존 문제를 해결
- 간단하고 사용하기 쉽지만, 복잡한 처리를 하려고 하면 스크립트가 장황해져 관리가 어렵다.
3. Maven
- 빌드 생명주기와 프로젝트 객체모델(POM) 개념을 도입 -> Ant의 문제점인 장황한 빌드스크립트 문제를 해결하였다.
- POM에 메타 데이터를 적용해서 라이브러리 의존관계를 자동으로 관리해주는 기능을 구현
- maven이 빌드툴 세계에 혁명을 가져오긴 했지만, 이해해야할 암묵적인 규칙이 많고 기본 규칙을 벗어난 처리를 하려면 사용이 어려워진다.
4. Gradle
- 지금까지의 빌드 툴이 가진 장점과 스크립트 언어로 유연성 증대
- Maven보다 빠르다.
- 기존 Maven, lvy등 다른 빌드도구와 호환 가능
Maven
프로젝트를 진행하게 되면 많은 라이브러리들을 사용하여 개발하게 된다. 이 때 사용하는 라이브러리들이 많아지게 되면 관리하기 힘들어 지는 경우가 발생한다.
Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.
Lifecycle
maven 에서는 미리 정의하고 있는 빌드 순서가 있으며 이 순서를 라이프사이클이라고 한다. 라이프 사이클의 각 빌드 단계를 Phase라고 하는데 이런 Phase들은 의존관계를 가지고 있다.
- Clean : 이전 빌드에서 생성된 파일들을 삭제하는 단계
- Validate : 프로젝트가 올바른지 확인학고 필요한 모든 정보를 사용할 수 있는 지 확인하는 단계
- Compile : 프로젝트의 소스코드를 컴파일하는 단계
- Test : 유닛(단위) 테스트를 수행하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)
- Package : 실제 컴파일된 소스 코드와 리소스들을 jar등의 배포를 위한 패키지로 만드는 단계
- Verify : 통합테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
- Install : 패키지를 로컬 저장소에 설치하는 단계
- Site : 프로젝트 문서를 생성하는 단계
- Deploy : 만들어진 Package를 원격 저장소에 release하는 단계
위에 9개의 라이프사이클 말고도 더 많은종류의 라이프사이클이 존재한다. 이를 크게 Clean, Build, site 세가지 라이프사이클로 나누고 있다. 각 단계를 모두 수행하는 것이 아니라 원하는 단계까지만 수행할 수도 있으며 test단계는 큰 프로젝트의 경우에 몇시간이 소요될 수도있으니 수행하지 않도록 스킵이 가능하다.
POM (Project Object Model)
Project Object Model 의 정보를 담고있는 파일이며, Maven의 기능을 이용하기 위해 POM이 사용된다.
- 프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등
- 빌드 설정 : 소스, 리소스, 라이프 사이클별 실행한 플러그인(goal)등 빌드와 관련된 설정
- 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
- POM연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등
Gradle
maven의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있다.
안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원한다.
빌드툴인 Ant Builder와 그루비 스크립트를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용가능하다.
장점
- 스크립트 언어로 구성되어 있기때문에, XML과 달리 변수선언, if, else, for등의 로직이 구현가능하여 간결하게 구성 가능하다.
- 라이브러리 관리 : 메이븐 레파지토리를 동일하게 사용할 수 있어서 설정된 서버를 통하여 라이브러리를 다운로드 받아 모두 동일한 의존성을 가진 환경을 수정할 수 있다. 자신이 추가한 라이브러리도 레파지토리 서버에 올릴 수 있다.
- 프로젝트 관리 : 모든 프로젝트가 일관된 디렉토리 구조를 가지고 빌드 프로세스를 유지하도록 도와준다.
- 단위 테스트 시 의존성 관리 : junit 등을 사용하기 위해서 명시한다.
- maven 보다 최대 100배 빠르다.
reference
- https://velog.io/@dnstlr2933/%EC%9E%90%EB%B0%94-%EB%B9%8C%EB%93%9C-%EB%8F%84%EA%B5%AC
- https://velog.io/@dnstlr2933/%EC%9E%90%EB%B0%94-%EB%B9%8C%EB%93%9C-%EB%8F%84%EA%B5%AC
- https://sweeteuna.tistory.com/110
- https://starrykss.tistory.com/276
- https://hyojun123.github.io/2019/04/18/gradleAndMaven/
'Web' 카테고리의 다른 글
Jenkins 적용 (0) | 2022.07.20 |
---|---|
Jenkins 설치 및 적용하기 (0) | 2022.07.19 |
Build, Compile, Link, Deploy (0) | 2021.12.12 |
REST API (0) | 2021.08.24 |
Flutter (0) | 2021.07.19 |