์น๊ตฌ๋ค๊ณผ ํจ๊ปํ๋ ๋ค์ด์ดํธ ์ต๊ด, ๋ชจ๋
๋ชจ๋๋ ์น๊ตฌ๋ค๊ณผ ํจ๊ป ์์ฌ, ์ด๋, ์ฒด์ค ๊ธฐ๋ก์ ๊ณต์ ํ๋ฉฐ ๋ค์ด์ดํธ ์ต๊ด์ ์ด์ด๊ฐ ์ ์๋๋ก ๋๋ ์๋น์ค์ ๋๋ค. ์ด ์ ์ฅ์๋ ๋ชจ๋์ Java/Spring Boot ๊ธฐ๋ฐ ๋ฐฑ์๋ API ์๋ฒ์ ๋๋ค.
- ADR (21๊ฑด): ํ ๋ ผ์ ๊ธฐ๋ฐ์ ๊ธฐ์ ์ ์์ฌ๊ฒฐ์ ๊ธฐ๋ก
- LLD (36๊ฑด): ๊ธฐ๋ฅ ๋จ์ ๊ตฌํ ์ค๊ณ์ ์ ์ฑ ์ ๋ฆฌ
์ด ํ๋ก์ ํธ๋ ํ๋ค์ค ์์ง๋์ด๋ง ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐํฉ๋๋ค. ์ค๊ณ์ ๊ฒ์ฆ ์ฅ์น๋ฅผ ๋จผ์ ๊ณ ์ ํ๊ณ , ๊ทธ ๊ธฐ์ค์ ๋ง์ถฐ ๊ตฌํ ํ์ง์ ๊ด๋ฆฌํฉ๋๋ค.
Team Discussion
-> ADR
-> LLD
-> Test Scenario
-> Code Generation
-> Human Review
-> PR / CI / Deploy
ํ ๋ด๋ถ์์ ๋ ผ์๋ ๊ธฐ์ ์ ์ ํ์ ADR๋ก ๋จ๊น๋๋ค. ADR์๋ ์ ํํ ๋ฐฉ๋ฒ๋ฟ ์๋๋ผ ๊ณ ๋ คํ ๋์, ํธ๋ ์ด๋์คํ, ํ์ ๋ฆฌ์คํฌ๋ฅผ ํจ๊ป ๊ธฐ๋กํฉ๋๋ค.
ADR์ด ๋ฐฉํฅ์ ์ ํ๋ฉด LLD์์ ์ค์ ๊ตฌํ ๋จ์๋ฅผ ์ค๊ณํฉ๋๋ค. API ์์ฒญ/์๋ต, ๋๋ฉ์ธ ๊ท์น, ์์ธ ์ฝ๋, ์ธ์ฆ ์กฐ๊ฑด, ์ ์ฅ ๋ฐฉ์์ฒ๋ผ ์ฝ๋๋ก ์ฎ๊ฒจ์ง ์ธ๋ถ์ฌํญ์ ๋จผ์ ์ ๋ฆฌํฉ๋๋ค.
LLD์์ ์์๋๋ ์ฃ์ง ์ผ์ด์ค๋ ํ ์คํธ ์๋๋ฆฌ์ค๋ก ๋ช ์ํฉ๋๋ค. ์ด ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์ฌ๋์ด diff์ ํ ์คํธ๋ฅผ ๊ฒํ ํ ๋ค PR๋ก ๋ณํฉํฉ๋๋ค.
Issue ์์ฑ, Commit ์์ฑ, PR ์์ฑ์ ์ ์ฅ์ ์ ์ฉ ์คํฌ์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ณต๋๋ ํ์ ์์ ์ ์์์ ์ผ๊ด๋๊ฒ ์ ์งํ๊ณ , ๋๋ฝ๋๊ธฐ ์ฌ์ด ๋งํฌ์ ์ค๋ช ํ์์ ๊ณ ์ ํ๊ธฐ ์ํจ์ ๋๋ค.
| 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 ์๋ฆผ |
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 ๋ฐฑ์
๋ฒํท)]
- ๋ฐฐํฌ:
main์ ๋จธ์งํ๋ฉด GitHub Actions๊ฐ amd64/arm64 ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ๋ธ๋ฃจ๊ทธ๋ฆฐ์ผ๋ก ๊ต์ฒดํฉ๋๋ค. ์ ์์์ด ํฌ์ค์ฒดํฌ๋ฅผ ํต๊ณผํด์ผ Nginx๊ฐ ํธ๋ํฝ์ ๋๊ธฐ๋ฏ๋ก ๋ฐฐํฌ ์ค์๋ ์๋น์ค๊ฐ ๋๊ธฐ์ง ์์ต๋๋ค. ์ค์ผ์ค ์์ ์ ํ์ฑ ์์ ์ธ์คํด์ค์์๋ง ์คํ๋ฉ๋๋ค. (deploy/prod) - ํ๊ฒฝ:
developโ dev ์๋ฒ,mainโ prod ์๋ฒ๋ก ์๋ ๋ฐฐํฌ๋ฉ๋๋ค. - ๋น์ฉ: ์ด์์ Oracle Always Free, ๊ฐ๋ฐ์ GCP ๋ฌด๋ฃ ๋ฑ๊ธ์์ ์ด์ํฉ๋๋ค.
| ์์ญ | ๋ด์ฉ |
|---|---|
| ๋ชจ๋ํฐ๋ง | Prometheus + Grafana ์์ฃผ. ๋น์ฆ๋์คยท์ฑ๋ฅยท์ฌ์ฉ์ ์งํ(DAU/WAU/MAU, ๊ฐ์ ํผ๋, ์ฃผ๊ฐ ์ฝํธํธ ๋ฆฌํ ์ ) ๋์๋ณด๋ (monitoring) |
| ์ฅ์ ๋์ | 500 ์๋ฌ๋ฅผ Slack์ผ๋ก ์๋ฆฌ๊ณ , ์ด์ ๋ด์ด ์์ธ์ ๋ถ์ํด GitHub ์ด์๋ฅผ ์๋ ์์ฑ |
| ์ผ์ผ ๋ฆฌํฌํธ | ๋งค์ผ 09์ ํต์ฌ ์งํ๋ฅผ Slack์ผ๋ก ๊ณต์ (scripts/daily-report) |
| ์ด์ ์ฝ์ | Google ๋ก๊ทธ์ธ ๊ธฐ๋ฐ ๊ด๋ฆฌ ํ๋ฉด. ์ธ์ฆ ํผ๋, ์ฑ๋ฆฐ์งยท๊ทธ๋ฃน ๊ด๋ฆฌ, ํ์ ๊ด๋ฆฌ, ์ ๊ณ ์ฒ๋ฆฌ, ๊ณต์ง ํธ์, ํต๊ณ, ์์ ์ด๋ ฅ |
| ๋ฐฑ์ | MySQL์ ๋งค์ผ GCS๋ก ๋คํ, 30์ผ ๋ณด๊ด |
src/main/java/cmc/mody
โโโ auth # ์์
๋ก๊ทธ์ธ(Kakao, Apple, Google), JWT
โโโ member # ํ์, ํ๋กํ, ์ฒด์ค
โโโ grouping # ๊ทธ๋ฃน, ์ด๋ ์ฝ๋, ๊ตฌ์ฑ์
โโโ record # ์์ฌยท์ด๋ ๊ธฐ๋ก, ๋๊ธ
โโโ challenge # ๊ฑธ์ ์ยท์ฃผ๊ฐ ์ฑ๋ฆฐ์ง, ์ธ์ฆ, ๊ณต์ ์ด๋ฏธ์ง
โโโ notification # ์๋ฆผ ์์ฑยท๋ฐ์ก(FCM), ๋ฆฌ๋ง์ธ๋ ์ค์ผ์ค๋ฌ
โโโ report # ๊ธฐ๋ก ์ ๊ณ
โโโ admin # ์ด์ ์ฝ์ API
โโโ common # ๊ณตํต ์๋ตยท์์ธ, ์
๋ก๋, ID ์์ฑ, ์ค์ผ์ค๋ง
๋ก์ปฌ ์คํ์ ๊ธฐ๋ณธ์ ์ผ๋ก local profile์ ์ฌ์ฉํ๋ฉฐ MySQL ์ฐ๊ฒฐ์ด ํ์ํฉ๋๋ค.
DB ์ค์ ์ ํ๊ฒฝ๋ณ์๋ก ์ฌ์ ์ํ ์ ์์ต๋๋ค.
./gradlew bootRunDB_URL=jdbc:mysql://localhost:3306/mody
DB_USERNAME=root
DB_PASSWORD=..../gradlew build
./gradlew test