Skip to content

jsjune/E-commerce

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

91 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ›’ E-commerce ํ”„๋กœ์ ํŠธ

๐ŸŒŸ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

์ด ํ”„๋กœ์ ํŠธ๋Š” MSA(Microservices Architecture) ๊ธฐ๋ฐ˜์˜ ์ „์ž์ƒ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. MSA๋Š” ๊ฐ ์„œ๋น„์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ์ฒ˜์Œ์—๋Š” Monolithic ์•„ํ‚คํ…์ฒ˜๋กœ ์‹œ์ž‘๋˜์—ˆ์œผ๋‚˜, ์ดํ›„ MSA๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Monolithic ์•„ํ‚คํ…์ฒ˜๋Š” ์ดˆ๊ธฐ ๊ฐœ๋ฐœ์ด ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๋ฉฐ, ๋ฐฐํฌ์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ–ˆ์œผ๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์งˆ ๊ฒฝ์šฐ ์œ ์ง€๋ณด์ˆ˜์™€ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์— ์–ด๋ ค์›€์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ธก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๊ธฐ๋Šฅ์œผ๋กœ๋Š” ์ƒํ’ˆ ๊ด€๋ฆฌ, ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“… ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ๊ธฐ๊ฐ„

2024๋…„ 6์›” 19์ผ ~ 2024๋…„ 7์›” 17์ผ๊นŒ์ง€


๐Ÿ“š STACKS




๐Ÿš€ ์‹œ์ž‘ ๊ฐ€์ด๋“œ

๐Ÿ“ฅ์„ค์น˜

$ git clone --branch local-deploy https://github.com/jsjune/E-commerce.git
$ cd E-commerce

โ–ถ๏ธ์‹คํ–‰

$ ./gradlew docker
$ docker-compose up -d

๐Ÿšจ์ฃผ์˜

  1. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 25๊ฐœ ๋„์›Œ์ง‘๋‹ˆ๋‹ค!!
  2. ํ•ด๋‹น ๋ฐฐํฌ ๋ฒ„์ „์€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์™€ ์ด๋ฉ”์ผ ๊ธฐ๋Šฅ์€ ๋น ์ ธ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“‘ API ๋ช…์„ธ์„œ


๐Ÿ—‚ ERD

์ „) Monolithic

ํ›„) MSA


๐Ÿ›๏ธ Architecture


๐ŸŒŸ ์ฃผ์š” ๊ธฐ๋Šฅ

1. Monolithic์—์„œ MSA ์ „ํ™˜ ์ž์„ธํžˆ ๋ณด๊ธฐ

2. ์ฃผ๋ฌธํ•˜๊ธฐ - EDA (๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜) ์ž์„ธํžˆ ๋ณด๊ธฐ

์ฃผ๋ฌธํ•˜๊ธฐ flow
  1. ๋ ˆ๋””์Šค์—์„œ ์žฌ๊ณ  ์ฐจ๊ฐ๊ณผ ์ƒํ’ˆ ์ •๋ณด ๊ธฐ๋ฐ˜ ์ด๋ฒคํŠธ ๋ฐœ์†ก
  2. ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ์ฃผ๋ฌธ์„œ ์ €์žฅ ํ›„ ๊ฒฐ์ œ ์š”์ฒญ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ„
  3. ๊ฒฐ์ œ ์ปจ์Šˆ๋จธ ์„œ๋ฒ„์—์„œ ๊ฒฐ์ œ ๋‚ด์—ญ ์ €์žฅ๊ณผ ์‹ค์ œ ๊ฒฐ์ œ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ๋‹ค์‹œ order๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ„
  4. ๊ฒฐ์ œ์— ๋Œ€ํ•œ ์ƒํƒœ๊ฐ’์„ ๋ฐ›์€ order๋Š” rollback ์š”์ฒญ์„ ํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์†ก ์š”์ฒญ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ„
  5. ๋ฐฐ์†ก ์ปจ์Šˆ๋จธ ์„œ๋ฒ„์—์„œ ๋ฐฐ์†ก ๋‚ด์—ญ ์ €์žฅ๊ณผ ์‹ค์ œ ๋ฐฐ์†ก ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ๋‹ค์‹œ order๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ„
  6. ๋ฐฐ์†ก์— ๋Œ€ํ•œ ์ƒํƒœ๊ฐ’์„ ๋ฐ›์€ order๋Š” rollback ์š”์ฒญ์„ ํ•˜๊ฑฐ๋‚˜ ์ƒํ’ˆ ์žฌ๊ณ  ๊ฐ์†Œ ์š”์ฒญ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ„
  7. ์ƒํ’ˆ ์ปจ์Šˆ๋จธ ์„œ๋ฒ„์—์„œ ์‹ค์ œ db์— ์žˆ๋Š” ์ƒํ’ˆ์˜ ์žฌ๊ณ  ๊ฐ์†Œ ํ›„ ๋‹ค์‹œ order๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ„
  8. order์—์„œ ์žฌ๊ณ  ๊ฐ์†Œ์— ๋Œ€ํ•œ ์ƒํƒœ๊ฐ’์— ๋”ฐ๋ผ rollback ์š”์ฒญ์„ ๋ณด๋ƒ„
์นดํ”„์นด ๋„คํŠธ์›Œํฌ ์žฅ์• ๊ฐ€ ๋‚œ๋‹ค๋ฉด?
  1. Kafka health check ์ˆ˜ํ–‰
  2. ํ†ต์‹  ๊ฐ€๋Šฅ ์‹œ ์ •์ƒ์ ์œผ๋กœ publish
  3. ํ†ต์‹  ๋ถˆ๊ฐ€ ์‹œ ์ด๋ฒคํŠธ๋ฅผ DB์— ์ €์žฅ
    • ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ด์šฉํ•ด ์นดํ”„์นด์™€์˜ ํ†ต์‹  ์ƒํƒœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒดํฌ
    • ํ†ต์‹  ๊ฐ€๋Šฅ ์‹œ DB์— ์žˆ๋Š” ์ด๋ฒคํŠธ ์ •์ƒ์ ์œผ๋กœ ์ „์†ก

3. ์ฃผ์š” ๋กœ์ง์˜ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 85% ๋‹ฌ์„ฑ

ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€
  • ์ „์ฒด ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€: 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
            }
        }
    }
}

4. ๋กœ๊ทธ ์ค‘์•™ ์ง‘์ค‘ํ™” ์‹œ์Šคํ…œ ๊ตฌ์ถ•

  • ์„œ๋น„์Šค ๋ถ„๋ฆฌ๋กœ ์ธํ•ด ๋กœ๊ทธ ํ™•์ธ์ด ์–ด๋ ค์›Œ์ง์— ๋”ฐ๋ผ, 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

3. ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ ๋ณด๋‚ด๊ธฐ ์†๋„ ๊ฐœ์„ 

  • ์ด๋ฉ”์ผ ์ „์†ก ๋กœ์ง์„ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • ApplicationEventPublisher์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์„ 
  • 12~14์ดˆ โ†’ 30ms, 433๋ฐฐ ์†๋„ ๊ฐœ์„ 

4. ์ƒํ’ˆ ๋“ฑ๋ก ์†๋„ ๊ฐœ์„ 

  • S3 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋กœ์ง์„ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • ApplicationEventPublisher์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์„ 
  • 5์ดˆ -> 100ms, 50๋ฐฐ ์†๋„ ๊ฐœ์„ 

๐Ÿ› ๏ธํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

1. ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์žฌ๊ณ  ๊ฐ์†Œ์— ๋Œ€ํ•œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ์ž์„ธํžˆ ๋ณด๊ธฐ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ํ•˜๋‚˜๋กœ ํ•˜๊ณ  ์ปจ์Šˆ๋จธ๋ฅผ ํ•˜๋‚˜๋งŒ ๋„์› ์„ ๊ฒฝ์šฐ, ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜๊ณผ ๊ทธ์— ๋งž๋Š” ์ปจ์Šˆ๋จธ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๊ฒŒ ๋œ๋‹ค.
  • ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๋™์‹œ์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋˜์–ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: ๋ ˆ๋””์Šค ๋ถ„์‚ฐ๋ฝ ์ ์šฉ

2. ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ ์ž์„ธํžˆ ๋ณด๊ธฐ

  • MultipartFile์„ ์ด๋ฒคํŠธ๋กœ ๋ณด๋‚ด๊ณ  Listener์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ NoSuchFileException์ด ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: MultipartFile์„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด์„œ ํ•ด๊ฒฐ

3. MSA ๋ฐฐํฌ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ ์ž์„ธํžˆ ๋ณด๊ธฐ

์˜ˆ์ƒ ์•„ํ‚คํ…์ฒ˜

์˜ˆ์ƒ ์•„ํ‚คํ…์ฒ˜


๐Ÿ”— ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ

Monolithic์—์„œ MSA๋กœ ์ „ํ™˜๊ธฐ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages