Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Question-Cloud/qc-be

Repository files navigation

๐Ÿ“š QuestionCloud - ์ˆ˜๋Šฅ ๋ฌธ์ œ ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ

์ด์ปค๋จธ์Šค ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ํ•™์Šต์„ ์œ„ํ•ด ์ง„ํ–‰ํ•˜๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
์ˆ˜๋Šฅ ๋ฌธ์ œ ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์„ ์ฃผ์ œ๋กœ ๊ฒฐ์ œ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ๊ณผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋ฅผ ์—ฐ์Šตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


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

์ด์ปค๋จธ์Šค ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ํ•™์Šต์„ ์œ„ํ•ด ์ง„ํ–‰ํ•˜๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
์ˆ˜๋Šฅ ๋ฌธ์ œ ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์„ ์ฃผ์ œ๋กœ ๊ฒฐ์ œ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ๊ณผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋ฅผ ์—ฐ์Šตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

  • ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒฝํ—˜
  • ์•ˆ์ „ํ•œ ๊ฒฐ์ œ ์‹œ์Šคํ…œ ๊ตฌํ˜„ (๋ฉ”์‹œ์ง€ ์œ ์‹ค ๋ฐฉ์ง€, ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ)
  • ๋ชจ๋“ˆ๋Ÿฌ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐ ์ ์šฉ
  • ์‹ค์ œ ์šด์˜์„ ๊ณ ๋ คํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น… ๊ตฌํ˜„

๐Ÿ› ๏ธ ์‚ฌ์šฉ ๊ธฐ์ˆ 

Backend Framework

  • Spring Boot 3.x, Kotlin
  • Spring Data JPA, Querydsl

Database

  • MariaDB (๋ฉ”์ธ RDBMS)
  • MongoDB (์กฐํšŒ์šฉ ๋ฐ์ดํ„ฐ)
  • Redis (์บ์‹œ & ๋ถ„์‚ฐ ๋ฝ)

Message Queue

  • AWS SNS + SQS (๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ)

Infrastructure

  • Docker, AWS EC2, AWS RDS
  • Prometheus + Grafana + Tempo(๋ชจ๋‹ˆํ„ฐ๋ง)

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

์ „์ฒด ์ธํ”„๋ผ ๊ตฌ์„ฑ

QuestionCloud System Architecture

๐ŸŽฏ ์ธํ”„๋ผ ๊ตฌ์„ฑ

  • AWS EC2: Docker ๊ธฐ๋ฐ˜ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • AWS RDS: MariaDB ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • AWS ElastiCache: Redis
  • MongoDB Atlas: ์กฐํšŒ์šฉ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • AWS SNS/SQS: ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
  • ๋ชจ๋‹ˆํ„ฐ๋ง: Prometheus + Grafana

Modular Monolith Architecture

๐Ÿ“ฑ Runtime Container

qc-api-container (Spring Boot Application)
โ”œโ”€โ”€ Domain Modules Integration
โ”œโ”€โ”€ REST API Endpoints Aggregation  
โ”œโ”€โ”€ Dependency Injection & Bean Management
โ””โ”€โ”€ Application Configuration

๐Ÿš€ Container ์—ญํ•  (qc-api-container)

  • ๋ชจ๋“  ๋„๋ฉ”์ธ ๋ชจ๋“ˆ์„ Spring Context์— ๋กœ๋”ฉ
  • ๋„๋ฉ”์ธ๋ณ„ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํ†ตํ•ฉ
  • ๊ณตํ†ต ์„ค์ • ๋ฐ ์ธํ”„๋ผ ๊ตฌ์„ฑ ๊ด€๋ฆฌ
  • ์‹ค์ œ ๋ฐฐํฌ๋˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

๐Ÿ—๏ธ Core Domain Modules

  • qc-user - ์œ ์ € ๋„๋ฉ”์ธ (Core + API + Internal API + RDB + Redis + Social)
  • qc-question - ๋ฌธ์ œ ๋„๋ฉ”์ธ (Core + API + Internal API + RDB + Fixture)
  • qc-creator - ํฌ๋ฆฌ์—์ดํ„ฐ ๋„๋ฉ”์ธ (Core + API + Internal API + RDB)
  • qc-point - ํฌ์ธํŠธ ์‹œ์Šคํ…œ ๋„๋ฉ”์ธ (Core + API + Internal API + RDB + PG)
  • qc-post - ๋ฌธ์ œ ๊ฒŒ์‹œํŒ ๋„๋ฉ”์ธ (Core + API + Internal API + RDB)
  • qc-pay - ๊ฒฐ์ œ ๋„๋ฉ”์ธ (Core + API + RDB + Mongo)
  • qc-cart - ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„๋ฉ”์ธ (Core + API + RDB)
  • qc-review - ๋ฆฌ๋ทฐ ๋„๋ฉ”์ธ (Core + API + RDB)
  • qc-subscribe - ๊ตฌ๋… ๋„๋ฉ”์ธ (Core + API + RDB)

๐Ÿ”ง ๊ฐ ๋„๋ฉ”์ธ์˜ ๋ชจ๋“ˆ ๊ตฌ์กฐ

qc-{domain}/
โ”œโ”€โ”€ qc-{domain}-api/          # REST API & Service Layer  
โ”œโ”€โ”€ qc-{domain}-core/         # ๋„๋ฉ”์ธ ํด๋ž˜์Šค & ๋„๋ฉ”์ธ ๋กœ์ง & Repository ์ธํ„ฐํŽ˜์ด์Šค
โ”œโ”€โ”€ qc-{domain}-internal-api/ # ๋„๋ฉ”์ธ ๊ฐ„ ํ†ต์‹  ๊ตฌํ˜„์ฒด
โ”œโ”€โ”€ qc-{domain}-rdb/          # JPA Repository ๊ตฌํ˜„์ฒด
โ””โ”€โ”€ qc-{domain}-{infra}/      # ์ด์™ธ Infra (Redis, Mongo, PG API ๋“ฑ)

๐Ÿ”Œ Internal API Interface Layer

๋„๋ฉ”์ธ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ๋ชจ๋“ˆ:

qc-internal-api-interface/
โ”œโ”€โ”€ qc-user-internal-api-interface
โ”œโ”€โ”€ qc-question-internal-api-interface  
โ”œโ”€โ”€ qc-creator-internal-api-interface
โ”œโ”€โ”€ qc-point-internal-api-interface
โ””โ”€โ”€ qc-post-internal-api-interface

๐Ÿ› ๏ธ Infrastructure Modules

qc-infra/
โ”œโ”€โ”€ qc-event/
โ”‚   โ”œโ”€โ”€ qc-event-core/       # ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„์ฒด (AWS SNS, AWS SQS)
โ”‚   โ””โ”€โ”€ qc-event-rdb/        # ์ด๋ฒคํŠธ ๊ด€๋ จ Repository ๊ตฌํ˜„์ฒด
โ”œโ”€โ”€ qc-rdb/                  # ๊ณตํ†ต JPA ์„ค์ •
โ”œโ”€โ”€ qc-redis/                # Redis ์—ฐ๋™
โ”œโ”€โ”€ qc-http/                 # HTTP Client
โ”œโ”€โ”€ qc-mail/                 # ์ด๋ฉ”์ผ ๋ฐœ์†ก
โ”œโ”€โ”€ qc-lock/                 # ๋ถ„์‚ฐ ๋ฝ
โ””โ”€โ”€ qc-external-pg/          # ์™ธ๋ถ€ PG ์—ฐ๋™

๐Ÿ”ง Shared Modules

โ”œโ”€โ”€ qc-common/               # ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ, Response, Exception, Common Infra Interface,...
โ”œโ”€โ”€ qc-logging/              # ๋กœ๊น… ์„ค์ •  
โ””โ”€โ”€ qc-test-utils/           # ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ

๐Ÿš€ ๊ตฌํ˜„ API

๐Ÿ” ์ธ์ฆ (Authentication)

  • ๋กœ๊ทธ์ธ - ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ
  • ์†Œ์…œ ๋กœ๊ทธ์ธ - KAKAO, GOOGLE, NAVER ์†Œ์…œ ๊ณ„์ • ๋กœ๊ทธ์ธ
  • ํ† ํฐ ๋ฆฌํ”„๋ ˆ์‹œ - ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ํ†ตํ•œ ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰

๐Ÿ‘ค ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (User)

  • ํšŒ์›๊ฐ€์ž… - ์ด๋ฉ”์ผ/์†Œ์…œ ๊ณ„์ •์„ ํ†ตํ•œ ์‹ ๊ทœ ์‚ฌ์šฉ์ž ๋“ฑ๋ก
  • ํšŒ์›๊ฐ€์ž… ์ธ์ฆ - ์ด๋ฉ”์ผ ์ธ์ฆ์„ ํ†ตํ•œ ๊ณ„์ • ํ™œ์„ฑํ™”
  • ๊ณ„์ • ์ฐพ๊ธฐ - ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•œ ์ด๋ฉ”์ผ ๊ณ„์ • ์ฐพ๊ธฐ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ/๋ณ€๊ฒฝ - ์ด๋ฉ”์ผ์„ ํ†ตํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •
  • ๋‚ด ์ •๋ณด ์กฐํšŒ/์ˆ˜์ • - ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ด€๋ฆฌ

๐Ÿ›’ ์Šคํ† ์–ด - ์žฅ๋ฐ”๊ตฌ๋‹ˆ (Store Cart)

  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์กฐํšŒ - ๋‹ด๊ธด ๋ฌธ์ œ ๋ชฉ๋ก ํ™•์ธ
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ - ๋ฌธ์ œ๋ฅผ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋นผ๊ธฐ - ์„ ํƒํ•œ ๋ฌธ์ œ๋“ค์„ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์ œ๊ฑฐ

๐Ÿ“š ์Šคํ† ์–ด - ์ƒํ’ˆ (Store Product)

  • ๋ฌธ์ œ ๋ชฉ๋ก ์กฐํšŒ - ํ•„ํ„ฐ๋ง ๋ฐ ํŽ˜์ด์ง•์„ ํ†ตํ•œ ๋ฌธ์ œ ๊ฒ€์ƒ‰
  • ๋ฌธ์ œ ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ - ๊ณผ๋ชฉ๋ณ„ ๋ถ„๋ฅ˜๋œ ์นดํ…Œ๊ณ ๋ฆฌ ๋ชฉ๋ก
  • ๋ฌธ์ œ ์ƒ์„ธ ์กฐํšŒ - ๊ฐœ๋ณ„ ๋ฌธ์ œ์˜ ์ƒ์„ธ ์ •๋ณด

โญ ์Šคํ† ์–ด - ๋ฆฌ๋ทฐ (Store Review)

  • ๋ฌธ์ œ ๋ฆฌ๋ทฐ ๋ชฉ๋ก ์กฐํšŒ - ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ ๋ชฉ๋ก (ํŽ˜์ด์ง•)
  • ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ ์กฐํšŒ - ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚ด ๋ฆฌ๋ทฐ ํ™•์ธ
  • ๋ฌธ์ œ ๋ฆฌ๋ทฐ ๋“ฑ๋ก - ๊ตฌ๋งคํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ ์ž‘์„ฑ
  • ๋ฌธ์ œ ๋ฆฌ๋ทฐ ์ˆ˜์ •/์‚ญ์ œ - ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ ๊ด€๋ฆฌ

๐Ÿ“ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Library)

  • ๋‚˜์˜ ๋ฌธ์ œ ๋ชฉ๋ก ์กฐํšŒ - ๋ณด์œ ํ•œ ๋ฌธ์ œ ๋ชฉ๋ก์„ ํ•„ํ„ฐ๋ง ๋ฐ ํŽ˜์ด์ง•ํ•˜์—ฌ ์กฐํšŒ

๐Ÿ‘จโ€๐ŸŽจ ํฌ๋ฆฌ์—์ดํ„ฐ (Creator)

  • ํฌ๋ฆฌ์—์ดํ„ฐ ์ •๋ณด ์กฐํšŒ - ํฌ๋ฆฌ์—์ดํ„ฐ ํ”„๋กœํ•„, ํŒ๋งค ํ†ต๊ณ„, ๊ตฌ๋…์ž ์ˆ˜ ๋“ฑ ์ƒ์„ธ ์ •๋ณด

๐Ÿ”” ๊ตฌ๋… (Subscribe)

  • ํฌ๋ฆฌ์—์ดํ„ฐ ๊ตฌ๋…/๊ตฌ๋… ์ทจ์†Œ - ๊ด€์‹ฌ ์žˆ๋Š” ํฌ๋ฆฌ์—์ดํ„ฐ ํŒ”๋กœ์šฐ ๊ด€๋ฆฌ
  • ๋‚˜์˜ ๊ตฌ๋… ๋ชฉ๋ก ์กฐํšŒ - ๊ตฌ๋… ์ค‘์ธ ํฌ๋ฆฌ์—์ดํ„ฐ ๋ชฉ๋ก (ํŽ˜์ด์ง•)
  • ํŠน์ • ํฌ๋ฆฌ์—์ดํ„ฐ ๊ตฌ๋… ์—ฌ๋ถ€ ํ™•์ธ - ๊ตฌ๋… ์ƒํƒœ ๋ฐ ๊ตฌ๋…์ž ์ˆ˜ ์กฐํšŒ

๐Ÿ’ฐ ๊ฒฐ์ œ - ํฌ์ธํŠธ (Payment Point)

  • ๋ณด์œ  ํฌ์ธํŠธ ์กฐํšŒ - ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํฌ์ธํŠธ ํ™•์ธ
  • ํฌ์ธํŠธ ์ถฉ์ „ ์ฃผ๋ฌธ ์ƒ์„ฑ - ๊ฒฐ์ œ์ฐฝ ํ˜ธ์ถœ ์ „ ์ฃผ๋ฌธ ์ƒ์„ฑ
  • ํฌ์ธํŠธ ์ถฉ์ „ ๊ฒฐ์ œ ์Šน์ธ - PG ์—ฐ๋™์„ ํ†ตํ•œ ํฌ์ธํŠธ ์ถฉ์ „ ์ฒ˜๋ฆฌ
  • ํฌ์ธํŠธ ์ถฉ์ „ ์™„๋ฃŒ ์—ฌ๋ถ€ ์กฐํšŒ - ๊ฒฐ์ œ ์ƒํƒœ ํ™•์ธ
  • ํฌ์ธํŠธ ์ถฉ์ „ ๋‚ด์—ญ ์กฐํšŒ - ์ถฉ์ „ ํžˆ์Šคํ† ๋ฆฌ (ํŽ˜์ด์ง•)

๐Ÿ’ณ ๊ฒฐ์ œ - ๋ฌธ์ œ ๊ตฌ๋งค (Payment Question)

  • ๋ฌธ์ œ ๊ตฌ๋งค - ์„ ํƒํ•œ ๋ฌธ์ œ๋“ค์„ ํฌ์ธํŠธ๋กœ ๊ตฌ๋งค (์ฟ ํฐ ์ ์šฉ ๊ฐ€๋Šฅ)
  • ๋ฌธ์ œ ๊ตฌ๋งค ๋‚ด์—ญ ์กฐํšŒ - ๊ตฌ๋งค ํžˆ์Šคํ† ๋ฆฌ ๋ฐ ์ฃผ๋ฌธ ์ƒ์„ธ ์ •๋ณด (ํŽ˜์ด์ง•)

๐ŸŽซ ๊ฒฐ์ œ - ์ฟ ํฐ (Payment Coupon)

  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฟ ํฐ ๋ชฉ๋ก ์กฐํšŒ - ๋ณด์œ ํ•œ ์ฟ ํฐ ๋ฆฌ์ŠคํŠธ
  • ์ฟ ํฐ ๋“ฑ๋ก - ์ฟ ํฐ ์ฝ”๋“œ๋ฅผ ํ†ตํ•œ ์ฟ ํฐ ์ถ”๊ฐ€

๐Ÿ“ ๊ฒŒ์‹œํŒ (Post)

  • ๋ฌธ์ œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ - ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก (ํŽ˜์ด์ง•)
  • ๋ฌธ์ œ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ/๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ - ๊ฒŒ์‹œ๊ธ€ CRUD ๊ธฐ๋Šฅ
  • ๋ฌธ์ œ ๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€ ์กฐํšŒ/์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œ - ๋Œ“๊ธ€ CRUD ๊ธฐ๋Šฅ

๐ŸŽฏ ๊ฐœ์„  ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‚ฌ๋ก€

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”

MongoDB ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„  - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • Query์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ๋“ค์„ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•˜์—ฌ ์ธ๋ฑ์Šค ์ •๋ ฌ์„ ํ†ตํ•œ ๋ณ„๋„์˜ ์ •๋ ฌ ๊ณผ์ • ์ œ๊ฑฐ
  • Spring Data Mongo Custom Converter๋ฅผ ํ†ตํ•œ POJO Mapping ์„ฑ๋Šฅ ๊ฐœ์„ 
  • TPS 1,937 โ†’ 3,900 (101% ํ–ฅ์ƒ)

๋ฆฌ๋ทฐ ํ‰์  ์ •๋ ฌ ์„ฑ๋Šฅ ๊ฐœ์„  - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • ๋ฆฌ๋ทฐ ํ†ต๊ณ„ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์ถ”๊ฐ€/์ˆ˜์ •/์‚ญ์ œ ์‹œ ํ†ต๊ณ„ ํ…Œ์ด๋ธ”์˜ ํ‰์ ์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ
  • SUM, COUNT ์—ฐ์‚ฐ ์—†์ด ํ†ต๊ณ„ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜์—ฌ ํ‰์  ์ˆœ์œผ๋กœ ์ •๋ ฌ
  • ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ 1000๋งŒ ๊ฑด ๊ธฐ์ค€ SQL ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ 3s โ†’ 0.149s (95% ํ–ฅ์ƒ)

AWS SNS ํ† ํ”ฝ ๋ฐœํ–‰ ์ฒ˜๋ฆฌ ์†๋„ ๊ฐœ์„  - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • Coroutine์„ ํ†ตํ•ด ์ด๋ฒคํŠธ ์žฌ๋ฐœํ–‰์„ ์ฒ˜๋ฆฌํ–ˆ์œผ๋‚˜ SNS ํ† ํ”ฝ ๋ฐœํ–‰ HTTP ํ†ต์‹ ์œผ๋กœ ์ธํ•œ ์“ฐ๋ ˆ๋“œ Blocking ๋ฐœ์ƒ
  • Non-Blocking์„ ์ง€์›ํ•˜๋Š” AWS SNS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  Max Connections๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋™์‹œ ์ฒ˜๋ฆฌ๋Ÿ‰ ํ–ฅ์ƒ
  • 10,000๊ฑด SNS ํ† ํ”ฝ ๊ธฐ์ค€ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ 4.7s โ†’ 2.2s (53% ํ–ฅ์ƒ)

๐Ÿ›ก๏ธ ์•ˆ์ •์„ฑ ๋ณด์žฅ

๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋ฐ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋กœ๊น…์„ ํ†ตํ•œ ๊ฒฐ์ œ ์‹คํŒจ ์ฒ˜๋ฆฌ ๋ณด์žฅ - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์†Œ๋น„๋  ๋•Œ๊นŒ์ง€ ๋ฉ”์‹œ์ง€ ํ์—์„œ ์œ ์‹ค๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ด์šฉ
  • ๊ฒฐ์ œ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜์—ฌ ๊ฒฐ์ œ ์ทจ์†Œ ์ฒ˜๋ฆฌ ๋ฐ ๋กค๋ฐฑ์„ ๋ณด์žฅ๋ฐ›๋„๋ก ๊ตฌํ˜„
  • ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๊ฒฐ์ œ ์‹คํŒจ ์‚ฌ์‹ค์ด ์œ ์‹ค๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅ

Transactional Outbox Pattern์„ ์ด์šฉํ•œ ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋ณด์žฅ - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ด๋ฒคํŠธ ๋ฐœํ–‰ ๋กœ๊ทธ ์ €์žฅ ๋กœ์ง์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ
  • ์ด๋ฒคํŠธ ๋ฐœํ–‰์— ์‹คํŒจํ•˜๋”๋ผ๋„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฐœํ–‰ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฐœํ–‰๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ๋ฅผ ์žฌ๋ฐœํ–‰
  • ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰์„ ๋ณด์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅ

๋ฉฑ๋“ฑ์„ฑ ํ…Œ์ด๋ธ”์„ ํ†ตํ•œ ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€ - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • ๋ฉ”์‹œ์ง€ Listener๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ ํ›„ MessageID์™€ Listener ์ด๋ฆ„ ๊ธฐ๋ฐ˜์˜ ๋ฉฑ๋“ฑ์„ฑ ํ‚ค๋ฅผ ๋ฉฑ๋“ฑ์„ฑ ํ…Œ์ด๋ธ”์— ์ €์žฅ
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฉฑ๋“ฑ์„ฑ ํ‚ค๋ฅผ ์ €์žฅํ•˜๋Š” ๋กœ์ง์€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ
  • ๋ฉฑ๋“ฑ์„ฑ ํ‚ค ์กฐํšŒ ๋ฐ ์ €์žฅ ๋กœ์ง์€ AOP๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•„์š”ํ•œ Listener์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ 

Modular Monolithic Architecture + ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ์„ค๊ณ„ - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • ๋‹จ์ผ ๋ชจ๋“ˆ์—์„œ ๋„๋ฉ”์ธ๋ณ„ 45๊ฐœ ๋ชจ๋“ˆ๋กœ ์ฒด๊ณ„์  ๋ถ„๋ฆฌ
  • ๋„๋ฉ”์ธ๋ณ„ Controller + Core + Internal API ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ฐ ๋„๋ฉ”์ธ์˜ ๋…๋ฆฝ์„ฑ ํ™•๋ณด
  • ๋ชจ๋“ˆ ๊ฐ„ ํ†ต์‹ ์€ Interface ๊ณ„์ธต์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋„๋ก ์„ค๊ณ„ํ•˜์—ฌ ๋„๋ฉ”์ธ ๊ฐ„ ๊ฒฐํ•ฉ๋„ ์ œ๊ฑฐ

์กฐํšŒ์šฉ ๊ฒฐ์ œ ๋‚ด์—ญ ๋ชจ๋ธ์„ ํ†ตํ•œ ์กฐํšŒ ๋กœ์ง ๊ฐœ์„  - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • RDBMS์—์„œ ๊ด€๋ฆฌ๋˜๋˜ ๊ฒฐ์ œ ๋‚ด์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์ •๊ทœํ™” ๊ณผ์ •์„ ํ†ตํ•ด ์กฐํšŒ์šฉ ๋ชจ๋ธ๋กœ ์„ค๊ณ„ํ•˜์—ฌ MongoDB์— ์ €์žฅ
  • ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋กœ ๊ฒฐ์ œ ๋‚ด์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด Repository ์กฐํšŒ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ๊ฐœ์„ 
  • ์ƒํ’ˆ ์ •๋ณด๊ฐ€ ์ˆ˜์ •๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋”๋ผ๋„ ๊ตฌ๋งค ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅ

๐Ÿ“Š ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์ถ•

๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ APM ๋„๊ตฌ ๋„์ž… - ๊ด€๋ จ ํฌ์ŠคํŒ…

  • Spring Actuator + Prometheus + Grafana๋ฅผ ํ™œ์šฉํ•œ Metrics ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์ถ•
  • Spring Micrometer + Brave Tracer + Grafana Tempo๋ฅผ ํ™œ์šฉํ•œ Trace ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์ถ•

๐Ÿ“š ๊ฐœ์ธ ํ•™์Šต์šฉ ํ”„๋กœ์ ํŠธ๋กœ, ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋ฉฐ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์—ญ๋Ÿ‰์„ ํ‚ค์›Œ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages