Skip to content

Latest commit

ย 

History

History
285 lines (231 loc) ยท 19.1 KB

File metadata and controls

285 lines (231 loc) ยท 19.1 KB

L1MIT

Service Swagger Quality Gate Coverage Maintainability

์ค‘๊ณ  ์ „์ž๊ธฐ๊ธฐ๋ฅผ ์‚ด ๋•Œ ๊ฐ€์žฅ ๋ถˆ์•ˆํ•œ ๊ฑด "์ด๊ฑฐ ์ง„์งœ ๋ฉ€์ฉกํ•œ๊ฐ€"์ž…๋‹ˆ๋‹ค. L1MIT์€ ๊ทธ ํ™•์ธ์„ ๊ฑฐ๋ž˜ ์ „์— ๋๋‚ด๋Š” ์ค‘๊ณ  ๊ฑฐ๋ž˜ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

  • ํŒ๋งค์ž๋Š” ๊ธฐ๊ธฐ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด์„œ ์ƒํƒœ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ํ†ต๊ณผํ•˜๊ณ , ํ•ญ๋ชฉ๋งˆ๋‹ค ์‚ฌ์ง„ยท์˜์ƒ ์ฆ๊ฑฐ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.
  • ๊ตฌ๋งค์ž๋Š” ๊ทธ ๊ฒ€์ˆ˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ , ํ•„์š”ํ•˜๋ฉด ํŒ๋งค์ž์™€ ์˜์ƒํ†ตํ™”๋กœ ๊ธฐ๊ธฐ๋ฅผ ์ง์ ‘ ํ™•์ธํ•œ ๋’ค ๊ฒฐ์ œํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ์ œ ๋Œ€๊ธˆ์€ ๊ตฌ๋งค์ž๊ฐ€ ๋ฌผ๊ฑด์„ ๋ฐ›๊ณ  ํ™•์ •ํ•  ๋•Œ๊นŒ์ง€ ๋ณด๊ด€๋˜๋ฉฐ, ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์žฌ๊ฒ€์ˆ˜์™€ ํ™˜๋ถˆ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๐Ÿ’ป Tech Stacks

๊ตฌ๋ถ„ ๊ธฐ์ˆ 
Backend Java 21, Spring Boot 4.0.7, Spring Data JPA, Spring Data MongoDB, Spring Data Redis, Spring Security, Spring WebSocket, Flyway, springdoc-openapi 3.0.3, AWS SDK for Java v2 (S3)
Frontend Vue 3.4, Vite 7, Vue Router 4, Tailwind CSS 3.4, Chart.js, ffmpeg.wasm, Sentry
Desktop Scanner .NET 8 (SDK 8.0.415), WinForms, dxdiagยทpowercfg ๊ธฐ๋ฐ˜ ๋ฌด์„ค์น˜ ๋‹จ์ผ ์‹คํ–‰ ํŒŒ์ผ
Data MySQL 8.4, MongoDB 8.0, Redis 7.4
Media / RTC S3 presigned upload, CloudFront, coturn(TURN), WebSocket ์‹œ๊ทธ๋„๋ง
Infrastructure ๋‹จ์ผ EC2, Docker Compose, Nginx, Blue-Green, Terraform(dnsยทfrontendยทoperations), Cloudflare
Observability Prometheus 3.4, Loki 3.5, Grafana 12, Alertmanager, Grafana Alloy, node-exporter, cAdvisor, mysqld/mongodb/redis/nginx exporter
CI/CD GitLab CI, Spotless, JaCoCo, SonarQube, OWASP Dependency-Check, Trivy ์ปจํ…Œ์ด๋„ˆ ์Šค์บ”, Secret ์Šค์บ”
Test JUnit 5, Spring Boot Test, Testcontainers 2.0.5, Vitest 3, Vue Test Utils, xUnit(Scanner)

๐Ÿ—๏ธ System Architecture

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

๋„๋ฉ”์ธ ๊ฒฝ๊ณ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ํ”Œ๋žซํผ ์ฑ…์ž„์€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„˜๊ธด ๋ชจ๋“ˆ๋Ÿฌ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ EC2 ์œ„์—์„œ Blue-Green ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ์™€ ๊ด€์ธก ์Šคํƒ์„ ํ•จ๊ป˜ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.

1. ํŠธ๋ž˜ํ”ฝ ์ œ์–ด ๋ฐ ๋ณด์•ˆ (Traffic & Security)

  • Cloudflare & SSL: ๋„๋ฉ”์ธ(l1mit.shop) ์—ฐ๊ฒฐ๊ณผ HTTPS ๋ณด์•ˆ ํ†ต์‹ , CDN ์บ์‹ฑ, ๋น„์ •์ƒ ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • Nginx: ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ ๋™์ž‘ํ•˜๋ฉฐ Blue์™€ Green ์ค‘ ํ˜„์žฌ ํ™œ์„ฑ ์Šฌ๋กฏ์œผ๋กœ ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  • Spring Security & JWT: ๋ชจ๋“  API์˜ ์ธ์ฆยท์ธ๊ฐ€๋ฅผ ๋‹จ์ผ ํ•„ํ„ฐ ์ฒด์ธ์—์„œ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • coturn: ํ™”์ƒ ๊ฒ€์ˆ˜์˜ ์˜์ƒยท์Œ์„ฑ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฆด๋ ˆ์ดํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฐฐํฌ ๋ฐ ์šด์˜ ์ž๋™ํ™” (Delivery & Operations)

  • GitLab CI: guard โ†’ test โ†’ quality โ†’ package โ†’ deploy โ†’ verify 6๋‹จ๊ณ„๋กœ ๊ฒ€์ฆ๊ณผ ๋ฐฐํฌ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Blue-Green Deployment: ์œ ํœด ์ƒ‰์ƒ์„ ๋จผ์ € ๋„์šฐ๊ณ  readiness์™€ ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ ๋’ค์—๋งŒ ํŠธ๋ž˜ํ”ฝ์„ ๋„˜๊น๋‹ˆ๋‹ค. ์‹คํŒจํ•˜๋ฉด ๊ธฐ์กด ์ƒ‰์ƒ์ด ๊ณ„์† ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Docker Compose: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ยท๋ฐ์ดํ„ฐยท๊ด€์ธก ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜์˜ ์ •์˜๋กœ ๋ฌถ์–ด ๋กœ์ปฌ๊ณผ ์šด์˜์— ๊ฐ™์€ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Terraform: DNS, ํ”„๋ก ํŠธ ๋ฐฐํฌ ๋ฒ„ํ‚ท, ์šด์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Flyway: DB ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๋ฒ„์ „์œผ๋กœ ๋‚จ๊ธฐ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ ์‹ค์ œ ์Šคํ‚ค๋งˆ์™€ ๋Œ€์กฐํ•ฉ๋‹ˆ๋‹ค.

3. ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด (Domain Layer)

Domain Description
Product ์ƒํ’ˆ ๋“ฑ๋กยท๊ฒ€์ƒ‰ยท์ฐœยท์กฐํšŒ์ˆ˜, ๊ธฐ๊ธฐ ์นดํƒˆ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธยท์ƒ‰์ƒยท์šฉ๋Ÿ‰ ์„ ํƒ
Inspection AI ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ, ํ•ญ๋ชฉ๋ณ„ ์ฆ๊ฑฐ ์—…๋กœ๋“œ์™€ ์ด๋ ฅ, dxdiagยท๋ฐฐํ„ฐ๋ฆฌ ๋ฆฌํฌํŠธ ํŒŒ์‹ฑ๊ณผ ์ง„๋‹จ ๊ฐ’ ํ™•์ •, ์ƒํ’ˆ ์ง„๋‹จ ์š”์•ฝ, ์žฌ๊ฒ€์ˆ˜ ์š”์ฒญ
RTC / Call WebRTC ์‹œ๊ทธ๋„๋ง๊ณผ ํ™”์ƒ ๊ฒ€์ˆ˜ ํ†ตํ™” ๊ธฐ๋ก
Chat WebSocket ๊ธฐ๋ฐ˜ ๊ตฌ๋งค์žโ€“ํŒ๋งค์ž ์‹ค์‹œ๊ฐ„ ๋ฌธ์˜
Payment / Refund / Settlement ๊ฒฐ์ œ ์Šน์ธยท์ทจ์†Œยท์žฌ์‹œ๋„, PG ๋Œ€์‚ฌ ๋ณต๊ตฌ, ํ™˜๋ถˆ, ํŒ๋งค์ž ์ •์‚ฐ
Auth / Member / Seller ์†Œ์…œ ๋กœ๊ทธ์ธ๊ณผ ์ด๋ฉ”์ผ ์ธ์ฆ, ํšŒ์› ์ •๋ณด, ํŒ๋งค์ž ์ „ํ™˜
Admin ๊ธฐ๊ธฐ ๋ชจ๋ธ ์Šน์ธ ์š”์ฒญ ์ฒ˜๋ฆฌ์™€ ์šด์˜ ๋„๊ตฌ

๊ฐ ๋„๋ฉ”์ธ์€ com.c203.limit.domain.<domain> ์•„๋ž˜์— ์ž์‹ ์˜ controller, service, entity, repository, dto๋ฅผ ๋‘๊ณ , ๋„๋ฉ”์ธ๋ผ๋ฆฌ๋Š” Entity๋ฅผ ์ง์ ‘ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ  ServiceยทIDยท์ด๋ฒคํŠธ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ณตํ†ต ์‘๋‹ตยท์˜ˆ์™ธยท์„ค์ •ยท๋ณด์•ˆยท๋กœ๊น…์€ global์ด ๋งก์Šต๋‹ˆ๋‹ค.

4. ๊ธฐ๊ธฐ ์ง„๋‹จ ํŒŒ์ดํ”„๋ผ์ธ (Device Diagnostics)

๊ฒ€์ˆ˜ ์‹ ๋ขฐ๋„๋ฅผ ์‚ฌ๋žŒ์˜ ์ง„์ˆ ์ด ์•„๋‹ˆ๋ผ ๊ธฐ๊ธฐ๊ฐ€ ๋‚ด๋†“๋Š” ๊ฐ’์œผ๋กœ ๋’ท๋ฐ›์นจํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

  • Windows Scanner: windows-scanner/์˜ .NET 8 WinForms ๋ฌด์„ค์น˜ ์‹คํ–‰ ํŒŒ์ผ์ด dxdiag.exeยทpowercfg.exe๋ฅผ ๋Œ๋ ค ์ง„๋‹จ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ์›น์—์„œ ๋ฐœ๊ธ‰ํ•œ ์ผํšŒ์šฉ ์—ฐ๊ฒฐ ์ฝ”๋“œ๋กœ ๊ฒ€์‚ฌ ์„ธ์…˜์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ ๋ฐฐํฌ ์‚ฐ์ถœ๋ฌผ์˜ /downloads/LimitScanner.exe๋กœ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ € ์‹ค๋™์ž‘ ์ ๊ฒ€: frontend/src/features/deviceCheck์—์„œ ์นด๋ฉ”๋ผยท๋งˆ์ดํฌยท์Šคํ”ผ์ปคยทํ‚ค๋ณด๋“œยทํฌ์ธํ„ฐ๋ฅผ ๋ธŒ๋ผ์šฐ์ € API๋กœ ์ง์ ‘ ๋™์ž‘์‹œ์ผœ ๊ฒฐ๊ณผ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค. ์‹คํŒจ ํ•ญ๋ชฉ์€ ์žฌ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๊ณ  ์ž„์‹œ์ €์žฅ์—๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.
  • ์ง„๋‹จ ๊ฐ’ ํ™•์ •๊ณผ ์ง‘๊ณ„: ์—…๋กœ๋“œ๋œ dxdiagยท๋ฐฐํ„ฐ๋ฆฌ ๋ฆฌํฌํŠธ์™€ ์‹ค๋™์ž‘ ๊ฒฐ๊ณผ๋ฅผ ํ•ญ๋ชฉ๋ณ„ ์ง„๋‹จ ๊ฐ’์œผ๋กœ ์ •๊ทœํ™”ํ•˜๊ณ , ํŒ๋งค์ž๊ฐ€ ํ™•์ •ํ•œ ๊ฐ’๋งŒ ์ƒํ’ˆ ์ง„๋‹จ ์š”์•ฝ์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์—ฐ๊ณ„: ๊ธฐ๊ธฐ ํƒ€์ž…(์Šค๋งˆํŠธํฐยท๋…ธํŠธ๋ถ)๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์— ์ง„๋‹จ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•ด ์ž๋™ ํ†ต๊ณผ ํ•ญ๋ชฉ๊ณผ ์ˆ˜๋™ ์ฆ๊ฑฐ๊ฐ€ ํ•„์š”ํ•œ ํ•ญ๋ชฉ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ธ ๊ณ„์•ฝ์€ docs/api/windows-auto-inspection.md, docs/api/device-checklist-generation.md, docs/api/laptop-checklist-generation.md์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์„ค๊ณ„ ํŒ๋‹จ์€ ๋ฌธ์„œ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค. ์ƒํ’ˆ ๋ชฉ๋ก ์กฐํšŒ์˜ N+1์„ @EntityGraph + ์ผ๊ด„ ์ง‘๊ณ„๋กœ ํ•ด์†Œํ•ด ์ฟผ๋ฆฌ 402ํšŒ โ†’ 4ํšŒ๋กœ ์ค„์ธ ๊ธฐ๋ก์€ docs/api/product.md์—, ์กฐํšŒ์ˆ˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„(์œ ์‹ค ํ—ˆ์šฉ ๋ฒ”์œ„์™€ ํ›„์† ๊ณผ์ œ)๋Š” docs/adr/0005-product-view-count.md์— ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์™ธ๋ถ€ ์—ฐ๋™ (Persistence & Integration)

  • MySQL: ์ƒํ’ˆยท์ฃผ๋ฌธยทํšŒ์›์ฒ˜๋Ÿผ ์ •ํ•ฉ์„ฑ์ด ์ค‘์š”ํ•œ ์˜์† ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • MongoDB: ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€์ฒ˜๋Ÿผ ์Šคํ‚ค๋งˆ๊ฐ€ ์œ ์—ฐํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • Redis: ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ, ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ, ์บ์‹œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • S3 & CloudFront: presigned URL๋กœ ์ด๋ฏธ์ง€ยท์˜์ƒ์„ ์˜ฌ๋ฆฌ๊ณ  ํ”„๋ก ํŠธ ์ •์  ์‚ฐ์ถœ๋ฌผ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ API: AI ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ, CLOVA OCR, ๊ฒฐ์ œ PG, SMTP ๋ฉ”์ผ ๋ฐœ์†ก์„ ์—ฐ๋™ํ•ฉ๋‹ˆ๋‹ค.

6. ๊ด€์ธก ๋ฐ ์•Œ๋ฆผ (Observability)

  • Prometheus: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ยทํ˜ธ์ŠคํŠธยท์ปจํ…Œ์ด๋„ˆยทDB ๋ฉ”ํŠธ๋ฆญ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  • Loki & Alloy: ์ปจํ…Œ์ด๋„ˆ ํ‘œ์ค€ ์ถœ๋ ฅ ๋กœ๊ทธ๋ฅผ ๋ชจ์•„ ์ €์žฅํ•˜๊ณ  ์งˆ์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • Grafana: ๋ฉ”ํŠธ๋ฆญ๊ณผ ๋กœ๊ทธ๋ฅผ ํ•œ ํ™”๋ฉด์—์„œ ์กฐํšŒํ•˜๋Š” ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Alertmanager: ์ž„๊ณ„์น˜๋ฅผ ๋„˜์œผ๋ฉด ๋‹ด๋‹น์ž์—๊ฒŒ ๋ฉ”์ผ๋กœ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
  • Sentry: ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—‚๏ธ ERD

ERD

์ƒํ’ˆยท๊ฒ€์ˆ˜ยท๊ฑฐ๋ž˜ยท๊ฒฐ์ œ๋ฅผ ์ž‡๋Š” ํ•ต์‹ฌ ํ…Œ์ด๋ธ” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์ด๋ ฅ์€ backend/src/main/resources/db/migration์˜ Flyway ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋‚จ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ CI/CD Pipeline

CI/CD ํŒŒ์ดํ”„๋ผ์ธ

์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€์™€ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด AI ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ์ •์  ๋ถ„์„, ์ทจ์•ฝ์  ์Šค์บ”์ด ํฌํ•จ๋œ guard โ†’ test โ†’ quality โ†’ package โ†’ deploy โ†’ verify 6๋‹จ๊ณ„ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.

1. ์ง€์†์  ํ†ตํ•ฉ (Continuous Integration)

  • Secret Guard: ์ปค๋ฐ‹์— ํ† ํฐยทํ‚คยท์ธ์ฆ์„œ๊ฐ€ ์„ž์—ฌ ์žˆ์œผ๋ฉด ์ดํ›„ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ฐจ๋‹จ.
  • Change Detection: backend/**, frontend/**, infra/** ๋ณ€๊ฒฝ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ด ํ•„์š”ํ•œ ์žก๋งŒ ์‹คํ–‰ํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ์‹œ๊ฐ„ ๋‹จ์ถ•.
  • Backend Test: test(๋‹จ์œ„) โ†’ integrationTest(Testcontainers๋กœ ์‹ค์ œ MySQLยทMongoDB ๊ธฐ๋™) โ†’ infrastructureTest(์™ธ๋ถ€ ์—”์ง„ ์Šค๋ชจํฌ) ์„ธ ๋‹จ๊ณ„๋กœ ๋ถ„๋ฆฌ. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” core/support ๋‘ shard๋กœ ๋‚˜๋ˆ  ๋ณ‘๋ ฌ ์‹คํ–‰.
  • Frontend Lint & Build: ESLint, Vitest, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๊นŒ์ง€ ํ™•์ธ.
  • Windows Scanner Build: windows-scanner/** ๋ณ€๊ฒฝ ์‹œ .NET 8 SDK ์ด๋ฏธ์ง€์—์„œ win-x64 ๋‹จ์ผ ์‹คํ–‰ ํŒŒ์ผ์„ publishํ•˜๊ณ , ์‚ฐ์ถœ๋ฌผ์„ ํ”„๋ก ํŠธ ๋นŒ๋“œ์˜ public/downloads/LimitScanner.exe๋กœ ๋„˜๊ฒจ ๊ฐ™์€ ๋ฐฐํฌ์— ์‹ค์–ด ๋ณด๋ƒ„. ์Šคํ”ผ์ปค ํ†ค ์ƒ์„ฑยท์ „์› ์ƒํƒœ ์ถ”์ ยท๋ชจ๋“ˆ ๊ฒฐ๊ณผ ํŒ์ •์€ windows-scanner/tests์—์„œ ๋‹จ์œ„ ๊ฒ€์ฆ.
  • Script Regression: ํŒŒ์ดํ”„๋ผ์ธ ๋กœ์ง์„ YAML์ด ์•„๋‹Œ scripts/์˜ ์…ธ ์Šคํฌ๋ฆฝํŠธ์— ๋‘๊ณ , rollback-blue-green.test.shยทsync-deploy-files.test.sh ๋“ฑ *.test.sh๋กœ ์Šคํฌ๋ฆฝํŠธ ์ž์ฒด๋ฅผ ํšŒ๊ท€ ๊ฒ€์ฆ.

2. ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ (Code Quality)

  • PR-Agent (AI Review): MR diff๋ฅผ AI๊ฐ€ ๋ถ„์„ํ•ด ์ž๋™ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ’ˆ์งˆ์„ ์‚ฌ์ „ ์ ๊ฒ€.
  • SonarQube (Static Analysis): ๋ฒ„๊ทธ, ์ทจ์•ฝ์ , ์ฝ”๋“œ ์Šค๋ฉœ ํƒ์ง€๋ฅผ ํ†ตํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ตœ์†Œํ™”. Quality Gate ๊ฒฐ๊ณผ๋Š” ์ƒ๋‹จ ๋ฑƒ์ง€์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JaCoCo: ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ธก์ •๊ณผ ๋ฆฌํฌํŠธ ๊ฒŒ์‹œ.
  • OWASP Dependency-Check: ์˜์กด์„ฑ CVE ์ ๊ฒ€, CVSS 7.0 ์ด์ƒ์ด๋ฉด ๋นŒ๋“œ ์‹คํŒจ.
  • OpenAPI Contract: API ์ŠคํŽ™๊ณผ ์‹ค์ œ ์ปจํŠธ๋กค๋Ÿฌ ๊ณ„์•ฝ์˜ ๋ถˆ์ผ์น˜ ๊ฒ€์‚ฌ.

3. ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ์Šค์บ” (Package)

  • Image Build: ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ด registry์— ํ‘ธ์‹œ.
  • Trivy Container Scan: HIGHยทCRITICAL ์ทจ์•ฝ์ ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ๋ฐฐํฌ ์ „ ํŒŒ์ดํ”„๋ผ์ธ ์ค‘๋‹จ.
  • Immutable Digest: ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ digest๋กœ ๊ณ ์ •ํ•ด ๋ฐฐํฌ ๋ฒ„์ „ ์ถ”์ ์„ฑ๊ณผ ๋กค๋ฐฑ ๊ทผ๊ฑฐ ํ™•๋ณด.

4. ๋ฐฐํฌ ๋ฐ ๊ฒ€์ฆ (Deploy & Verification)

  • Blue-Green Deployment: ์œ ํœด ์ƒ‰์ƒ์— ์ƒˆ ๋ฒ„์ „์„ ๋จผ์ € ๋„์šฐ๊ณ  readiness๋ฅผ ํ™•์ธ.
  • Health Check & Smoke Test: ๋ฐฐํฌ ์งํ›„ ์„œ๋น„์Šค ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด ํ†ต๊ณผํ•œ ๊ฒฝ์šฐ์—๋งŒ Nginx upstream์„ ์ „ํ™˜.
  • Auto Rollback: ์‹คํŒจ ์‹œ ๊ธฐ์กด ์ƒ‰์ƒ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ์ด์ „ digest๋กœ ๋ณต๊ตฌ.
  • Frontend Deploy: S3 ๋™๊ธฐํ™”์™€ CloudFront ์บ์‹œ ๋ฌดํšจํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ๋กค๋ฐฑ ์žก์œผ๋กœ ๋˜๋Œ๋ฆผ.
  • Recovery Drill: ๋ฐฑ์—… ๋ณต๊ตฌ์™€ ์•Œ๋ฆผ ๋ฐœ์†ก ๊ฒฝ๋กœ๋Š” scripts/restore-backup-drill.sh, scripts/test-alertmanager-notification.sh๋กœ ์‹ค์ œ ๋ณต๊ตฌยท๋ฐœ์†ก๊นŒ์ง€ ํ™•์ธ.

์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒ€์ฆ์€ ์„ฑ๊ณต์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์œ ์™€ ๋‚จ์€ ์œ„ํ—˜์„ MR์— ํ•จ๊ป˜ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ (Key Features)

๊ฐ ์นธ์˜ <img ...> ์ฃผ์„์„ ํ•ด์ œํ•˜๊ณ  docs/images/์— ๊ฐ™์€ ์ด๋ฆ„์˜ ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์œผ๋ฉด ํ™”๋ฉด์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํšŒ์›ยท์ธ์ฆ

์ด๋ฉ”์ผ ๊ฐ€์ž…๊ณผ ์ธ์ฆ ๋ฉ”์ผ ๋ฐœ์†ก, GoogleยทKakaoยทNAVER ์†Œ์…œ ๋กœ๊ทธ์ธ, JWT ์žฌ๋ฐœ๊ธ‰, ๊ตฌ๋งค์ž์—์„œ ํŒ๋งค์ž๋กœ์˜ ์ „ํ™˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ƒํ’ˆ ๋“ฑ๋ก๊ณผ ํƒ์ƒ‰

4๋‹จ๊ณ„ ์ž„์‹œ์ €์žฅ ๋“ฑ๋ก, ๊ธฐ๊ธฐ ์นดํƒˆ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธยท์ƒ‰์ƒยท์šฉ๋Ÿ‰ ์„ ํƒ, ์ด๋ฏธ์ง€์™€ ์˜์ƒ์˜ presigned ์—…๋กœ๋“œ, ์กฐ๊ฑด ๊ฒ€์ƒ‰๊ณผ ์ •๋ ฌ, ์ฐœ, ์กฐํšŒ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ˆ˜

๊ธฐ๊ธฐ์™€ ๋…ธํŠธ๋ถ๋ณ„ AI ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๊ณ , ํ•ญ๋ชฉ๋งˆ๋‹ค ์ฆ๊ฑฐ ์ž๋ฃŒ๋ฅผ ์—…๋กœ๋“œํ•ด ์ด๋ ฅ์œผ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•ญ๋ชฉ ๊ฒ€์ฆ๊ณผ ์žฌ๊ฒ€์ˆ˜ ์š”์ฒญ ํ๋ฆ„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๊ธฐ ์‹ค๋™์ž‘ ์ ๊ฒ€

๋ธŒ๋ผ์šฐ์ €์—์„œ ์นด๋ฉ”๋ผยท๋งˆ์ดํฌยท์Šคํ”ผ์ปคยทํ‚ค๋ณด๋“œยทํฌ์ธํ„ฐ๋ฅผ ์ง์ ‘ ๋™์ž‘์‹œ์ผœ ํ†ต๊ณผ ์—ฌ๋ถ€๋ฅผ ํŒ์ •ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจ ํ•ญ๋ชฉ์€ ์žฌ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๊ณ  ์ž„์‹œ์ €์žฅ์—๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค.

Windows ์ž๋™ ์ง„๋‹จ

๋ฌด์„ค์น˜ ์‹คํ–‰ ํŒŒ์ผ์ด dxdiagยทpowercfg ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•ด ์ผํšŒ์šฉ ์—ฐ๊ฒฐ ์ฝ”๋“œ๋กœ ์—…๋กœ๋“œํ•˜๊ณ , ์‚ฌ์–‘ยท๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜์น˜๊ฐ€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์— ์ž๋™ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

ํ™”์ƒ ๊ฒ€์ˆ˜

WebRTC ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ํ†ตํ™”๋กœ ๊ตฌ๋งค์ž๊ฐ€ ๊ธฐ๊ธฐ ์ƒํƒœ๋ฅผ ์ง์ ‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. TURN ๋ฆด๋ ˆ์ด์™€ ํ†ตํ™” ๊ธฐ๋ก์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฑ„ํŒ…

๊ตฌ๋งค์ž์™€ ํŒ๋งค์ž ์‚ฌ์ด์˜ ์‹ค์‹œ๊ฐ„ ๋ฌธ์˜๋ฅผ WebSocket์œผ๋กœ ์ฃผ๊ณ ๋ฐ›๊ณ  ๋ฉ”์‹œ์ง€๋Š” MongoDB์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฑฐ๋ž˜ ์ƒํƒœ ๊ด€๋ฆฌ

DRAFT โ†’ ON_SALE โ†’ RESERVED โ†’ PAID โ†’ INSPECTING โ†’ CONFIRMED ์ƒํƒœ ์ „์ด๋ฅผ ์ด๋ ฅ๊ณผ ํ•จ๊ป˜ ๊ธฐ๋กํ•˜๊ณ , ์˜ˆ์•ฝ ๋งŒ๋ฃŒ์™€ ์ž๋™ ๊ตฌ๋งคํ™•์ •์„ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ œยท์ •์‚ฐ

๊ฒฐ์ œ ์Šน์ธยท์ทจ์†Œยท์žฌ์‹œ๋„, PG ๋Œ€์‚ฌ ๊ธฐ๋ฐ˜ ๋ณต๊ตฌ, ํ™˜๋ถˆ, ํŒ๋งค์ž ์ •์‚ฐ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์šด์˜ยท๊ด€๋ฆฌ์ž

๊ด€๋ฆฌ์ž ์ฝ˜์†”์—์„œ ๊ธฐ๊ธฐ ๋ชจ๋ธ ์Šน์ธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์•Œ๋ฆผ ๋ฉ”์ผ ๋ฐœ์†ก๊ณผ ๋ฐฑ์—…ยท๋ณต๊ตฌ ๋“œ๋ฆด์„ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ Local Development

Docker Desktop๋งŒ ์ผœ์ ธ ์žˆ์œผ๋ฉด ์Šคํฌ๋ฆฝํŠธ ํ•œ ์ค„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ํŒŒ์ผ ์ƒ์„ฑ, ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™, SwaggerยทGrafana ์—ด๊ธฐ๊นŒ์ง€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

.\scripts\open-platform-tools.ps1     # ๋ฐฑ์—”๋“œ + MySQLยทMongoDBยทRedis + ๋ชจ๋‹ˆํ„ฐ๋ง
cd frontend; npm ci; npm run dev      # ํ”„๋ก ํŠธ
๋Œ€์ƒ ๋กœ์ปฌ ์šด์˜
ํ”„๋ก ํŠธ http://localhost:5173 https://l1mit.shop
Swagger http://localhost:18080/swagger-ui.html https://docs.l1mit.shop
Grafana http://localhost:3000 https://grafana.l1mit.shop
SonarQube โ€” https://sonarcloud.io/summary/overall?id=limit

์ข…๋ฃŒ๋Š” docker compose -p limit-local down์ž…๋‹ˆ๋‹ค.

Windows ์ง„๋‹จ ์•ฑ์€ ๋ณ„๋„๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$env:LIMIT_API_BASE_URL='http://localhost:18080/'
dotnet run --project .\windows-scanner\src\LimitScanner\LimitScanner.csproj

๊ฒ€์ฆ

cd frontend; npm run lint; npm run test; npm run build
cd backend;  .\gradlew.bat test; .\gradlew.bat integrationTest; .\gradlew.bat bootJar
cd windows-scanner; dotnet test

๐Ÿ“ Repository Structure

limit/
โ”œโ”€โ”€ backend/                    Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ main/java/com/c203/limit/
โ”‚       โ”‚   โ”œโ”€โ”€ domain/         admin, auth, call, chat, inspection, member,
โ”‚       โ”‚   โ”‚                   payment, product, refund, rtc, seller, settlement
โ”‚       โ”‚   โ””โ”€โ”€ global/         api, bootstrap, common, config, exception,
โ”‚       โ”‚                       logging, response, security
โ”‚       โ”œโ”€โ”€ main/resources/db/migration/   Flyway ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
โ”‚       โ”œโ”€โ”€ test/               ๋‹จ์œ„ยท์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ
โ”‚       โ””โ”€โ”€ integrationTest/    Testcontainers ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (integrationTestยทinfrastructureTest ํƒœ์Šคํฌ๊ฐ€ ๊ณต์œ )
โ”œโ”€โ”€ frontend/                   Vue 3 ์Šคํ† ์–ดํ”„๋ก ํŠธ
โ”‚   โ””โ”€โ”€ src/                    api, assets, auth, components, composables, features,
โ”‚                               layouts, legal, mock, monitoring, pages, router,
โ”‚                               stores, styles, utils
โ”œโ”€โ”€ windows-scanner/            .NET 8 WinForms ์ง„๋‹จ ์•ฑ
โ”‚   โ”œโ”€โ”€ src/LimitScanner/       dxdiagยทpowercfg ์ˆ˜์ง‘๊ณผ ์—…๋กœ๋“œ
โ”‚   โ””โ”€โ”€ tests/                  ์Šค์บ๋„ˆ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
โ”œโ”€โ”€ infra/
โ”‚   โ”œโ”€โ”€ compose.yml             ๊ณตํ†ต ๋ฐ์ดํ„ฐ ๊ณ„์ธต
โ”‚   โ”œโ”€โ”€ compose.local.yml       ๋กœ์ปฌ ์˜ค๋ฒ„๋ ˆ์ด
โ”‚   โ”œโ”€โ”€ compose.prod.yml        Blue/Green, coturn, ๋ชจ๋‹ˆํ„ฐ๋ง ์Šคํƒ
โ”‚   โ”œโ”€โ”€ nginx/                  ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์™€ Blue-Green upstream
โ”‚   โ”œโ”€โ”€ monitoring/             Prometheus, Loki, Grafana, Alertmanager, Alloy ์„ค์ •
โ”‚   โ”œโ”€โ”€ admin/                  admin.l1mit.shop ์ •์  ๊ด€๋ฆฌ์ž ์ฝ˜์†”
โ”‚   โ”œโ”€โ”€ aws/                    S3 ๋ฏธ๋””์–ด ๋ฒ„ํ‚ท ์ •์ฑ…ยทCORS ์„ค์ •
โ”‚   โ”œโ”€โ”€ secrets/                ์‹œํฌ๋ฆฟ ํ…œํ”Œ๋ฆฟ(`*.example`), ์‹ค์ œ ๊ฐ’์€ ์„œ๋ฒ„์—๋งŒ ์กด์žฌ
โ”‚   โ”œโ”€โ”€ state/                  ๋ฐฑ์—…ยทexporter ๋Ÿฐํƒ€์ž„ ์ƒํƒœ (๋ฐฐํฌ ์‹œ ๋™๊ธฐํ™” ์ œ์™ธ)
โ”‚   โ””โ”€โ”€ terraform/              dns, frontend, operations
โ”œโ”€โ”€ scripts/                    ๋นŒ๋“œยท๋ฐฐํฌยท๋กค๋ฐฑยท๋ฐฑ์—…ยท์ ๊ฒ€ ์Šคํฌ๋ฆฝํŠธ์™€ ๊ทธ ํ…Œ์ŠคํŠธ
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ api/                    API ๊ณ„์•ฝ๊ณผ OpenAPI
โ”‚   โ”œโ”€โ”€ adr/                    ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ • ๊ธฐ๋ก
โ”‚   โ”œโ”€โ”€ db/                     ์Šคํ‚ค๋งˆ
โ”‚   โ”œโ”€โ”€ images/                 README์šฉ ์Šคํฌ๋ฆฐ์ƒทยท๋‹ค์ด์–ด๊ทธ๋žจ
โ”‚   โ”œโ”€โ”€ integration/            ์™ธ๋ถ€ ์—ฐ๋™ยท๋ฐ์ดํ„ฐ Runbook
โ”‚   โ”œโ”€โ”€ legal/                  ์•ฝ๊ด€ยท๊ฐœ์ธ์ •๋ณด ๊ทผ๊ฑฐ
โ”‚   โ”œโ”€โ”€ product-redesign/       ์ƒํ’ˆ ๋„๋ฉ”์ธ ์žฌ์„ค๊ณ„ ์‚ฐ์ถœ๋ฌผ
โ”‚   โ””โ”€โ”€ runbook/                ์šด์˜ ์ ˆ์ฐจ
โ”œโ”€โ”€ .gitlab/                    PR-Agent ๋“ฑ ํ•˜์œ„ ํŒŒ์ดํ”„๋ผ์ธ ์ •์˜
โ”œโ”€โ”€ .githooks/                  ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ยท์‹œํฌ๋ฆฟ ๊ฒ€์‚ฌ ํ›…
โ”œโ”€โ”€ compose.yaml                ๋กœ์ปฌ ์ง„์ž…์  (infra/compose.yml + compose.local.yml include)
โ””โ”€โ”€ .gitlab-ci.yml              6๋‹จ๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ