Gradle을 이용하여 멀티 프로젝트를 만드는 방법을 설명합니다.
멀티 프로젝트를 왜 구축할까요?
용도가 다른 프로젝트를 생성하게될때 공통적인 부분들이 존재 할 수 있습니다.
그러면 해당 프로젝트마다 공통 부분을 복사 & 붙여넣기를 작업을 하게되죠.
공통으로 만들어져있지 않다면 해당 부분이 변경될시에 모두다 찾아서 변경해줘야합니다.
하나의 공통 프로젝트를 두고 여러 프로젝트에서 가져다 쓰는 방법으로 구축하면 좋겠죠?

일단 구축하려는 프로젝트 구조입니다.

├── multi-project
│   └── common-core
│   └── common-api
│   └── common-web

multi-project 라는 프로젝트 안에
common-core, common-api, common-web 프로젝트를 만듭니다.

https://start.spring.io/ 를 이용하여 프로젝트를 생성해줍니다.

2018-09-06 9 01 10

해당 프로젝트를 그래들 프로젝트로 import 해주세요.

2018-09-06 9 14 18

이렇게 프로젝트가 생성되었습니다.

이제 build.gradle과 settings.gradle 파일을 수정해서 멀티 프로젝트를 구성해보겠습니다.

build.gradle

buildscript {
	ext {
		springBootVersion = '2.0.4.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

allprojects {

	apply plugin: 'java'
	apply plugin: 'eclipse'
	apply plugin: 'org.springframework.boot'
	apply plugin: 'io.spring.dependency-management'

	group = 'com.multiple'
	version = '0.0.1-SNAPSHOT'
	sourceCompatibility = 1.8

	task initSourceFolders {
		sourceSets*.java.srcDirs*.each {
			if( !it.exists() ) {
				it.mkdirs()
			}
		}

		sourceSets*.resources.srcDirs*.each {
			if( !it.exists() ) {
				it.mkdirs()
			}
		}
	}

	repositories {
		mavenCentral()
	}

	dependencies {
		compile('org.springframework.boot:spring-boot-starter-web')
	}
}

repositories {
	mavenCentral()
}

dependencies {
	compile project(':common-core')
	compile project(':common-api')
	compile project(':common-web')
}

settings.gradle

rootProject.name = 'demo'

include ':common-core', ':common-api', ':common-web'

이렇게하고 변경된 gadle을 적용시키면 아래와 같이 프로젝트가 생성됩니다.

2018-09-06 9 21 37

build.gradle 에서
allprojects 를 사용하면 전체 프로젝트에 적용
subprojects 를 사용하면 하위 프로젝트들 common-core, common-api, common-web 에만 적용이 됩니다.

해당 프로젝트마다 그래들 설정을 할 수 있게 build.gradle을 각각 생성하겠습니다.

├── demo
│   ├── common-core
│   │	├── src
│   │	└── build.gradle
│   ├── common-api
│   │	├── src
│   │	└── build.gradle
│   ├── common-web
│   │	├── src
│   │	└── build.gradle
│   ├── build.gradle
│   ├── settings.gradle

common-core / build.gradle

jar {
    enabled = true
}

bootJar {
    enabled = false
}

dependencies {

    compile('org.springframework.boot:spring-boot-starter-web')
}

common-api / build.gradle

jar {
    enabled = true
}

bootJar {
    enabled = false
}

dependencies {
    compile project(':common-core')

    compile('org.springframework.boot:spring-boot-starter-web')
}

common-web / build.gradle

jar {
    enabled = true
}

bootJar {
    enabled = false
}

dependencies {
    compile project(':common-core')

    compile('org.springframework.boot:spring-boot-starter-web')
}

common-core만 compile project 부분이 빠졌습니다.
common-api 와 common-web 프로젝트에서 common-core 프로젝트를 사용할 수 있게 compile 옵션을 줬습니다.

그리고 프로젝트마다 패키지를 만들고 Application에 ComponentScan을 추가해주세요.

2018-09-06 9 42 35

설정이 모두 끝났습니다.


간단하게 테스트용 api를 만들어보겠습니다.
폴더 구조는 아래와 같습니다.

2018-09-06 9 52 21

common-core 프로젝트에서 만든 ApiResponse를 common-api에서 사용하는 겁니다.

common-core / dto/ApiResponse.java

package com.multiple.common.core.dto;

public class ApiResponse {
    private String status;
    private String description;
    private Object resultObject;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Object getResultObject() {
        return resultObject;
    }

    public void setResultObject(Object resultObject) {
        this.resultObject = resultObject;
    }
}

common-api / controller/IndexController.java

package com.multiple.common.api.controller;

import com.multiple.common.core.dto.ApiResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

    @GetMapping("/")
    public ApiResponse index() {
        ApiResponse apiResponse = new ApiResponse();
        apiResponse.setStatus("200");
        apiResponse.setDescription("테스트!");
        apiResponse.setResultObject("datas");

        return apiResponse;
    }

}
import com.multiple.common.core.dto.ApiResponse;

common.core의 ApiResponse가 import된 걸 볼수 있습니다.
core에 공통으로 쓰는 데이터베이스에 정보와 dto들을 만들어두면 다른 프로젝트에서 사용하면 중복코드도 방지하고 관리하기 쉽습니다.