[SpringBoot 전환기] - Maven과 Gradle : 1

SUN·2023년 2월 23일

SpringBoot Migration

목록 보기
1/2

회사에서 레거시 Spring 프로젝트를 SpringBoot로 전환할 일이 생겼는데
기존 Spring 프로젝트가 Maven을 빌드툴으로 사용해서
하는 김에 Gradle로 전환하고자 우선 관련 공부를 해봤다.


Maven과 Gradle

  • 빌드
    • 소스코드 파일을 실행 가능한 소프트웨어 산출물로 만드는 과정
  • 빌드 관리 도구(빌드 툴)
    기술이 빠르게 발전하면서 계속 늘어나는 라이브러리의 추가,
    프로젝트를 진행하면서 라이브러리 버전의 동기화 등을 편리하게 하고자 등장한 도구
    ⇒ 대표적으로 Maven과 Gradle

Ant

  • XML 기반
  • 자동 라이브러리 업데이트 기능이 없음

Maven

  • 아파치 Ant의 대안이다.

  • 프로젝트 진행시 사용하는 수많은 라이브러리들을 관리하는 도구

  • 내가 사용할 라이브러리뿐만 아니라 해당 라이브러리가 작동하는데
    필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운로드

  • 다중 모듈 빌드를 병렬으로 실행할 수 있다.

  • 디펜던시 설정을 위해 XML 파일(pom.xml)을 활용한다.

  • POM = project object model

    • maven의 기능을 이용하기 위해 pom이 사용된다.
    • project object model의 정보를 담고 있는 파일.
    • 주요 기능
      • 프로젝트 정보 : 프로젝트의 이름, 라이센스 등
      • 빌드 설정 : 소스, 리소스, 라이프사이클별 실행한 플로그인 등 빌드와 관련된 설정
      • 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
      • pom 연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈
  • XML

    • 라이브러리가 추가되거나 각각의 라이브러리가 서로 다른 버전의
      라이브러리를 참조하는 종속성을 가지고 있을 경우 관리가 어려워지는 문제
    • XML의 특징인 구조화는 장점이지만 문서 양이 비대해지고 가독성이 떨어지는 문제

이에 대한 대안으로 Gradle 등장

Gradle

  • ant와 Maven의 장점을 모아 2012년에 출시
  • Groovy를 이용한 빌드 자동화 시스템
    • kotlin을 쓰기도 한다.
  • 간결하고 커스터마이징이 간편하다.
    • JUnit에 몇가지 플러그인 (Maven CheckStyle, FindBugs 및 PMD)을 추가해야하는 상황
    • Maven
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>2.12.1</version>
          <executions>
              <execution>
                  <configuration>
                      <configLocation>config/checkstyle/checkstyle.xml</configLocation>
                      <consoleOutput>true</consoleOutput>
                      <failsOnError>true</failsOnError>
                  </configuration>
                  <goals>
                      <goal>check</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
      <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>findbugs-maven-plugin</artifactId>
          <version>2.5.4</version>
          <executions>
              <execution>
                  <goals>
                      <goal>check</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-pmd-plugin</artifactId>
          <version>3.1</version>
          <executions>
              <execution>
                  <goals>
                      <goal>check</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
    • Gradle
      apply plugin:'java'
      apply plugin:'checkstyle'
      apply plugin:'findbugs'
      apply plugin:'pmd'
      version ='1.0'
      repositories {
          mavenCentral()
      }
      dependencies {
          testCompile group:'junit', name:'junit', version:'4.11'
      }
  • 멀티 프로젝트에 유리
    • 멀티 프로젝트
      • 하나의 프로젝트 안에 여러 모듈이 동시에 존재 ⇒ 각 모듈이 공통으로 사용하는 모듈이 존재
    • maven 의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면
      상속을 받아야 하지만 gradle 은 설정 주입 방식으로 이를 해결한다.
  • 증분 빌드로 업데이트가 필요한 부분만 작업해 빌드 속도가 빠르다.
    • 재빌드를 할 때 이전 빌드와 비교하여 다시 빌드할 필요성이
      있는지 없는지 판단하여 필요한 부분만 다시 빌드


Gradle 파일 구조

// 프로젝트의 플러그인 의존성 관리를 위한 설정
buildscript {
		// 전역변수 블록
		// 전역변수는 $전역변수명 으로 사용할 수 있다.
    ext {
        springBootVersion = '2.3.7.RELEASE'
        lombokVersion = '1.18.10'
    }

		// 각종 의존성(라이브러리)들을 어떤 원격저장소에서 받을 지를 정한다.
		// 공개저장소(jcenter)와 maven 저장소를 사용할 수 있다.
		// 상호보완되므로 둘다 사용을 권장
		// mavenCentral은 전통적인 저장소이나, 사용자 라이브러리를 업로드하는 것이 어려움
		// jcenter는 라이브러리 업로드가 간단하다. mavenCentral에도 업로드되도록 자동화.
    repositories {
        mavenCentral()
        jcenter()
    }
		
    dependencies {
        // SpringBoot는 라이브러리들의 버전까지 관리해주는 기능이 있는데 여기에서는 GradlePlugin 2.1.7.RELEASE를 기준으로 라이브러리들의 버전을 관리하겠다는 것이다.
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

// 프로젝트에 포함될 플러그인 설정
// dependencies에 비해 좀 더 폭넓게 쓰이고 core한 외부패키지라고 생각하면 된다.
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
/*
== plugins {
    id 'java'
    id 'eclipse'
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
}
*/

// group은 생성될 artifact의 그룹명이고
// version은 release 버전을 나타낸다. build를 수행하면 jar파일 뒤에 version이 붙어서 나온다.
// sourcecompatibility는 자바 소스를 컴파일 할 때 사용한 java version이다.
group 'gradle.test.javaapp'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

/*
	프로젝트에 추가될 의존성(라이브러리) 설정

	- compile, api
		- 모듈 수정시, 해당 모듈을 의존하고 있는 모듈을 모두 빌드 => 느림
		- compile의 경우 지양을 권장
		- A(api) <- B <- C로 의존하면 A수정시 B,C모두 빌드

	- implementation
		- 모듈 수정 시, 해당 모듈을 직접 의존하는 모듈만 빌드 -> 비교적 빠르다.
		- A(implementation) <- B <- C 로 의존하는 구조라면, A 수정 시 B 만 빌드
	
	- testImplementation
		- 테스트에 사용하는 라이브러리 추가

	- annotationProcessor
		- 어노테이션 기반 라이브러리를 컴파일러가 인식하도록 함
		- ex.) lombok, queryDSL 등

	- compileOnly
		- compile에만 필요하고, runtime에는 필요없는 라이브러리를 추가

*/
dependencies { 
		// 그룹:이름:버전
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // api '...'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    compileOnly "org.projectlombok:lombok:$lombokVersion"
    // runtimeOnly '...'

    annotationProcessor "org.projectlombok:lombok:$lombokVersion"
}

Maven to Gradle

1. Gradle 설치

Windows

* [https://gradle.org/releases/](https://gradle.org/releases/) 에서 binary 파일 다운로드
* C:\Gradle 로 이동
* 환경변수 설정에서 Path에 C:\Gradle\gradle-7.4.2\bin 추가 후 저장

MacOS

brew install gradleCopy

2. 설치확인

  • 터미널을 켜고 gradle -v 를 실행해 잘 설치되었는지 확인

3. Gradle 파일 생성

  • pom.xml 파일이 있는 경로로 이동
  • 해당 경로에서 gradle init을 명령을 실행
  • 확인

  • 언어 선택

  • pom.xml 삭제

4. gradle 적용

5. 테스트

  • 에러 발생시 gradle 파일 커스터마이징으로 해결

참고 자료

https://sabarada.tistory.com/198

https://yozm.wishket.com/magazine/detail/1700/

https://jung-story.tistory.com/115

https://velog.io/@ovan/Gradle프로젝트를-SpringBoot프로젝트로-변경하기

https://velog.io/@appti/Spring-boot에서의-Gradle-설정

profile
백엔드 개발자

0개의 댓글