개요
Spring Boot 3 환경에서 여러 모듈을 구성하는 방법을 설명합니다. 참고로 이 포스팅의 환경은 아래와 같습니다.
Spring Boot: 3.0.2
Java: 17
Gradle
프로젝트 생성

첫 번째 프로젝트를 만듭니다. 위와 같이 구성하고 Spring Web이라는 하나의 종속성만 추가했습니다.
모듈 생성

프로젝트의 최상위 폴더를 마우스 오른쪽 버튼으로 클릭하고 새로 만들기 – 모듈을 클릭합니다.

Gradle을 설정하고 Java를 확인한 후 다음을 클릭합니다.

원하는 모듈의 이름을 입력하십시오. 참고로 이 게시물은 외부 요청을 담당하는 모듈입니다. 고객API 서버 담당 앱 API 2개의 모듈을 만듭니다.
rootProject.name="demo"
include 'clients'
include 'app-api'
위의 과정을 반복하여 Clients와 App API라는 이름의 모듈을 생성하고 settings.gradle 파일을 열면 위와 같이 생성한 모듈이 자동으로 포함되는 것을 확인할 수 있습니다.
최상위 폴더 build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
원래 빌드 당시의 build.gradle을 보면 위와 같습니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
}
subprojects {
// 추가된 부분
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
}
플러그인 아래의 모든 줄 하위 프로젝트 넣고 댓글로 추가한 부분입니다 플러그인 적용위에 주어진 플러그인을 적용하십시오 참고로 최상위 build.gradle 종속성은 모든 하위 모듈에 적용되므로 공유해야 하는 종속성만 지정합니다. 각 모듈 아래의 build.gradle에 각 모듈에 필요한 종속성을 추가합니다.하게 놔둬
앱 API 모듈

현재 폴더 구조는 다음과 같습니다. 첫 번째 프로젝트가 생성될 때 src 폴더가 생성되고 그 아래에 DemoApplication이라는 파일이 있습니다. 이 파일은 서버를 시작하는 진입점이기 때문에 앱-api/src/main/java 하위의 src와 동일 com/예제/데모라는 폴더를 생성합니다.
참고로 아래 클라이언트 모듈은 동일한 폴더 구조를 가지지만 그렇지 않으면 다른 모듈에서 @Component로 설정한 빈을 참조할 수 없다. 물론 SpringBootApplication의 scanBasePackages 옵션으로 해결할 수 있지만 이 방법은 모듈을 추가할 때 옵션을 추가하는 것은 비실용적이다.
돌아가다 앱-api/src/main/java/com/example/demo 폴더에서 DemoApplication.java 파일을 생성하고 src 아래의 내용과 동일하게 작성합니다.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String() args) {
SpringApplication.run(DemoApplication.class, args);
}
}
그리고 최상위 폴더에서 src 폴더 자체를 삭제합니다.
dependencies {
// clients 모듈 추가
implementation project(':clients')
// lombok 추가
implementation 'org.projectlombok:lombok:1.18.20'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2'
}
마지막으로 클라이언트 모듈을 build.gradle에 추가합니다. 구현 프로젝트(‘:모듈 이름’)는 이 모듈에 종속되어 있음을 의미합니다. 그리고 테스트를 위해 Lombok도 추가됩니다.
클라이언트 모듈

앱 API 모듈과 동일한 패키지를 작성한 다음 ClientService라는 파일을 생성합니다. 물론 테스트 목적으로요.
package com.example.demo;
import org.springframework.stereotype.Service;
@Service
public class ClientService {
public void run() {
System.out.println("Client Service");
}
}
그리고 위와 같이 코드를 작성하면 됩니다.
bootJar {
enabled = false
}
jar {
enabled = true
}
그런 다음 build.gradle을 열고 위 콘텐츠를 추가합니다. 고객 모듈의 경우 라이브러리 모듈로 빌드하기 위해 bootJar를 실행하지 마십시오.하기 때문에
시험
package com.example.demo;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class TestController {
private final ClientService clientService;
@GetMapping("/test")
public String test() {
clientService.run();
return "OK";
}
}
app-api/src/main/java/com/example/demo/TestController.java 파일을 생성하고 위의 코드를 작성하여 URL로 접근하면 클라이언트 모듈에 작성된 ClientService가 정상적으로 실행되는 것을 확인할 수 있습니다.
정리하다
– 최상위 build.gradle에는 자주 적용되는 종속성만 지정하고 각 모듈의 build.gradle에는 각 모듈에 필요한 종속성을 작성합니다.
– 다른 모듈에서 생성된 Bean을 성공적으로 가져오기 위해서는 패키지 구조가 동일해야 합니다.
– 구현 프로젝트가 종속되어야 하는 모듈을 지정합니다(‘:모듈 이름’).
