멀티 모듈 탐험기 (3) - 멀티 모듈 적용하기

suky·2024년 3월 23일
0

멀티 모듈 탐험기

목록 보기
3/4
post-thumbnail

안녕하세요~ 오늘도 어김없이 돌아온 suky 입니다~ 😎
드디어 멀티 모듈 탐험기의 세 번째 장정인 멀티 모듈 적용하기를 하게 되었네요. (눈물이 앞을 가립니다.)
이번 시간에는 Spring boot 기반에서 멀티 모듈을 직접 적용해볼 예정입니다.
최근에는 신기술에 대한 예제 코드를 작성할 때 IntelliJ 창 여러 개 띄워놓고 하기 보다는 하나의 프로젝트 내에서 해결할 수 있는 멀티 모듈의 강력함을 느끼고 있습니다.
다음 포스팅 예정인 GRPC 탐험기에서 멀티 모듈의 실용성을 확인해보실수 있을 것 입니다.
이제 포스팅 시작하겠습니다~ 😁

Spring boot 기반 멀티 모듈 적용하기

이번 시간에는 하나의 프로젝트에 클라이언트와 서버를 띄우면서 Spring boot 환경에서 멀티모듈 기반 모노레포를 구성하는지 알아볼 예정입니다~

전체적인 프로젝트의 플로우는 위와 같습니다. Request Parametername을 보내면 Server에서 Hello ${name}을 반환하고, Client에서 이를 그대로 반환하는 서비스를 구현해볼 예정입니다.

Root Project 생성하기

IntelliJ 유저라서 IntelliJ 기준으로 프로젝트를 진행했습니다.
이를 감안하고 포스트를 읽어주시길 바랍니다. 🙇

먼저 File > New Project에서 프로젝트를 생성하도록 하겠습니다. 프로젝트의 Namemulti-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 Projectbuild.gradle은 공통 설정 정보를 담는다고 이해를 하시면 쉽습니다. Root Project에서 굳이 필요 없는 설정을 제거하고 특성에 맞게 allprojectssubprojects에 분리를 해주도록 하겠습니다.

// Root Project build.gradle

allprojects {
    repositories {
        mavenCentral()
    }
}

subprojects {
}

너무 다이어트를 심하게 시켜버렸네요...
그래도 성공적으로 Root Project를 만들었습니다. 정말 쉽죠?

Server 만들기

Server 모듈을 생성하려면 폴더 구조에서 multi-module-test에서 오른쪽 마우스를 누르고 New > Module을 누르면 됩니다.

Spring Initilizr를 이용해서 세팅을 진행하면 됩니다. Namemulti-module-server로 진행을 했고, spring web만 의존성으로 추가해주었습니다.

그러면 위처럼 multi-module-server라는 모듈이 생긴 것을 확인할 수 있습니다. 모듈 내에서 굳이 gradle을 따로 가지고 있을 필요가 없고, setting.gradleroot project만 가지고 있으면 되므로 삭제하도록 합니다.

이제 멀티 모듈 탐험기 2편에서 본것 처럼 SubProjectmulti-module-server를 추가해주도록 하겠습니다.

// Root Project setting.gradle
rootProject.name = 'multi-module-test'

include 'multi-module-server'

그다음 IntelliJgradle 탭을 보면 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 만들기

서버에서 모듈을 만든 과정과 완전히 동일하므로 해당 과정은 생략할 예정입니다. ClientSub Project명은 multi-module-client입니다.
Client 구성으로 인한 Root Projectsettings.gradlemulti-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

정상적으로 응답받은 것을 확인할 수 있습니다.

최종 프로젝트 구조

마무리

이번 시간에는 멀티 모듈 프로젝트를 간단한 예제로 직접 구성해보았습니다.

가장 간단한 환경을 구성해보았지만 해당 구조는 가장 기초적인 구조입니다. 여러분이 앞으로 작성할 멀티 모듈 베이스의 모노레포도 위의 구조에서 발전한 형태일 것입니다.
어떻게 더욱 발전할 수 있을지는 여러분의 경험에 달렸습니다. 😀

다음 글은 이번 예제 베이스로 멀티 모듈의 강력함을 보여주면서 마무리할 예정입니다! 😁
그럼 안뇽~~ 😎

profile
도전하고 성장하는 개발자입니다 :)

0개의 댓글