{"componentChunkName":"component---src-templates-blog-post-js","path":"/springboot/gradle-maven-기본-개념/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"92916326-2301-54a5-9de0-54fe923e3c0d","excerpt":"Gradle, Maven 기본 개념과 Gradle Multi Project Maven, Gradle은 라이브러리 관리, 프로젝트 관리, 단위 테스트 시 의존성 관리를 한다. Maven XML 사용 pom.xml…","html":"<p><img src=\"/assets/gradle-vs-maven-gradle-multi-project.png\" alt=\"Gradle, Maven 기본 개념과 Gradle Multi Project\" title=\"Gradle, Maven 기본 개념과 Gradle Multi Project\"></p>\n<p>Maven, Gradle은 라이브러리 관리, 프로젝트 관리, 단위 테스트 시 의존성 관리를 한다.</p>\n<h2 id=\"maven\" style=\"position:relative;\"><a href=\"#maven\" aria-label=\"maven permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Maven</h2>\n<ul>\n<li>XML 사용</li>\n<li>pom.xml을 이용한 정형화된 빌드 시스템</li>\n<li>자바용 프로젝트 관리 도구.</li>\n<li>아파치 앤트의 대안으로 만들어짐.</li>\n<li>아파치 라이센스로 배포된 오픈 소스 소프트웨어</li>\n</ul>\n<h3 id=\"maven-설정파일\" style=\"position:relative;\"><a href=\"#maven-%EC%84%A4%EC%A0%95%ED%8C%8C%EC%9D%BC\" aria-label=\"maven 설정파일 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Maven 설정파일</h3>\n<p>pom.xml</p>\n<ul>\n<li>플러그인, 의존성 추가를 위한 파일.</li>\n</ul>\n<p><strong>pom.xml</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token prolog\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>project</span> <span class=\"token attr-name\">xmlns</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>http://maven.apache.org/POM/4.0.0<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\"><span class=\"token namespace\">xmlns:</span>xsi</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>http://www.w3.org/2001/XMLSchema-instance<span class=\"token punctuation\">\"</span></span>\n  <span class=\"token attr-name\"><span class=\"token namespace\">xsi:</span>schemaLocation</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>modelVersion</span><span class=\"token punctuation\">></span></span>4.0.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>modelVersion</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>com.coffee<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>coffee-maven<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>0.0.1-SNAPSHOT<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>packaging</span><span class=\"token punctuation\">></span></span>jar<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>packaging</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>name</span><span class=\"token punctuation\">></span></span>coffee-maven<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>name</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>description</span><span class=\"token punctuation\">></span></span>Coffee project for Spring Boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>description</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>parent</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-parent<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>1.5.4.RELEASE<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>relativePath</span><span class=\"token punctuation\">/></span></span> <span class=\"token comment\">&lt;!-- lookup parent from repository --></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>parent</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>properties</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>project.build.sourceEncoding</span><span class=\"token punctuation\">></span></span>UTF-8<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>project.build.sourceEncoding</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>project.reporting.outputEncoding</span><span class=\"token punctuation\">></span></span>UTF-8<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>project.reporting.outputEncoding</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>java.version</span><span class=\"token punctuation\">></span></span>1.8<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>java.version</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>properties</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependencies</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-starter-test<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>scope</span><span class=\"token punctuation\">></span></span>test<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>scope</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependencies</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>build</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugins</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugin</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>spring-boot-maven-plugin<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>plugin</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>plugins</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>build</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>project</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h2 id=\"gradle\" style=\"position:relative;\"><a href=\"#gradle\" aria-label=\"gradle permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Gradle</h2>\n<ul>\n<li>Groovy 사용</li>\n<li>build.gradle을 이용한 정형화된 빌드 시스템.</li>\n<li>안드로이드 앱 공식 빌드 시스템.</li>\n<li>빌드 속도가 maven에 비해 10~100배 가량 빠름.</li>\n<li>JAVA, C/C++, Python등을 지원.</li>\n<li>빌드툴인 Ant Builder와 Groovy 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용 가능.</li>\n</ul>\n<h3 id=\"gradle-설정파일\" style=\"position:relative;\"><a href=\"#gradle-%EC%84%A4%EC%A0%95%ED%8C%8C%EC%9D%BC\" aria-label=\"gradle 설정파일 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Gradle 설정파일</h3>\n<p>build.gradle</p>\n<ul>\n<li>메이븐의 pom.xml 과 비슷한 플러그인, 의존성 추가를 위한 파일.</li>\n</ul>\n<p><strong>build.gradle</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\">buildscript <span class=\"token punctuation\">{</span>\n    ext <span class=\"token punctuation\">{</span>\n        springBootVersion <span class=\"token operator\">=</span> <span class=\"token string\">'1.5.4.RELEASE'</span>\n    <span class=\"token punctuation\">}</span>\n    repositories <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">mavenCentral</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    dependencies <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">classpath</span><span class=\"token punctuation\">(</span><span class=\"token interpolation-string\"><span class=\"token string\">\"org.springframework.boot:spring-boot-gradle-plugin:</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">springBootVersion</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\napply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'java'</span>\napply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'idea'</span>\napply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'org.springframework.boot'</span>\n\nversion <span class=\"token operator\">=</span> <span class=\"token string\">'0.0.1-SNAPSHOT'</span>\nsourceCompatibility <span class=\"token operator\">=</span> <span class=\"token number\">1.8</span>\n\nrepositories <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">mavenCentral</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n\ndependencies <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">compile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'org.springframework.boot:spring-boot-starter'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">testCompile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'org.springframework.boot:spring-boot-starter-test'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"maven-과-gradle\" style=\"position:relative;\"><a href=\"#maven-%EA%B3%BC-gradle\" aria-label=\"maven 과 gradle permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Maven 과 Gradle</h2>\n<ul>\n<li>maven은 프로젝트가 커질수록 빌드 스크립트의 내용이 길어지고 가독성이 떨어진다.</li>\n<li>gradle은 훨씬 적은 양의 스크립트로 짧고 간결하게 작성할 수 있다.</li>\n<li>maven의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 한다.</li>\n<li>gradle은 설정 주입 방식을 사용 한다. (멀티 프로젝트에 매우 적합 하다.)</li>\n</ul>\n<p>아래는 Maven 과 Gradle 의 성능 테스트표 이다.</p>\n<p><img src=\"/assets/gradle-maven-perfoemance.png\" alt=\"Gradle Maven Perfoemance\" title=\"Gradle Maven Perfoemance\"></p>\n<h3 id=\"gradle의-multi-module-이란\" style=\"position:relative;\"><a href=\"#gradle%EC%9D%98-multi-module-%EC%9D%B4%EB%9E%80\" aria-label=\"gradle의 multi module 이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Gradle의 Multi Module 이란</h3>\n<p>Gradle의 Multi Module 이란 프로젝트 구성시 web, app, api 등 용도가 서로 다른 프로젝트를 생성하는 경우를 말한다. 프로젝트가 다르더라도 바라보는 DataBase 가 같다면 기본적인 기능은 상당수가 공통적으로 겹치게 된다. 유지 보수 차원에서 공통적인 부분이 존재 한다면 같은 작업을 여러번 해야한다는 의미 이다. 이러한 문제를 해결하고 빌드를 효율 적으로 하기 위해 Gradle의 Multi Module 을 활용할수 있다.</p>\n<p>아래는 멀티 모듈의 <strong>settings.gradle</strong> 예시 이다.</p>\n<p><strong>settings.gradle</strong></p>\n<p>settings.gradle 파일에 아래와 같이 최상위 프로젝트 이름(coffee)을 지정한다. 이는 해당 프로젝트 디렉토리 이름과 무관하게 설정할수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\">rootProject<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> <span class=\"token string\">'coffee'</span></code></pre></div>\n<p>하위 프로젝트를 include해준다.</p>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\">include <span class=\"token interpolation-string\"><span class=\"token string\">\"shared\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token interpolation-string\"><span class=\"token string\">\"api\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token interpolation-string\"><span class=\"token string\">\"services:webservice\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token interpolation-string\"><span class=\"token string\">\"services:shared\"</span></span></code></pre></div>\n<p>최상위 프로젝트의 <code class=\"language-text\">build.gradle</code>에 모든 서브 프로젝트에 공통된 설정을 넣는다.</p>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\">subprojects <span class=\"token punctuation\">{</span>\n    apply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'java'</span>\n    apply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'eclipse-wtp'</span>\n\n    repositories <span class=\"token punctuation\">{</span>\n       <span class=\"token function\">mavenCentral</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    dependencies <span class=\"token punctuation\">{</span>\n        testCompile <span class=\"token string\">'junit:junit:4.8.2'</span>\n    <span class=\"token punctuation\">}</span>\n\n    version <span class=\"token operator\">=</span> <span class=\"token string\">'1.0'</span>\n\n    jar <span class=\"token punctuation\">{</span>\n        manifest<span class=\"token punctuation\">.</span>attributes provider<span class=\"token punctuation\">:</span> <span class=\"token string\">'gradle'</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>모든 서브 프로젝트에 java, eclipse-wtp 플러그인이 적용되고, 지정된 리포지토리와 의존성이 무조건 추가된다.</p>\n<h3 id=\"gradle-multi-module-structure\" style=\"position:relative;\"><a href=\"#gradle-multi-module-structure\" aria-label=\"gradle multi module structure permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Gradle Multi Module Structure</h3>\n<p>프로젝트가 크게 web, app, api 부분으로 나눠진다고 가정하면 공통되는 부분을 모듈로 빼서 관리하고 각각 프로젝트가 공통 모듈을 참조 하면 된다. 공통 부분을 core 라고 가정 하하면 아래 처럼 구조를 나눌수가 있을 것이다. 국제와 및 MSA 아키텍쳐와 관련이 깊다.</p>\n<table>\n<thead>\n<tr>\n<th>프로젝트명</th>\n<th>용도</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>coffee-multi</td>\n<td>Root 용 프로젝트</td>\n</tr>\n<tr>\n<td>coffee-multi-core</td>\n<td>공통클래스관리</td>\n</tr>\n<tr>\n<td>coffee-multi-web</td>\n<td>Web Application (Sprint boot)</td>\n</tr>\n<tr>\n<td>coffee-multi-app</td>\n<td>APP</td>\n</tr>\n<tr>\n<td>coffee-multi-api</td>\n<td>API</td>\n</tr>\n</tbody>\n</table>\n<p><img src=\"/assets/gradle-multi.png\" alt=\"Gradle Multi Module Structure\" title=\"Gradle Multi Module Structure\"></p>\n<p><strong>settings.gradle</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\">rootProject<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> <span class=\"token string\">'coffee-multi'</span>\ninclude <span class=\"token string\">'coffee-multi-core'</span>\ninclude <span class=\"token string\">'coffee-multi-app'</span>\ninclude <span class=\"token string\">'coffee-multi-web'</span>\ninclude <span class=\"token string\">'coffee-multi-api'</span></code></pre></div>\n<p>위와 같이 루트프로제트명(coffee-multi)을 지정하고 서브프로젝트를 include에 추가하면 된다. build.gradle을 아래와 같이 구성해야 한다.</p>\n<p><strong>build.gradle</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\"><span class=\"token comment\">// coffee-multi</span>\n\nbuildscript <span class=\"token punctuation\">{</span>\n  ext <span class=\"token punctuation\">{</span>\n    springBootVersion <span class=\"token operator\">=</span> <span class=\"token string\">'1.5.6.RELEASE'</span>\n  <span class=\"token punctuation\">}</span>\n  repositories <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">mavenCentral</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  dependencies <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">classpath</span><span class=\"token punctuation\">(</span><span class=\"token interpolation-string\"><span class=\"token string\">\"org.springframework.boot:spring-boot-gradle-plugin:</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">springBootVersion</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span> <span class=\"token function\">classpath</span><span class=\"token punctuation\">(</span><span class=\"token string\">'io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\nsubprojects <span class=\"token punctuation\">{</span>\n  apply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'java'</span>\n  apply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'eclipse'</span>\n  apply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'idea'</span>\n  apply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'org.springframework.boot'</span>\n  sourceCompatibility <span class=\"token operator\">=</span> <span class=\"token number\">1.8</span> repositories <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">mavenLocal</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token function\">mavenCentral</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  task initSourceFolders <span class=\"token punctuation\">{</span>\n    sourceSets <span class=\"token operator\">*</span> <span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">.</span>srcDirs <span class=\"token operator\">*</span> <span class=\"token punctuation\">.</span>each <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>it<span class=\"token punctuation\">.</span><span class=\"token function\">exists</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        it<span class=\"token punctuation\">.</span><span class=\"token function\">mkdirs</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    sourceSets <span class=\"token operator\">*</span> <span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">.</span>srcDirs <span class=\"token operator\">*</span> <span class=\"token punctuation\">.</span>each <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>it<span class=\"token punctuation\">.</span><span class=\"token function\">exists</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        it<span class=\"token punctuation\">.</span><span class=\"token function\">mkdirs</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  dependencies <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">compileOnly</span><span class=\"token punctuation\">(</span><span class=\"token string\">'org.projectlombok:lombok'</span><span class=\"token punctuation\">)</span> <span class=\"token function\">testCompile</span><span class=\"token punctuation\">(</span><span class=\"token interpolation-string\"><span class=\"token string\">\"org.springframework.boot:spring-boot-starter-test\"</span></span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\"><span class=\"token comment\">// coffee-core</span>\n bootRepackage <span class=\"token punctuation\">{</span>\n   enabled <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n <span class=\"token punctuation\">}</span>\n dependencies <span class=\"token punctuation\">{</span>\n   <span class=\"token function\">compile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1'</span><span class=\"token punctuation\">)</span>\n   <span class=\"token function\">runtime</span><span class=\"token punctuation\">(</span><span class=\"token string\">'mysql:mysql-connector-java'</span><span class=\"token punctuation\">)</span>\n   compile <span class=\"token string\">'com.zaxxer:HikariCP:2.6.2'</span>\n <span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"groovy\"><pre class=\"language-groovy\"><code class=\"language-groovy\"><span class=\"token comment\">// coffee-multi-web</span>\napply plugin<span class=\"token punctuation\">:</span> <span class=\"token string\">'war'</span>\ndependencies <span class=\"token punctuation\">{</span>\n  compile <span class=\"token function\">project</span><span class=\"token punctuation\">(</span><span class=\"token string\">':coffee-multi-core'</span><span class=\"token punctuation\">)</span>\n  providedCompile <span class=\"token string\">'javax.servlet:javax.servlet-api:3.1.0'</span>\n  compile <span class=\"token string\">'javax.servlet:jstl:1.2'</span>\n  <span class=\"token function\">compile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'org.springframework.boot:spring-boot-starter-web'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">compile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'org.springframework.boot:spring-boot-starter-security'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">testCompile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'org.springframework.security:spring-security-test'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위와 같이 하면 coffee-multi-web 에서 coffee-multi-core 의 공통 부분을 상속 받아 사용할수 있다.</p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/springboot/gradle-maven-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/#maven\">Maven</a></p>\n<ul>\n<li><a href=\"/springboot/gradle-maven-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/#maven-%EC%84%A4%EC%A0%95%ED%8C%8C%EC%9D%BC\">Maven 설정파일</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/gradle-maven-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/#gradle\">Gradle</a></p>\n<ul>\n<li><a href=\"/springboot/gradle-maven-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/#gradle-%EC%84%A4%EC%A0%95%ED%8C%8C%EC%9D%BC\">Gradle 설정파일</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/gradle-maven-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/#maven-%EA%B3%BC-gradle\">Maven 과 Gradle</a></p>\n<ul>\n<li><a href=\"/springboot/gradle-maven-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/#gradle%EC%9D%98-multi-module-%EC%9D%B4%EB%9E%80\">Gradle의 Multi Module 이란</a></li>\n<li><a href=\"/springboot/gradle-maven-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/#gradle-multi-module-structure\">Gradle Multi Module Structure</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":344},"fields":{"slug":"/springboot/gradle-maven-기본-개념/","image":"/assets/gradle-vs-maven-gradle-multi-project.png","faq":[]},"frontmatter":{"title":"Gradle, Maven 기본 개념과 Gradle Multi Project","date":"2021년 3월 23일","dateISO":"2021-03-23T20:29:29.537Z","updatedISO":null,"category":"springboot","description":"Maven, Gradle은 라이브러리 관리, 프로젝트 관리, 단위 테스트 시 의존성 관리를 한다. Maven은 pom.xml을 이용한 정형화된 빌드 시스템, Gradle은 build.gradle을 이용한 정형화된 빌드 시스템 이다. Gradle은 Multi Project 를 구성 하여 공통된 부분을 효율적으로 활용 할수 있다.","tags":["XML","Groovy","의존성","Gradle","Maven","Gradle Multi Project","빌드시스템"]}}},"pageContext":{"slug":"/springboot/gradle-maven-기본-개념/","previous":{"fields":{"slug":"/javascript/javascript-기본-문법-변수-조건문-반복문-함수/"},"frontmatter":{"title":"JavaScript 기본 문법 변수,조건문,반복문,함수","tags":["Javascript","변수","조건문","반복문","함수"]}},"next":{"fields":{"slug":"/springboot/스프링-부트-구조/"},"frontmatter":{"title":"스프링 부트 구조","tags":["스프링","스프링부트","Spring","SpringBoot","Java","프레임워크","스프링부트구조","아키텍쳐"]}}}},"staticQueryHashes":["213619243","3262363727"]}