컴퓨터과학/Spring

[Spring] 스프링 MSA 개발하기 - 2: 개별 서비스 모듈구조 설정

waspy 2022. 9. 2. 15:53

🤔 들어가며

MSA의 개별 서비스 개발에 앞서 서비스마다 모듈 구조를 어떻게 구성하는것이 좋을지 고민하며 작성한 글이다.

 

🏢 멀티 모듈 구조 설계

멀티 모듈 구조란 독립적인 프로젝트들을 묶어 모듈로 사용하는 구조를 말한다.

어떤 형태의 모듈 구조를 구성할 까 고민할 때 다음과 같은 것들을 고려하였다.

 

- 각 서비스는 개별의 DB를 가지며 독립된 서비스 형태를 가진다.

- 각 서비스는 프론트, 백오피스 api로 구분된다.

- 프론트 및 백오피스 서비스에서는 같은 영속성 엔티티들을 사용한다.

- 각 서비스는 batch 기능을 가질 수 있다.

 

위의 사항들을 고려하여 설계한 모듈 구조는 다음과 같다.

 

-: 모듈

 

사용자 서비스

- front

 - api (스프링 어플리케이션)

 - service (비즈니스 로직)

 - core (api및 service에서 사용하는 유틸 등 객체)

 

백오피스 서비스 

- management

  - api

 - service

 - core

 

배치 서비스

- batch

 - job

 - scheduler

 - ...

 

영속성 모듈(사용자, 백오피스 서비스에서 의존성을 가져 사용할 수 있는 모듈)

- persistence

 - user (예제)

 - post (예제)

 

 

🐳 gradle 의존성 설정

루트 프로젝트에서 하위 모듈들의 의존성을 모두 관리할 수 있도록 gradle 설정을 해주어야 한다.

프로젝트 내부에 모듈을 생성하고 루트 프로젝트의 setting.gradle에 다음과 같이 모듈 등록을 해준다.

setting.gradle

이후 루트 프로젝트의 build.gradle을 통해 하위 모듈에 대한 라이브러리 의존성과 모듈 상호간 의존성을 설정한다.

 

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.2'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
}

subprojects {
    group 'org.example'
    version '1.0-SNAPSHOT'

    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    ext {
        set('springCloudVersion', "2021.0.3")
    }

    repositories {
        mavenCentral()
    }

    test {
        useJUnitPlatform()
    }

    dependencies {
        ...dependencies
    }

    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }

}

project(":front:api"){
    dependencies {
        implementation project(':persistence:user')
        ...dependencies
    }
}

project(":management:api"){
    dependencies {
        implementation project(':persistence:user')
        ...dependencies
    }
}

 

개별 모듈의 build.gradle을 통해서도 의존성 설정이 가능하며 필요에 따라서 적절히 설정해주면 된다.

반응형