보통의 구조 아키텍쳐를 구성할 때는 core, common, api 로 크게 3개를 나눕니다.
core는 중요하고 거의 동작하지 않는 서버간의 연결 정도 (RDBMS, NOSQL) 등의 설정을 관리합니다.

common 은 도메인 및 dto, model등을 관리합니다.

api, sender, batch 는 각각의 설정에 따라 분리되어 동작하는 어플리케이션(Service)를 관리합니다.

- core
  - redis
  - db connetion
- common
  - util
- api(request)
  - request Api
- sender
  - local call
- batch

즉, core는 redis 등 타 lib 을 처리하며, common 은 util 성을 처리하고자 합니다.

api 는 외부에서 오는 connection 을 처리하며, sender 는 서버 to 서버 용도로 사용할 경우 각기 다른 용도로 처리하게 됩니다.
batch 는 매분, 매시간, 매일, 매달 돌아가는 배치성 프로세스가 동작할 예정이라, 해당 어플리케이션을 각각의 스프링부트로 별도 구성 예정입니다.
(soft한 MSA)

고민되는 부분이 core 랑 common 은 거의 중복되는 소스로 구성되게 되어, 실제 프로젝트는

api(Request)
   - core
   - common
   - api(request)

sender
   - core
   - common
   - sender

batch
   - core
   - common
   - batch

로 core와 common 이 중복되서 처리되게 될 가능성이 높습니다.

그래서, core 와 common을 별도의 git으로 관리하여 하나의 프로젝트로 처리하는 부분을 고려해야합니다.

즉,

api (개발자가 로컬에서 직접생성)
  - core (core 로 별도의 git 제어)
  - common (common 이라는 별도의 git 제어)
  - api (api 라는 별도의 git 제어)

형태로 처리하고자 합니다.

다만, 같은 git 이나 모듈로 관리하기 편하게 해당 명칭은 앞에 접두사를 붙이는 걸 권합니다. 예를 들어,

extCore
extCommon
extApi

로 한눈에 보이는 것으로 처리하는게 좋습니다!

core 와 common 과 api 가 이미 git에 올라가 있다고 가정했을 때,

인텔리J에서
new Project > gradle > Artifact Coordinates > GroupId 로,
기존 GroupId를 맞춥니다. (올려진 git의 group으로)

만들어진 src를 삭제합니다. 새로워진 프로젝트에는 필요하지 않습니다.

소스트리(SourceTree)를 사용하여, 만들어진 프로젝트 경로에 앞서 말한 core와 api 를 다운받습니다.
만들진 프로젝트는 다음과 같아집니다.

api
  - .gradle
  - .idea
  - gradle
  - xxxCore
  - xxxApi
  build.gradle
  settings.gradle

xxx 를 접두사로 붙여 한줄에 보이도록 조치합니다.

인텔리J에서 Project Structure 를 설정한 후 Modules 에서 new Module을 선택합니다.
new Module > grale > xxxCore 를 생성하면(이미 해당폴더는 소스트리를 통해 clone된 상태) 이미 체크아웃되어있는 git에 연결됩니다.
새롭게 모듈이 생기면서 build.gradle을 새로 갱신하는데, 롤백을 하거나, history를 보고 build.gradle 을 복원해야합니다.

xxCore 는
 - src
 - build.gradle만 설정되면 됩니다.

우선 root 의 settings.gradle 을 확인합니다.

include 'xxxCore'
include 'xxxApi'

이렇게 자동으로 추가되어있을겁니다.

이제 root 프로젝트의 build.gradle을 설정해야합니다.

group 'com.ssp'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

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

/*
plugins {
    id 'org.springframework.boot' version '2.2.6.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}
 */


subprojects {
    group 'com.xxx'
    version '1.0'
    apply plugin: 'java'
    apply plugin: org.springframework.boot.gradle.plugin.SpringBootPlugin
    apply plugin: 'io.spring.dependency-management'

    repositories {
        mavenCentral()
    }

    dependencies {
        // 여기 설정은 sub 프로젝트에 모두 적용됨
        compile('org.springframework.boot:spring-boot-starter-web')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
}

project(':xxxApi') {
    dependencies {
        compile project(':xxxCore')
    }
}

로 설정하면 설정이 끝나게 됩니다.

추가적으로 해당값을 설정시, 실행은 되나 build용 jar 생성에 문제가 있었습니다.

xxxCore 및 실행할 어플리케이션이 필요가 없는 build.gradle에, bootJar와 jar의 설정이 추가로 필요합니다.

bootJar {
    enabled = false
    archiveVersion = '0.0.1-SNAPSHOT'
    archiveExtension = 'jar'
}
jar {
    enabled = true
}

참고주소 : https://jojoldu.tistory.com/123