[프로젝트] 37. MSA(MicroService Architecture) 도입
프로젝트를 마이크로서비스 아키텍처(MSA)로 전환하는 과정은 시스템의 유연성, 확장성 및 유지보수성을 향상시키는 중요한 단계입니다. 기존 모노리스 서비스를 여러 개의 독립적인 모듈로 분리함으로써, 각 모듈은 서로 독립적으로 개발, 배포 및 확장될 수 있습니다. 이러한 구조는 팀 간의 협업을 용이하게 하고, 기능별로 서비스를 빠르게 반복하고 업데이트할 수 있게 합니다.
멀티 모듈 아키텍처 구성
프로젝트는 myshop-core, myshop-user, myshop-activity, myshop-newsfeed의 4개 모듈로 구성됩니다. myshop-core 모듈은 다른 모듈들이 공통으로 의존하는 기능(예: JWT 처리, 공통 도메인 모델 등)을 포함하며, 이를 통해 코드의 중복을 줄이고 모듈 간의 결합도를 낮춥니다.
기존 모듈
MSA 적용
settings.gradle 및 build.gradle 설정
settings.gradle에서는 프로젝트의 멀티 모듈 구성을 정의합니다.
rootProject.name = 'myshop'
include 'myshop-core'
include 'myshop-user'
include 'myshop-activity'
include 'myshop-newsfeed'
build.gradle에서는 모든 서브 프로젝트에 공통적으로 적용될 설정과 의존성을 정의합니다. 이를 통해 프로젝트 전반에 걸쳐 일관된 빌드 및 의존성 관리를 할 수 있습니다.
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.17'
}
repositories {
mavenCentral()
}
bootJar.enabled = false
subprojects {
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
// 관리하는 모듈의 공통 dependencies
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'
implementation 'org.springframework.boot:spring-boot-starter-security'
}
test {
useJUnitPlatform()
}
}
project(':myshop-core') {
dependencies {
implementation 'io.jsonwebtoken:jjwt:0.9.1'
}
bootJar { enabled = false }
jar { enabled = true }
}
project(':myshop-user') {
dependencies {
implementation project(':myshop-core')
}
}
project(':myshop-activity') {
dependencies {
implementation project(':myshop-core')
}
}
project(':myshop-newsfeed') {
dependencies {
implementation project(':myshop-core')
}
}
Core 모듈의 역할
myshop-core 모듈은 시스템의 핵심 기능과 공통적으로 사용되는 구성 요소를 포함합니다. 예를 들어, JWT 인증, 공통 도메인 모델, 데이터베이스 설정 등이 이 모듈에 포함됩니다. 이 모듈은 다른 모듈들이 의존하는 기반이 되어, 시스템 전체의 일관성을 유지하는 데 기여합니다.
각 기능별 모듈
- myshop-user: 사용자 관련 기능(인증, 프로필 관리 등)을 담당합니다. 사용자 모듈은 myshop-core 모듈의 기능을 활용하여 사용자 인증 및 관리 기능을 제공합니다.
- myshop-activity: 사용자의 활동(예: 게시글, 좋아요, 댓글 등)과 관련된 기능을 처리합니다. 이 모듈은 사용자의 상호작용을 관리하고, 사용자 경험을 풍부하게 합니다.
- myshop-newsfeed: 사용자의 뉴스피드를 생성 및 관리합니다. 이 모듈은 사용자가 팔로우하는 다른 사용자의 활동을 집계하여 뉴스피드를 제공합니다.
모듈 간 의존성 관리
각 모듈은 myshop-core 모듈에 정의된 공통 기능에 의존합니다. build.gradle에서는 이러한 의존성을 명시적으로 정의하여, 각 모듈이 필요한 기능을 myshop-core 모듈로부터 가져다 사용할 수 있도록 합니다. 이를 통해 코드의 중복을 최소화하고, 모듈 간의 결합도를 낮추어 각 모듈을 독립적으로 개발 및 유지보수할 수 있습니다.
결론
기존 프로젝트를 멀티 모듈 아키텍처로 전환하는 것은 각 기능별로 서비스를 분리하여 관리할 수 있게 하며, 시스템의 확장성과 유지보수성을 크게 향상시킵니다. 각 모듈이 독립적으로 배포되고 확장될 수 있게 함으로써, 더 빠르고 효율적인 개발 사이클을 지원하고, 팀 간의 협업을 용이하게 합니다.