안녕하세요~ 오늘도 어김없이 돌아온 suky 입니다~ 😎
드디어 멀티 모듈 탐험기의 세 번째 장정인 멀티 모듈 적용하기
를 하게 되었네요. (눈물이 앞을 가립니다.)
이번 시간에는 Spring boot 기반에서 멀티 모듈을 직접 적용해볼 예정입니다.
최근에는 신기술에 대한 예제 코드를 작성할 때 IntelliJ 창 여러 개 띄워놓고 하기 보다는 하나의 프로젝트 내에서 해결할 수 있는 멀티 모듈의 강력함을 느끼고 있습니다.
다음 포스팅 예정인 GRPC 탐험기
에서 멀티 모듈의 실용성을 확인해보실수 있을 것 입니다.
이제 포스팅 시작하겠습니다~ 😁
이번 시간에는 하나의 프로젝트에 클라이언트와 서버를 띄우면서 Spring boot 환경에서 멀티모듈 기반 모노레포를 구성하는지 알아볼 예정입니다~
전체적인 프로젝트의 플로우는 위와 같습니다. Request Parameter
로 name
을 보내면 Server에서 Hello ${name}
을 반환하고, Client에서 이를 그대로 반환하는 서비스를 구현해볼 예정입니다.
IntelliJ 유저라서 IntelliJ 기준으로 프로젝트를 진행했습니다.
이를 감안하고 포스트를 읽어주시길 바랍니다. 🙇
먼저 File > New Project에서 프로젝트를 생성하도록 하겠습니다. 프로젝트의 Name은 multi-module-test
로 지었습니다. 기본 프로젝트에는 의존성을 따로 설치할 일이 없기 때문에 따로 Generators
에서 이용하지는 않았습니다.
Create
버튼을 누르면 위와 같은 폴더 구조를 보실 수 있으신데요. 저는 멀티 모듈 구조를 진행할 것이므로 먼저 src
폴더를 지워주도록 하겠습니다.
그리고 build.gradle을 확인해보시면 다음과 같은 형태입니다.
// Root Project build.gradle
plugins {
id 'java'
}
group = 'org.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
Root Project의 build.gradle은 공통 설정 정보를 담는다고 이해를 하시면 쉽습니다. Root Project에서 굳이 필요 없는 설정을 제거하고 특성에 맞게 allprojects와 subprojects에 분리를 해주도록 하겠습니다.
// Root Project build.gradle
allprojects {
repositories {
mavenCentral()
}
}
subprojects {
}
너무 다이어트를 심하게 시켜버렸네요...
그래도 성공적으로 Root Project를 만들었습니다. 정말 쉽죠?
Server 모듈을 생성하려면 폴더 구조에서 multi-module-test
에서 오른쪽 마우스를 누르고 New > Module을 누르면 됩니다.
Spring Initilizr
를 이용해서 세팅을 진행하면 됩니다. Name은 multi-module-server
로 진행을 했고, spring web
만 의존성으로 추가해주었습니다.
그러면 위처럼 multi-module-server
라는 모듈이 생긴 것을 확인할 수 있습니다. 모듈 내에서 굳이 gradle을 따로 가지고 있을 필요가 없고, setting.gradle은 root project만 가지고 있으면 되므로 삭제하도록 합니다.
이제 멀티 모듈 탐험기 2편에서 본것 처럼 SubProject인 multi-module-server를 추가해주도록 하겠습니다.
// Root Project setting.gradle
rootProject.name = 'multi-module-test'
include 'multi-module-server'
그다음 IntelliJ의 gradle 탭을 보면 multi-module-test 밑에 multi-module-server가 생긴 것을 확인할 수 있습니다.
이제 간단하게 Hello ${name}
을 제공하는 컨트롤러를 만들도록 하겠습니다.
// multi-module-server > HelloController.java
package dev.suky.multimoduleserver;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String replyHelloName(@RequestParam String name) {
return String.format("Hello %s", name);
}
}
Windows cmd에서 테스트한 결과는 다음과 같습니다.
C:\Users\suky>curl localhost:8080/hello?name=suky
Hello suky
오! 서버 구현을 완료했습니다.
서버에서 모듈을 만든 과정과 완전히 동일하므로 해당 과정은 생략할 예정입니다. Client의 Sub Project명은 multi-module-client
입니다.
Client 구성으로 인한 Root Project의 settings.gradle
과 multi-module-client
의 컨트롤러의 구현을 확인하도록 하겠습니다.
// Root Project settings.gradle
rootProject.name = 'multi-module-test'
include 'multi-module-server'
include 'multi-module-client'
// NameController.java
package dev.suky.multimoduleclient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
@RestController
public class NameController {
@GetMapping("/name")
public String echoHelloName(@RequestParam String name) throws IOException, InterruptedException {
HttpClient client = HttpClient.newHttpClient();
String url = "http://localhost:8080/hello?name=" + name;
// GET 요청 생성
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.build();
// 요청 보내고 응답 받기
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
return response.body();
}
}
테스트를 진행해보겠습니다.
C:\Users\suky>curl localhost:8081/name?name=suky
Hello suky
정상적으로 응답받은 것을 확인할 수 있습니다.
이번 시간에는 멀티 모듈 프로젝트를 간단한 예제로 직접 구성해보았습니다.
가장 간단한 환경을 구성해보았지만 해당 구조는 가장 기초적인 구조입니다. 여러분이 앞으로 작성할 멀티 모듈 베이스의 모노레포도 위의 구조에서 발전한 형태일 것입니다.
어떻게 더욱 발전할 수 있을지는 여러분의 경험에 달렸습니다. 😀
다음 글은 이번 예제 베이스로 멀티 모듈의 강력함을 보여주면서 마무리할 예정입니다! 😁
그럼 안뇽~~ 😎