하나의 스프링 프로젝트에서 하나의 모듈만 사용하지 않고 여러 모듈을 사용해서 분리 할 수 있다
예를 들어, 하나의 프로젝트에 사용자(web)와 관리자(admin) 모듈을 분리해 관리할 수 있다
또, 여러 모듈에서 사용하는 공통된 모듈을 만들어 재사용할 수 있다

  • 모듈을 분리해 관리하면 빌드도 쉽게 할 수 있다
    • ./gradlew:{moduleName}:build
  • 프로젝트 구조
    • Root Project : myapp
    • Sub Module : app-web, app-admin, common
myapp
├─ app-web
│  ├─ src
│  └─ build.gradle
├─ app-admin
│  ├─ src
│  └─ build.gradle
├─ common
│  ├─ src
│  └─ build.gradle
│
├─ .gitignore
├─ gradlew
├─ gradlew.bat
├─ build.gradle
└─ settings.gradle [Root Project 설정파일]

Root Project

  • settings.gradle
rootProject.name = 'myapp'

// 하위 모듈 include
include 'app-web'
include 'app-admin'
include 'common'
  • build.gradle
buildscript {
    ext {      // 변수 선언
        h2Version = '1.4.199'
    }
}

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

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

    group = 'com.sample'
    version = '1.0.0'
    sourceCompatibility = '11'

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    repositories {
        mavenCentral()        
    }    

    dependencies {
        compileOnly "org.projectlombok:lombok"
        annotationProcessor "org.projectlombok:lombok"

        testCompileOnly "org.projectlombok:lombok"
        testAnnotationProcessor "org.projectlombok:lombok"

        runtimeOnly 'com.h2database:h2:${h2Version}'
    }

    test {
        useJUnitPlatform()
    }
}

common

  • 공통 모듈
  • common 모듈에는 main 메서드가 없기 때문에 bootJar, jar 설정을 다음과 같이 해야 한다

  • build.gradle
description = "common module"

bootJar { 
   enabled = false 
}
jar { 
   enabled = true 
}

dependencies {
   
   // spring-boot
   implementation 'org.springframework.boot:spring-boot-starter'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   implementation 'org.springframework.boot:spring-boot-starter-actuator'
   implementation 'org.springframework.boot:spring-boot-starter-validation'
}

app-web

  • 사용자용 모듈

  • build.gradle

description = "app-web module"

dependencies {
    compile project(":common")

    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

app-admin

  • 관리자용 모듈

  • build.gradle

description = "app-admin module"

dependencies {
    compile project(":common")

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

모듈 설정파일 include

모듈을 분리해서 공통 모듈을 사용할 때 설정파일 포함시켜야 할 때가 있다

spring:
  profiles:
    include:
      - common
...