์ด ํ๋ก์ ํธ๋ MSA(Microservices Architecture) ๊ธฐ๋ฐ์ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. MSA๋ ๊ฐ ์๋น์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ๋ฐฐํฌ๋ ์ ์๋๋ก ํ์ฌ ์์คํ ์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๋ ์ํคํ ์ฒ์ ๋๋ค. ์ด ํ๋ก์ ํธ๋ ์ฒ์์๋ Monolithic ์ํคํ ์ฒ๋ก ์์๋์์ผ๋, ์ดํ MSA๋ก ์ ํ๋์์ต๋๋ค. Monolithic ์ํคํ ์ฒ๋ ์ด๊ธฐ ๊ฐ๋ฐ์ด ๋น ๋ฅด๊ณ ๊ฐ๋จํ๋ฉฐ, ๋ฐฐํฌ์ ํ ์คํธ๊ฐ ์ฉ์ดํ์ผ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง ๊ฒฝ์ฐ ์ ์ง๋ณด์์ ํธ๋ํฝ ์ฒ๋ฆฌ์ ์ด๋ ค์์ด ์์ ๊ฒ์ผ๋ก ์์ธก๋์์ต๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ์ผ๋ก๋ ์ํ ๊ด๋ฆฌ, ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ฑ์ด ์์ต๋๋ค.
2024๋ 6์ 19์ผ ~ 2024๋ 7์ 17์ผ๊น์ง
$ git clone --branch local-deploy https://github.com/jsjune/E-commerce.git
$ cd E-commerce
$ ./gradlew docker
$ docker-compose up -d
- ์ปจํ ์ด๋๊ฐ 25๊ฐ ๋์์ง๋๋ค!!
- ํด๋น ๋ฐฐํฌ ๋ฒ์ ์ ์ด๋ฏธ์ง ์ ๋ก๋์ ์ด๋ฉ์ผ ๊ธฐ๋ฅ์ ๋น ์ ธ์์ต๋๋ค.
1. Monolithic์์ MSA ์ ํ ์์ธํ ๋ณด๊ธฐ
2. ์ฃผ๋ฌธํ๊ธฐ - EDA (๋ถ์ฐ ํธ๋์ญ์ ) ์์ธํ ๋ณด๊ธฐ
์ฃผ๋ฌธํ๊ธฐ flow
- ๋ ๋์ค์์ ์ฌ๊ณ ์ฐจ๊ฐ๊ณผ ์ํ ์ ๋ณด ๊ธฐ๋ฐ ์ด๋ฒคํธ ๋ฐ์ก
- ํด๋น ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฃผ๋ฌธ์ ์ ์ฅ ํ ๊ฒฐ์ ์์ฒญ ์ด๋ฒคํธ๋ฅผ ๋ณด๋
- ๊ฒฐ์ ์ปจ์๋จธ ์๋ฒ์์ ๊ฒฐ์ ๋ด์ญ ์ ์ฅ๊ณผ ์ค์ ๊ฒฐ์ ์์ฒญ์ ๋ณด๋ธ ํ ๋ค์ order๋ก ์ด๋ฒคํธ๋ฅผ ๋ณด๋
- ๊ฒฐ์ ์ ๋ํ ์ํ๊ฐ์ ๋ฐ์ order๋ rollback ์์ฒญ์ ํ๊ฑฐ๋ ๋ฐฐ์ก ์์ฒญ ์ด๋ฒคํธ๋ฅผ ๋ณด๋
- ๋ฐฐ์ก ์ปจ์๋จธ ์๋ฒ์์ ๋ฐฐ์ก ๋ด์ญ ์ ์ฅ๊ณผ ์ค์ ๋ฐฐ์ก ์์ฒญ์ ๋ณด๋ธ ํ ๋ค์ order๋ก ์ด๋ฒคํธ๋ฅผ ๋ณด๋
- ๋ฐฐ์ก์ ๋ํ ์ํ๊ฐ์ ๋ฐ์ order๋ rollback ์์ฒญ์ ํ๊ฑฐ๋ ์ํ ์ฌ๊ณ ๊ฐ์ ์์ฒญ ์ด๋ฒคํธ๋ฅผ ๋ณด๋
- ์ํ ์ปจ์๋จธ ์๋ฒ์์ ์ค์ db์ ์๋ ์ํ์ ์ฌ๊ณ ๊ฐ์ ํ ๋ค์ order๋ก ์ด๋ฒคํธ๋ฅผ ๋ณด๋
- order์์ ์ฌ๊ณ ๊ฐ์์ ๋ํ ์ํ๊ฐ์ ๋ฐ๋ผ rollback ์์ฒญ์ ๋ณด๋
์นดํ์นด ๋คํธ์ํฌ ์ฅ์ ๊ฐ ๋๋ค๋ฉด?
- Kafka health check ์ํ
- ํต์ ๊ฐ๋ฅ ์ ์ ์์ ์ผ๋ก publish
- ํต์ ๋ถ๊ฐ ์ ์ด๋ฒคํธ๋ฅผ DB์ ์ ์ฅ
- ์ค์ผ์ค๋ฌ๋ฅผ ์ด์ฉํด ์นดํ์นด์์ ํต์ ์ํ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌ
- ํต์ ๊ฐ๋ฅ ์ DB์ ์๋ ์ด๋ฒคํธ ์ ์์ ์ผ๋ก ์ ์ก
ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง
- ์ ์ฒด ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง: 80%
- ์ฃผ์ ๋ก์ง์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง: 85% ์ด์
- ์ด๋ก ์ธํด ์ฃผ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ณด์ฅํ์ฌ, ์ฝ๋์ ์์ ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋์์ต๋๋ค.
// ์ปค๋ฒ๋ฆฌ์ง ๊ฒ์ฆ ํ์คํฌ ์ถ๊ฐ task jacocoRootCoverageVerification(type: JacocoCoverageVerification) { dependsOn('jacocoRootReport') executionData.from fileTree(dir: '.', include: '**/build/jacoco/test.exec') sourceDirectories.from files(includedProjects.collect { it.sourceSets.main.allSource.srcDirs }.flatten())// ํน์ ๊ฒฝ๋ก์ ํด๋์ค๋ง ํฌํจ def classFiles = files(includedProjects.collect { it.sourceSets.main.output }.flatten()) classFiles = classFiles.asFileTree.matching { include 'com/*/*/application/**' include 'com/*/*/controller/**' include 'com/*/*/infrastructure/kafka/*Service' include 'com/*/*/infrastructure/kafka/*Producer' include 'com/*/*/infrastructure/repository/**' } classDirectories.from classFiles violationRules { rule { limit { minimum = 0.85 } } } }
- ์๋น์ค ๋ถ๋ฆฌ๋ก ์ธํด ๋ก๊ทธ ํ์ธ์ด ์ด๋ ค์์ง์ ๋ฐ๋ผ, AOP์ ์นดํ์นด๋ฅผ ์ด์ฉํ์ฌ ๋ก๊น ์ง์คํ ์์คํ ์ ๊ตฌ์ถ
- ๊ฐ ์๋น์ค์ ๋ฉ์๋ ์คํ๊ณผ ์์ธ ๋ฐ์ ์ ๋ก๊ทธ๋ฅผ ์์งํ๊ธฐ ์ํด @Aspect๊ณผ @Around ์ด๋๋ฐ์ด์ค๋ฅผ ์ฌ์ฉํด ๋ฉ์๋ ์คํ ์๊ฐ ์ธก์ ๋ฐ ์์ธ ์ ์คํ ํธ๋ ์ด์ค๋ฅผ ๊ธฐ๋ก
1. Monolithic์์ MSA๋ก ์ ํ ์์ธํ ๋ณด๊ธฐ
- ํ ์คํธ๋ ๋ก์ปฌ์์ jmeter๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค.
- ์กฐ๊ฑด์ 100์ด ๋์ ์ ์ง์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ฆ๊ฐํ๋ ์กฐ๊ฑด์ผ๋ก ์ฃผ๋ฌธํ๊ธฐ์ ๋ํ ์์ฒญ ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค.
| ๋ชจ๋๋ฆฌ์ ์ํคํ ์ฒ | MSA (๋๊ธฐ) | MSA (EDA, ๋น๋๊ธฐ) | |
|---|---|---|---|
| 3000๋ช ์ผ ๋ ํ๊ท ์๋ต | 6.3์ด | 13์ด | 0.141์ด |
| 5000๋ช ์ผ ๋ ํ๊ท ์๋ต | 42์ด | 137์ด | 0.196์ด |
| TPS ๊ทธ๋ํ | ๋ถ๊ท์น์ , ํ๊ท 22 ~ 25 TPS |
๋ถ๊ท์น์ , ํ๊ท 15 ~ 20 TPS |
์ผ์ , ํ๊ท 30 ~ 50 TPS |
| Latency ๊ทธ๋ํ | ์ฐ์ํฅ | ์ฐ์ํฅ | ๋๋ถ๋ถ ํ์จ |
- ์ด๋ฅผ ํตํด EDA ๊ธฐ๋ฐ ๋น๋๊ธฐ MSA๊ฐ ์ฑ๋ฅ ๋ฉด์์ ๊ฐ์ฅ ์ฐ์ํจ์ ํ์ธํ ์ ์์ต๋๋ค.
2. ๊ฒ์ ์กฐํ ์ฑ๋ฅ ๊ฐ์ ์์ธํ ๋ณด๊ธฐ
- 500๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ ํ์ต๋๋ค.
| ์๋ต ์๊ฐ | |
|---|---|
| ์ธ๋ฑ์ค | 8500ms |
| ์ปค๋ฒ๋ง ์ธ๋ฑ์ค | 900ms |
| ์บ์ฑ | 15ms |
- ์ด๋ฉ์ผ ์ ์ก ๋ก์ง์ ๋น๋๊ธฐ ํต์ ์ผ๋ก ์ฒ๋ฆฌ
ApplicationEventPublisher์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐํต์ ์ ์ฌ์ฉํ์ฌ ๊ฐ์- 12~14์ด โ 30ms, 433๋ฐฐ ์๋ ๊ฐ์
- S3 ์ด๋ฏธ์ง ์ ๋ก๋ ๋ก์ง์ ๋น๋๊ธฐ ํต์ ์ผ๋ก ์ฒ๋ฆฌ
ApplicationEventPublisher์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐํต์ ์ ์ฌ์ฉํ์ฌ ๊ฐ์- 5์ด -> 100ms, 50๋ฐฐ ์๋ ๊ฐ์
1. ๋ถ์ฐ ํ๊ฒฝ์์ ์ฌ๊ณ ๊ฐ์์ ๋ํ ๋์์ฑ ๋ฌธ์ ์์ธํ ๋ณด๊ธฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก ํํฐ์ ์ ํ๋๋ก ํ๊ณ ์ปจ์๋จธ๋ฅผ ํ๋๋ง ๋์ ์ ๊ฒฝ์ฐ, ๋์์ฑ ๋ฌธ์ ๊ฐ ์ผ์ด๋์ง ์๋๋ค.
- ํ์ง๋ง ์ฑ๋ฅ์ ์ํด ์ฌ๋ฌ๊ฐ์ ํํฐ์ ๊ณผ ๊ทธ์ ๋ง๋ ์ปจ์๋จธ ์๋ฒ๋ฅผ ๋์ฐ๊ฒ ๋๋ค.
- ๊ทธ๋ ๊ฒ ๋๋ฉด ๋์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฒ ๋์ด ๋์์ฑ ๋ฌธ์ ๊ฐ ํฐ์ง ์ ์๋ค.
- ํด๊ฒฐ ๋ฐฉ์: ๋ ๋์ค ๋ถ์ฐ๋ฝ ์ ์ฉ

2. ์ด๋ฏธ์ง ์ ๋ก๋ ๋น๋๊ธฐ ํต์ ์ผ๋ก ๋ณํ ๊ณผ์ ์์ ๋ฌธ์ ๋ฐ์ ์์ธํ ๋ณด๊ธฐ
- MultipartFile์ ์ด๋ฒคํธ๋ก ๋ณด๋ด๊ณ Listener์์ ํด๋น ํ์ผ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ NoSuchFileException์ด ๋ฐ์
- ํด๊ฒฐ ๋ฐฉ์: MultipartFile์ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด์ ํด๊ฒฐ




