22.04.04 Maven & Gradle
Build란? - 아래의 Task들을 자동화, 기술하는 것
- 필요한 라이브러리를 다운 받고, 클래스패스(classPath)에 추가하기
- 소스 코드를 컴파일하기
- 테스트를 실행하기
- 컴파일된 코드를 패키징하기
Build Tool
- Maven
- Gradle
각각의 특징을 잘 살펴보면서 익히자!
Maven
XML 기반으로 설정 모델을 제공하고 pom.xml 파일로 작성할 수 있다.
POM = Project Object Model
Maven의 장점
- 프로젝트 템플릿(archetypes)을 제공 - 같은 설정을 반복하지 않게 해줌
- Dependency 관리
- 플러그인과 외부 라이브러리 분리해서 관리
- dependency를 다운받는 Repository는 로컬도 가능하과 MavenCentral과 같은 공개된 Repo도 가능하다.
Maven Coordinates
현재 많은 프로젝트, 라이브러리들이 있다. 이를 구분하기 위해서는 식별자 역할을 하는 것이 필요한다. MavenCoordinates가 이 역할을 한다.
- group_id : 회사나 단체명 ex) org.springframework
- artifactId : 주로 프로젝트명 ex) order-api
- version : 프로젝트 버전 ex) 5.2.15.RELEASE, 1.0-SNAPSHOT
Maven Build LifeCycle
validate - compile - test - package - verify - install - deploy
min 커맨드라인 툴을 사용해서 각 단계 실행 가능
#mvn <lifecycle>
mvn compile
해당 라이프사이클에 대해서는 추후 자세히 공부하자! 아래 reference 참조
Transitive Dependencies(의존성의 의존성)
*아티팩트란? : packing된 파일
어떤 아티팩트를 의존성으로 추가하면, 그 아티팩트가 가지고 있는 의존성이 함께 추가되는데. 그렇게 추가된 의존성을 Transitive Dependency라고 한다.
좋은 기능이지만, 떄로는 버전 간 충돌, 라이브러리 간 충돌 문제를 야기할 수 있으므로 주의가 필요하다.
Maven은 “nearerst definition” 정책을 채택하고 있는데 해당 프로젝트 기준으로 가까운, 깊이가 같다면 먼저 선언된 아티팩트가 선택된다
의존 범위(Dependency Scope)
- compile : ...를 지정하지 않은 경우, 기본값. 컴팡리 의존성은 프로젝트의 컴파일, 테스트 실행에 라이브러리가 필요할 때 사용
- provided : 일반적으로 JDK 또는 컨테이너가 해당 라이브러리를 제공할 때 설정. 즉 웹 어플리케이션의 경우 JSP와 Servlet API등은 provided 의존성으로 설정
- runtime : 컴파일 시에는 사용되지 않으나, 실행과 테스트트 시에는 필요할 때 설정. ex) JDBC 드라이버
- test : 어플리케이션의 실행에는 사용하지 않으나, 테스트 컴파일 및 실행 시에 필요할 때 설정 ex) easymock, junit
- system : provided 의존성과 비슷, 사용자가 jar 파일의 위치 지정( .. 엘리먼트 사용, jar 파일의 위치 지정). 사용자마다 개발 환경이 다르므로 프로퍼티를 이용하여 jar 파일의 위치 지정하는 것이 좋다.
Gradle
Groovy 기반 or Kotlin으로 빌드 스크립트를 작성하게 도와주는 Build Tool
*Task : 클래스를 컴파일하거나 Jar를 생성하거나 하는 build를 위해 하는 작업
Gradle Build는 하나 이상의 프로젝트를 지원하고, 하나의 프로젝트는 하나 이상의 Task로 구성된다.
Plugin
Plugin : 특정 작업(어플리케이션 개발 등)을 하기 위해서 모아놓은 Task들의 묶음 ex) java, application
스프링 어플리케이션을 개발하기 위해서는 필요한 라이브러리들을 받아온 후 해당 라이브러리들을 사용해 자바 코드를 컴파일하고, 컴파일 된 바이트코드의 묶음을 패키징 해 war, jar 파일?로 만든다. 추가적으로 DB와 통신, 서버와 통신 등 다양한 부분에서 문제가 없는지 테스트를 통해 확인한다.
이러한 작업(Task)들은 모두 Gradle 파일에서 Task 단위로 이루어지는데, 작업들을 일일히 Gradle 파일에 정의해 놓으면 매우 비효율적이므로 이를 미리 만들어 놓은 Plugin 형태로 사용한다.
아직 plugin에 대해서 잘 모르겠다...
Spring Project를 만드는 2가지 방법
Spring Boot CLI를 사용
spring init을 사용하면 Spring Initializer를 통해 프로젝트를 생성한다.
spring init --build maven -j 11 -g org.prgms -a kdt-spring-demo -n kdt-spring-demo -x kdt-spring-demo
위의 명령처럼 CLI 상에서 Spring project를 생성할 수 있다.
spring init의 option을 살펴보려면 spring help init을 사용하면 된다.
Spring Initializer 사용
직관적으로 사용하기 쉽다. CLI와 같은 정보를 입력하면 된다. CLI로 생성하는 것도 Spring Initializer를 사용해서 만드는 것이다!
Reference
Maven
- Maven의 MultiModule
- Maven의 LifeCycle
- Maven 사용자라면 이정도는 알아야지!
- Maven의 의존범위
- Transitive Dependencies
- Maven 의존 충돌 해결방법
Gradle
Author And Source
이 문제에 관하여(22.04.04 Maven & Gradle), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jk05018/22.04.04-Maven-Gradle저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)