├── admin-api
│ ├── out
│ └── src
├── api
│ ├── out
│ └── src
├── build.gradle
├── core
│ ├── build
│ ├── out
│ └── src
├── gradle
│ └── wrapper
├── gradlew
├── gradlew.bat
└── settings.gradle
- admin-api : admin 관련 API
- api : 일반 유저 api
- core : domain 및 공통 모듈
buildscript {
ext {
springBootVersion = '2.1.5.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath "io.spring.gradle:dependency-management-plugin:1.0.6.RELEASE"
}
}
기본적인 스프링 디펜던시를 정의 합니다.
pluginManagement {
repositories {
gradlePluginPortal()
}
}
rootProject.name = 'multi'
include 'core'
include 'api'
include 'admin-api'
추가할 서브모듈을 include 합니다.
subprojects {
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.module'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
// 서브 모듈에 공통으로 의존성을 추가 시킬 디펜던시를 정의합니다.
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
// 해당 task로 서브 모듈 추가시 기초적인 디렉토리를 자동으로 생성해줍니다.
task initSourceFolders {
sourceSets*.java.srcDirs*.each {
if (!it.exists()) {
it.mkdirs()
}
}
sourceSets*.resources.srcDirs*.each {
if (!it.exists()) {
it.mkdirs()
}
}
}
}
// project를 정의합니다. 공통으로 사용되는 core 모듈을 추가해 줍니다.
project(':core') {
dependencies {
compile('com.h2database:h2')
}
}
project(':api') {
dependencies {
compile project(':core')
implementation 'org.springframework.boot:spring-boot-starter-web'
}
}
project(':admin-api') {
dependencies {
compile project(':core')
implementation 'org.springframework.boot:spring-boot-starter-web'
}
}
해당 gradle 파일을 작성하면 Gradle 기반 멀티 모듈 처럼 자동으로 디렉토리가 생성됩니다.
@Entity
@Table(name = "member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "name", nullable = false)
private String name;
public Member(String name) {
this.name = name;
}
}
public interface MemberRepository extends JpaRepository<Member, Long> {}
간단한 Entity, Repository를 만듭니다.
@RestController
@RequestMapping("/members")
@RequiredArgsConstructor
public class MemberApi {
private final MemberRepository memberRepository;
@PostMapping
public Member create() {
final Member member = new Member("test");
return memberRepository.save(member);
}
@GetMapping
public List<Member> getMembers() {
return memberRepository.findAll();
}
}
Member 생성, 조회가 제대로 동작하는 것을 확인할 수 있습니다. Core 모듈에 있는 MemberRepository Bean 등록이 잘됩니다.
@RestController
@RequestMapping("/members")
@RequiredArgsConstructor
public class MemberApi {
private final MemberRepository memberRepository;
@GetMapping
public List<Member> getMembers() {
return memberRepository.findAll();
}
@PostMapping
public Member create() {
final Member member = new Member("test");
return memberRepository.save(member);
}
}