Spring Boot 3 Gradle

개요

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을 성공적으로 가져오기 위해서는 패키지 구조가 동일해야 합니다.

– 구현 프로젝트가 종속되어야 하는 모듈을 지정합니다(‘:모듈 이름’).