Skip to content

About

[๐Ÿฅ‡ CMC 19th ๋Œ€์ƒ] ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ํ•˜๋Š” ๋‹ค์ด์–ดํŠธ ์Šต๊ด€, ๋ชจ๋”” mody

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

270 Commits

Folders and files

Repository files navigation

mody

์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ํ•˜๋Š” ๋‹ค์ด์–ดํŠธ ์Šต๊ด€, ๋ชจ๋””

๋ชจ๋””๋Š” ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์‹์‚ฌ, ์šด๋™, ์ฒด์ค‘ ๊ธฐ๋ก์„ ๊ณต์œ ํ•˜๋ฉฐ ๋‹ค์ด์–ดํŠธ ์Šต๊ด€์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” ๋ชจ๋””์˜ Java/Spring Boot ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

Design Documents

  • ADR (21๊ฑด): ํŒ€ ๋…ผ์˜ ๊ธฐ๋ฐ˜์˜ ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ๋ก
  • LLD (36๊ฑด): ๊ธฐ๋Šฅ ๋‹จ์œ„ ๊ตฌํ˜„ ์„ค๊ณ„์™€ ์ •์ฑ… ์ •๋ฆฌ

How We Build

์ด ํ”„๋กœ์ ํŠธ๋Š” ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์„ค๊ณ„์™€ ๊ฒ€์ฆ ์žฅ์น˜๋ฅผ ๋จผ์ € ๊ณ ์ •ํ•˜๊ณ , ๊ทธ ๊ธฐ์ค€์— ๋งž์ถฐ ๊ตฌํ˜„ ํ’ˆ์งˆ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Team Discussion
  -> ADR
  -> LLD
  -> Test Scenario
  -> Code Generation
  -> Human Review
  -> PR / CI / Deploy

ํŒ€ ๋‚ด๋ถ€์—์„œ ๋…ผ์˜๋œ ๊ธฐ์ˆ ์  ์„ ํƒ์€ ADR๋กœ ๋‚จ๊น๋‹ˆ๋‹ค. ADR์—๋Š” ์„ ํƒํ•œ ๋ฐฉ๋ฒ•๋ฟ ์•„๋‹ˆ๋ผ ๊ณ ๋ คํ•œ ๋Œ€์•ˆ, ํŠธ๋ ˆ์ด๋“œ์˜คํ”„, ํ›„์† ๋ฆฌ์Šคํฌ๋ฅผ ํ•จ๊ป˜ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

ADR์ด ๋ฐฉํ–ฅ์„ ์ •ํ•˜๋ฉด LLD์—์„œ ์‹ค์ œ ๊ตฌํ˜„ ๋‹จ์œ„๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. API ์š”์ฒญ/์‘๋‹ต, ๋„๋ฉ”์ธ ๊ทœ์น™, ์˜ˆ์™ธ ์ฝ”๋“œ, ์ธ์ฆ ์กฐ๊ฑด, ์ €์žฅ ๋ฐฉ์‹์ฒ˜๋Ÿผ ์ฝ”๋“œ๋กœ ์˜ฎ๊ฒจ์งˆ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๋จผ์ € ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

LLD์—์„œ ์˜ˆ์ƒ๋˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๋Š” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‚ฌ๋žŒ์ด diff์™€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒ€ํ† ํ•œ ๋’ค PR๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Issue ์ƒ์„ฑ, Commit ์ž‘์„ฑ, PR ์ƒ์„ฑ์€ ์ €์žฅ์†Œ ์ „์šฉ ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ํ˜‘์—… ์ž‘์—…์˜ ์–‘์‹์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋ˆ„๋ฝ๋˜๊ธฐ ์‰ฌ์šด ๋งํฌ์™€ ์„ค๋ช… ํ˜•์‹์„ ๊ณ ์ •ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

Technical Baseline

Category Stack
Language Java 21
Framework Spring Boot 3.4.1
Persistence Spring Data JPA, MySQL
API Docs Swagger, Spring REST Docs
Test JUnit 5, MockMvc
Build Gradle
Migration Flyway
Push Firebase Cloud Messaging
Storage Google Cloud Storage (Signed URL ์ง์ ‘ ์—…๋กœ๋“œ)
Deploy GitHub Actions, Docker, Nginx (๋ธ”๋ฃจ๊ทธ๋ฆฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ)
Infra Oracle Cloud A1 (prod), GCP Compute Engine (dev)
Observability Prometheus, Grafana, Slack ์•Œ๋ฆผ

Architecture

flowchart LR
    App[iOS / Android ์•ฑ] -->|HTTPS| Nginx
    Admin[์šด์˜ ์ฝ˜์†”] -->|HTTPS| Nginx
    subgraph Prod[Oracle Cloud A1 ยท 4 OCPU / 24GB]
        Nginx --> Blue[mody-web-blue]
        Nginx -.์ „ํ™˜.-> Green[mody-web-green]
        Blue --> MySQL[(MySQL 8)]
        Green --> MySQL
        Prometheus --> Blue
        Prometheus --> Green
        Grafana --> Prometheus
        Grafana --> MySQL
    end
    App -->|Signed URL ์—…๋กœ๋“œ| GCS[(Google Cloud Storage)]
    Blue -->|ํ‘ธ์‹œ| FCM[Firebase Cloud Messaging]
    Blue -->|500 ์•Œ๋ฆผ| Slack
    MySQL -->|๋งค์ผ ๋ฐฑ์—…| Backup[(GCS ๋ฐฑ์—… ๋ฒ„ํ‚ท)]
Loading
  • ๋ฐฐํฌ: main์— ๋จธ์ง€ํ•˜๋ฉด GitHub Actions๊ฐ€ amd64/arm64 ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ธ”๋ฃจ๊ทธ๋ฆฐ์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ƒ‰์ƒ์ด ํ—ฌ์Šค์ฒดํฌ๋ฅผ ํ†ต๊ณผํ•ด์•ผ Nginx๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ๋„˜๊ธฐ๋ฏ€๋กœ ๋ฐฐํฌ ์ค‘์—๋„ ์„œ๋น„์Šค๊ฐ€ ๋Š๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์ผ€์ค„ ์ž‘์—…์€ ํ™œ์„ฑ ์ƒ‰์ƒ ์ธ์Šคํ„ด์Šค์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. (deploy/prod)
  • ํ™˜๊ฒฝ: develop โ†’ dev ์„œ๋ฒ„, main โ†’ prod ์„œ๋ฒ„๋กœ ์ž๋™ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋น„์šฉ: ์šด์˜์€ Oracle Always Free, ๊ฐœ๋ฐœ์€ GCP ๋ฌด๋ฃŒ ๋“ฑ๊ธ‰์—์„œ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.

Operations

์˜์—ญ ๋‚ด์šฉ
๋ชจ๋‹ˆํ„ฐ๋ง Prometheus + Grafana ์ƒ์ฃผ. ๋น„์ฆˆ๋‹ˆ์Šคยท์„ฑ๋Šฅยท์‚ฌ์šฉ์ž ์ง€ํ‘œ(DAU/WAU/MAU, ๊ฐ€์ž… ํผ๋„, ์ฃผ๊ฐ„ ์ฝ”ํ˜ธํŠธ ๋ฆฌํ…์…˜) ๋Œ€์‹œ๋ณด๋“œ (monitoring)
์žฅ์•  ๋Œ€์‘ 500 ์—๋Ÿฌ๋ฅผ Slack์œผ๋กœ ์•Œ๋ฆฌ๊ณ , ์šด์˜ ๋ด‡์ด ์›์ธ์„ ๋ถ„์„ํ•ด GitHub ์ด์Šˆ๋ฅผ ์ž๋™ ์ƒ์„ฑ
์ผ์ผ ๋ฆฌํฌํŠธ ๋งค์ผ 09์‹œ ํ•ต์‹ฌ ์ง€ํ‘œ๋ฅผ Slack์œผ๋กœ ๊ณต์œ  (scripts/daily-report)
์šด์˜ ์ฝ˜์†” Google ๋กœ๊ทธ์ธ ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ ํ™”๋ฉด. ์ธ์ฆ ํ”ผ๋“œ, ์ฑŒ๋ฆฐ์ง€ยท๊ทธ๋ฃน ๊ด€๋ฆฌ, ํšŒ์› ๊ด€๋ฆฌ, ์‹ ๊ณ  ์ฒ˜๋ฆฌ, ๊ณต์ง€ ํ‘ธ์‹œ, ํ†ต๊ณ„, ์ž‘์—… ์ด๋ ฅ
๋ฐฑ์—… MySQL์„ ๋งค์ผ GCS๋กœ ๋คํ”„, 30์ผ ๋ณด๊ด€

Project Structure

src/main/java/cmc/mody
โ”œโ”€โ”€ auth         # ์†Œ์…œ ๋กœ๊ทธ์ธ(Kakao, Apple, Google), JWT
โ”œโ”€โ”€ member       # ํšŒ์›, ํ”„๋กœํ•„, ์ฒด์ค‘
โ”œโ”€โ”€ grouping     # ๊ทธ๋ฃน, ์ดˆ๋Œ€ ์ฝ”๋“œ, ๊ตฌ์„ฑ์›
โ”œโ”€โ”€ record       # ์‹์‚ฌยท์šด๋™ ๊ธฐ๋ก, ๋Œ“๊ธ€
โ”œโ”€โ”€ challenge    # ๊ฑธ์Œ ์ˆ˜ยท์ฃผ๊ฐ„ ์ฑŒ๋ฆฐ์ง€, ์ธ์ฆ, ๊ณต์œ  ์ด๋ฏธ์ง€
โ”œโ”€โ”€ notification # ์•Œ๋ฆผ ์ƒ์„ฑยท๋ฐœ์†ก(FCM), ๋ฆฌ๋งˆ์ธ๋” ์Šค์ผ€์ค„๋Ÿฌ
โ”œโ”€โ”€ report       # ๊ธฐ๋ก ์‹ ๊ณ 
โ”œโ”€โ”€ admin        # ์šด์˜ ์ฝ˜์†” API
โ””โ”€โ”€ common       # ๊ณตํ†ต ์‘๋‹ตยท์˜ˆ์™ธ, ์—…๋กœ๋“œ, ID ์ƒ์„ฑ, ์Šค์ผ€์ค„๋ง

Getting Started

๋กœ์ปฌ ์‹คํ–‰์€ ๊ธฐ๋ณธ์ ์œผ๋กœ local profile์„ ์‚ฌ์šฉํ•˜๋ฉฐ MySQL ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. DB ์„ค์ •์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

./gradlew bootRun
DB_URL=jdbc:mysql://localhost:3306/mody
DB_USERNAME=root
DB_PASSWORD=...

Verification

./gradlew build
./gradlew test

About

[๐Ÿฅ‡ CMC 19th ๋Œ€์ƒ] ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ํ•˜๋Š” ๋‹ค์ด์–ดํŠธ ์Šต๊ด€, ๋ชจ๋”” mody

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages