๐ ๋ชฉ์ , ๋ฐฐ๊ฒฝ
๋ด๊ฐ ์์๋ ํ์ ๋ฐฑ์๋๋ MSA ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ง์ ๊ณณ์์ ๋ ํฌ๊น์ง ๋๋๊ธฐ๋ ํ์ง๋ง, ์ฐ๋ฆฌํ์ ๋ชจ๋๋ง ๋๋์ด ๋ฉํฐ๋ชจ๋ ๊ตฌ์กฐ๋ก ์ด์ํ๊ณ ์๋ค.
์ฌ๋ฌ ๋ชจ๋์ ๊ด๋ฆฌํ๋ค ๋ณด๋ ์ค๋ณต์ฝ๋๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์์๊ณ , ์ค๋ณต์ฝ๋ ๊ด๋ฆฌ์ ํ์์ฑ์ ๋๋ผ๊ณ ์์๋ค.
์ค๋ณต์ฝ๋๊ฐ ๋ญ๊ฐ ์๋? ์ถ์ ์ ์์ง๋ง, security ์ค์ , ์ธ์ฆํํฐ, swagger ์ค์ ๋ฑ ๋ชจ๋ ๋ชจ๋์์ ์ ์ฉ๋๋ ์ค์ ๋ถํฐ ์์ํด์
๊ฑฐ๋์ ์กฐํ ๊ธฐ๋ฅ, ํ์ผ ์
๋ก๋ ๊ธฐ๋ฅ, ์์
์์ฑ ๋ฐ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ ๋ฑ ๊ธฐ๋ฅ ๋จ์๋ก ์ค๋ณต ์ฝ๋๊ฐ ๋ฐ์ํ๋ค.
์ค๋ณต์ฝ๋๋ ๋ง์์ง์๋ก ๊ธฐ๋ฅ์ ์์ ํ ๋ ๋ชจ๋ ๋ชจ๋์ ๋ค์ด๊ฐ์ ํ์ธ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ์์ ์ ๋์น๊ธฐ ์ฝ๋ค. ํ๋๋ผ๋ ๋์น๋ฉด ์ฅ์ ๋ก ์ด์ด์ง ์ ์๋ ํญํ๊ณผ ๊ฐ์ ์กด์ฌ์ด๋ค! ๐ฃ
์ค๋ณต ์ฝ๋๋ฅผ ๊ด๋ฆฌํด์ผํ ํ์์ฑ์ ์ถฉ๋ถํ ๋๋ ๊ฒ ๊ฐ๊ณ , ๊ทธ๋ผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๋๊ฒ ์ข์๊น?
- Core ๋ชจ๋
multi module ํ๋ก์ ํธ์ core ๋ชจ๋์ ๋๋ ๊ฒ์ ๋ํ ์ฐฌ๋ฐ ๋ ผ๋์ด ๊ฝค ์๋ ๊ฒ์ผ๋ก ์๊ณ ์๋ค.
ํตํฉ์ด๋๋ฏผ์ ๊ตฌ์ถํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ง์ ๋ ผ์๊ณผ ํ ๋ก ์ด ์์์ง๋ง, ๊ฒฐ๊ตญ core ๋ชจ๋์ ๋ง๋ค๊ธฐ๋ก ํ์๋ค.
๊ทธ๋ก ์ธํด ์ฐ๋ฆฌํ์ core ๋ชจ๋์ ์ด๋ฏธ ๊ฐ์ง๊ณ ์์๊ณ , ๋ชจ๋ ๋ชจ๋์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋์ด์ผ๋ง ํ๋ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ๋ค๋ง ๋ชจ์๋์๋ค.
(core ๋ชจ๋์ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ PR์ด ์ฌ๋ผ์ค๋ฉด, ๊ทธ ๋ ์ ํ ๋ก ์ ์ฅ์ด ์ด๋ฆฐ๋ค ๐คฃ)
๊ทธ๋ฌ๋ ์์ ์์ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ core์ ๋ฃ๊ธฐ๋ ๋ถ๋ด์ค๋ฝ๋ค๊ณ ์๊ฐํ๋ค. ์์ ์ ๊ธฐ๋ฅ์ด ๋ฐ๋๋ค๊ณ ๋ชจ๋ ๋ชจ๋์ด ์ํฅ์ ๋ฐ์์ผํ๋? ๋ผ๋ ์๊ฐ์ ํด๋ณด๋ฉด ๋ชจ๋ ์ฌ๋๋ค์ด ๊ทธ๊ฑด ์ข.. ์ด๋ฐ ์๊ฐ์ ํ ๊ฒ์ด๋ค.
๊ทธ๋ผ ํต์ฌ ๊ธฐ๋ฅ์ ์ ์ธํ ๊ณตํต ์ฝ๋๋... ์ด๋์ ๋ฃ์ง...? - Common ๋ชจ๋
common ๋ชจ๋์ ์ด๋ฆ ๊ทธ๋๋ก ๊ณตํต๋๋ ์ฝ๋๋ฅผ ๋ชจ์ผ๋ ๋ชจ๋์ด๋ค.
๋ด๊ฐ ์๊ฐํ๋ ์ฌ์ฉ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฉํฐ ๋ชจ๋์์๋ ๋ชจ๋๋ผ๋ฆฌ ํต์ ์ด ํ์์ ์ด๊ธฐ ๋๋ฌธ์, User ๋ชจ๋ ํธ์ถ์ ์ฌ์ฉํ VO๋ ๋ค๋ฅธ ๋ชจ๋์์๋ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ๋ฒ ํ๋ค.
๊ทธ๋ผ UserVO ํด๋์ค๋ common์ ๋ฃ์ด์ผ์ง~
๊ทธ๋ฌ๋ ์ด๋ฐ ๋ชจ๋์ด ์๊ธฐ๊ฒ ๋๋ฉด ๊ต์ฅํ ์ํํ ์ผ์ด ๋ฐ์ํ๋ค. "๊ณตํต์ฝ๋ ๋ชจ์"์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ชจ๋์ common ๋ชจ๋์ importํ๊ณ ์์ ์ ๋ฐ์ ์๋ค. ๊ทธ๋ผ common์ ๊ธฐ๋ฅ ํ๋๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ชจ๋ ๋ชจ๋์ ์ํฅ์ด ๋ฐ์ํ๊ฒ ๋๋ค!
๊ทธ๋ผ ์ด๋ฐ ์๋ฌธ์ด ๋ค ์ ์๋ค. core๋ ์ฝ๋ ๋ฐ๋๋ฉด ๋ชจ๋ ๋ชจ๋ ์ํฅ ๋ฐ๋๊ฑด ๋๊ฐ์์? ๋ญ๊ฐ ๋ค๋ฅธ๋ฐ?
๋ค๋ฅด๋ค. core๋ ์ด๋ฆ์์ ์ฃผ๋ "ํต์ฌ" ์ด๋ผ๋ ์๋ฐ๊ฐ๊ณผ, "ํ์ ๊ณตํต ๊ธฐ๋ฅ๋ง ์ถ๊ฐ"๋ผ๋ ํ ์ปจ๋ฒค์ ์ผ๋ก ๋ง์ถฐ์ง hardํ ์ฝ๋๋ฆฌ๋ทฐ๋ก ์ ์ ๋๋ค.
์ด์ ๋ฐ๋๋ก common์ ์ฝ๊ฒ ์์ ํ ์ ์์ผ๋ฉฐ, core์ ๊ฐ์ด ํ์๋ค์ ์ฌ๋ฆฌ์ ์๋ฐ๊ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ์ฝ๋๊ฐ ๋ฐ์ํ ํ๋ฅ ์ด ๋๋ค.
common์ ๋ฆฌ์คํฌ๊ฐ ๋๋ฌด ํฌ๋ค! - Library ๋ชจ๋
library๋ ์ด๋ฆ ๊ทธ๋๋ก, ๊ธฐ๋ฅ ๋จ์์ ์ฝ๋๋ฅผ ๋ฌถ์ด์ ์ ๊ณตํ๋ ๋ชจ๋์ด๋ค.
๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํจ์ด ๋ชฉ์ ์ด๋๋งํผ, ๋ฌด์ฐจ๋ณ์ ์ธ ๋ณ๊ฒฝ์ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ค.
๋ํ ๊ธฐ๋ฅ๋ณ๋ก ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์์ง์ฑ๋ ๋์ผ ์ ์๊ณ , ์ํ๋ ๊ณตํต ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๊ธฐ์ ์ ํฉํ๋ค!
์ด๋ฌํ ํ๋ฆ์ผ๋ก ์ฐ๋ฆฌํ์ ํต์ฌ์ฝ๋๋ Core ๋ชจ๋์, ๊ธฐ๋ฅ๋จ์ ์ค๋ณต์ฝ๋๋ Library ๋ชจ๋์ ๋ง๋ค๊ธฐ๋ก ํ์๋ค!
๊ทธ๋ ๊ฒ ํ์ผ ์ ๋ก๋, ์์ , ์ํธํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ด ๊ฐ๋ฐ๋์๋ค.
์ ๋๊ฒ ์ฌ์ฉํ๋ ์ค, ํ ํ์์ด JPA ๊ธฐ๋ฅ์ sort ๊ธฐ๋ฅ์ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก library ๋ชจ๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์๋ค.
library ์ฝ๋๊ฐ ์์ ๋๋ฉด library๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ชจ๋์ด ์ฌ๋น๋๋์ด ๋ฐฐํฌ๋๋ ๋ฐฉ์์ธ๋ฐ, ํ ์๋ฒ๊ฐ ๋จ์ง ๋ชปํ๊ณ ๊ณ์ ์ฃฝ๊ณ ์์๋ค.
์์ธ์ ์ดํด๋ณด๋, library์ JPA ์์กด์ฑ์ด ์ถ๊ฐ๋์๋๋ฐ, ํด๋น ์๋ฒ์์๋ DB๋ฅผ ์ฌ์ฉํ์ง ์์ datasource ์ค์ ์ด ์์ด์ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค.
์ฝ๋ํ๋ ์ถ๊ฐํ๋๋ฐ ์ด๋์ง ๋ชจ๋ฅด๋ ์ด๋ค ์๋ฒ์์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋๊ฑด ๊ต์ฅํ ํฐ ๋ฌธ์ ๋ผ๊ณ ๋๊ปด์ก๋ค.
ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟ์ผ๊ฒ ๋ค...!
๋ฌธ์ ์
ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๊ธฐ ์ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋์ ๋ฌธ์ ์ ์ ๋์ดํด๋ณด์๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ๋ผ๋ฆฌ ์์กด์ฑ์ด ๊ฐํ๋ค
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋ ค๊ณ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋, ๊ธฐ๋ฅ๋จ์๋ก ๋์ด ๋์๋ค๊ณ ์๊ฐํ๋ ์ฝ๋๋ค์ด ์คํ๊ฒํฐ์ฒ๋ผ ์ฎ์ฌ ์์๋ค.
๊ธฐ๋ฅ๋ผ๋ฆฌ ์์กด์ฑ์ ๊ฐ์ง๋ค ๋ณด๋ library๋ฅผ ๋๋์ฑ ๋์ด๋ด๊ธฐ ์ด๋ ค์์ก๊ณ , ๊ธฐ๋ฅ๋ผ๋ฆฌ์ ์์กด์ฑ์ ๋์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. - ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ๋ชจ๋์ ์ํฅ์ ๋ฏธ์น๋ค.
๊ณตํต ๊ธฐ๋ฅ์ ํ๋์ ๋ชจ๋๋ก ๋ฌถ๋ค ๋ณด๋, ๋ชจ๋ ๋ชจ๋์ด library์ ์์กด์ฑ์ ๊ฐ๊ฒ ๋์๋ค.
๊ทธ๋์ library์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๋ชจ๋์ด ๋ฐฐํฌ ๋์ด์ผํ๊ณ , ๋ชจ๋ ๋ชจ๋์ด ์ํฅ์ ๋ฐ๋๋ค.
ํด๊ฒฐ์ฑ
- Library๋ฅผ ๋ฉํฐ๋ชจ๋ ํ๋ก์ ํธ๋ก ๋ถ๋ฆฌํ๊ธฐ
library๋ฅผ github repository๋ก ๋ถ๋ฆฌํ๊ณ , ๊ทธ ์์์ ๊ธฐ๋ฅ๋ค์ ๋ฉํฐ๋ชจ๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค!
repo๋ฅผ ๋ถ๋ฆฌํ๋ฉด์ ๋ค๋ฅธ ๋ชจ๋๋ค๊ณผ ๋ฌผ๋ฆฌ์ ์ธ ์์กด์ฑ์ ๋์ด๋ด๊ณ , ๊ธฐ๋ฅ๋ผ๋ฆฌ์ ์์กด์ฑ์ ๋ฉํฐ๋ชจ๋๋ก ๋์ด๋ด๋ ๋ฐฉ๋ฒ์ด๋ค. - Github Maven Registry๋ฅผ ํ์ฉํ์ฌ ๋ฒ์ ๋ํ๊ธฐ
์ฝ๋ ์ถ๊ฐ ๋ฐ ์์ ์ ๊ธฐ์กด ๋ชจ๋๋ค์ด ์ํฅ์ ๋ฐ์ง ์๊ฒ ํ๋ ค๋ฉด ๋ฒ์ ๋ ์ธ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์์ฝ๊ฒ ํ ์ ์๋ ๋ฐฉ๋ฒ ์์๊น ์ฐพ๋ค๊ฐ maven repository์ ์ฌ๋ฆฌ๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐํ์๊ณ , github์๋ ์กด์ฌํ๊ธธ๋ ๋ํผ ์ฌ์ฉํ์๋ค.
๐ ๏ธ ํ๋ก์ ํธ ๊ตฌ์ฑํ๊ธฐ
์ Github Maven Registry์ธ๊ฐ?
- private maven repository๊ฐ ํ์ํ๋ค
- github์ ๋ํ ์ดํด๋๊ฐ ๋๋ค
- ๋ณด์์ฑ ๊ฒํ ๊ฐ ํ์ ์๋ค.
์ด 3๊ฐ์ง ์ด์ ๋ก ์ฑํํ์๋ค.
GIthub Action ๊ตฌ์ฑํ๊ธฐ
๋ชจ๋ ์ด๋ฆ๊ณผ ๋ฒ์ ์ ๋ฐ๊ณ , github registry์ publishํ๋ ์ฌ์ฌ์ฉ workflow ์์์ด๋ค.
on:
workflow_call:
inputs:
module_name:
required: true
type: string
version:
required: true
type: string
jobs:
publish-package:
runs-on: [ self-hosted ]
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: '17'
cache: 'gradle'
- name: Publish to Github Registry
run: ./gradlew :${{ inputs.module_name }}:publish
env:
MAVEN_USER: ${{ github.repository_owner }}
MAVEN_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ inputs.version }}
Gradle ์ค์ ํ๊ธฐ
- Library ํ๋ก์ ํธ Gradle
์์ค์ฝ๋๋ฅผ ๊ฐ์ด ํฌํจํด์ ๋น๋ํ์ฌ ์ฌ์ฉํ๋ ์ชฝ์์ ์ฝ๋๋ฅผ ํ์ธํ ์ ์๋๋ก ๊ตฌ์ฑํ์๋ค.
import org.springframework.boot.gradle.tasks.bundling.BootJar
plugins {
`maven-publish`
}
allprojects {
apply(plugin = "maven-publish")
group = "com.test.library"
}
subprojects {
val sourceSets = the<SourceSetContainer>()
val sourcesJar = task<Jar>("sourcesJar") {
from(sourceSets["main"].allSource)
archiveClassifier.set("sources")
}
publishing {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/<ORG_NAME>/library")
credentials {
username = System.getenv("MAVEN_USER")
password = System.getenv("MAVEN_PASSWORD")
}
}
}
publications {
create<MavenPublication>(project.name) {
version = System.getenv("VERSION") ?: project.property("VERSION").toString()
artifacts {
artifact(tasks.getByName("jar").outputs.files.singleFile) {
builtBy(tasks.getByName("jar"))
}
artifact(sourcesJar)
}
}
}
}
}
- API ํ๋ก์ ํธ Gradle
์ฌ์ฉํ๋ ๊ณณ์ gradle์๋ maven์ github ์ฃผ์๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.
allprojects {
repositories {
mavenCentral()
maven {
url = uri("https://maven.pkg.github.com/<ORG_NAME>/library")
credentials {
username = System.getenv("MAVEN_USER")
password = System.getenv("MAVEN_PASSWORD")
}
}
mavenLocal()
}
}
๋ง๋ ๋ชจ๋์ importํ๋ ค๋ฉด, ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ ํ๋ฏ์ด ํ๋ฉด ๋๋ค.
implementation("<groupId>:<artifactId>:<version>")
ex) implementation("com.test.library:excel:1.0.0")
๋ธ๋์น ์ ๋ต ์ค์ ํ๊ธฐ
๋ค์ํ ๋ธ๋์น ์ ๋ต์ด ์๋๋ฐ, ๋๋ Github-flow ์ ๋ต์ ์ฑํํ์๋ค. [๊ณต์ ๋ฌธ์]
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฉ์ธ ํ๋ก์ ํธ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ git-flow์ ๊ฐ์ ๋๋ฌด ๋ง์ step์ ๋๊ณ ์ถ์ง๋ ์์๋ค. ๊ทธ๋ฌ๋ ๋ฒ์ ๋ณ๋ก ์ฝ๋๋ฅผ ๊ด๋ฆฌ๋ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ๋จ์ํ github-flow๊ฐ ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ค.
๋ด๊ฐ ์๊ฐํ ๊ฐ๋ฐ ์คํ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- main branch์์ ์๋ก์ด branch ์์ฑ
๋ธ๋์น ๋ช ์ปจ๋ฒค์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
<module_name>/<๋ฒ์ >
ex) excel/1.1.0 - ํด๋น ๋ธ๋์น์์ ๊ฐ๋ฐ ํ PR ์์ฑ
- main branch์ merge ์ github action์ผ๋ก maven registry์ publish
๋ก์ปฌ ๊ฐ๋ฐ ๋ฐฉ๋ฒ
๋ก์ปฌ์์ ๊ฐ๋ฐํ ๊ฒฝ์ฐ ์ ๋์ํ๋์ง ํ์ธ์ด ํ์ํ๋ค. ๊ทธ๋ด ๋ local maven์ผ๋ก publish ํ ๋ค ์ฌ์ฉํ๋ ๋ชจ๋์์ ํ์ธํด๋ณด๋ฉด ๋๋ค.
./gradlew :{{ module_name }}:publishToMavenLocal
ex) ./gradlew :excel:publishToMavenLocal
---
gradle :{{ module_name }}:publishToMavenLocal
ex) gradle :excel:publishToMavenLocal
๋ก์ปฌ์์๋ ์ฃผ์ํด์ผํ ์ ์ด ์๋ค. ๋ก์ปฌ์์ ๊ฐ๋ฐํ๊ธฐ ์ํด Local Maven Registry์ ์ด๋ฏธ publish๊ฐ ๋์ด์๋ค๋ฉด, API ๊ฐ๋ฐํ ๋ Github์์ ๊ฐ์ ธ์จ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ด๋ intellij์์ local maven์ ์ฐพ์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ฐ๋ฉด ๋๋ค.