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을 사용하면 된다.

SpringBoot CLI 명령어

Spring Initializer 사용

직관적으로 사용하기 쉽다. CLI와 같은 정보를 입력하면 된다. CLI로 생성하는 것도 Spring Initializer를 사용해서 만드는 것이다!

Reference

Maven

Gradle

좋은 웹페이지 즐겨찾기