์๊ฐ์ฅ์ ์ธ์ ์ํ ๋ง์ถคํ ์ ๋ณด ๊ตฌ๋ ์๋ฆผ ์๋น์ค์ API ์๋ฒ์ ๋๋ค. ๊ตฌ๋ ํ ์นํ์ด์ง์ ์ ๊ธ์ ํฌ๋กค๋ฌ๊ฐ ์์งยท์์ฝํ๋ฉด, ์ด ์๋ฒ๊ฐ ์ ์ฅํ๊ณ ํธ์๋ก ๋ด๋ณด๋ ๋๋ค.
| ๊ตฌ๋ถ | ์ฌ์ฉ ๊ธฐ์ |
|---|---|
| ์ธ์ดยท๋ฐํ์ | Java 17 (Corretto / Temurin), Gradle |
| ํ๋ ์์ํฌ | Spring Boot 3.5.6, Spring Web, Spring Security, Spring Data JPA, QueryDSL 5.0 |
| ๋ฐ์ดํฐ | MySQL 8.0, Flyway 11, p6spy |
| ์๋ฆผ | Firebase Admin SDK 9.2 (FCM) |
| ๋ฌธ์ํ | Spring REST Docs (Asciidoctor), springdoc-openapi 2.7 |
| ๊ด์ธก | Actuator, Micrometer Prometheus, Micrometer Tracing(Brave) + Zipkin, Loki(logstash-logback-encoder), Sentry |
| ํ ์คํธ | JUnit 5, Spring Boot Test, Testcontainers(MySQL) |
| ์ธํ๋ผ | Docker, AWS EC2 / RDS / S3 / Route53, Terraform Cloud, GitHub Actions |
- main EC2 โ Spring Boot(:8080)์ Grafana Alloy ์ปจํ
์ด๋๋ฅผ
docker compose๋ก ์ด์ํฉ๋๋ค. - RDS MySQL 8.0 โ private ์๋ธ๋ท์ ๋๊ณ db subnet group์ผ๋ก ๋ฌถ์์ต๋๋ค. ์คํค๋ง๋ Flyway๊ฐ ๊ด๋ฆฌํฉ๋๋ค.
- S3 โ ์๋น์ค ์์ฐ ๋ฒํท(๋ฒ์ ๋ยทCORS)๊ณผ ๋ก๊ทธ ๋ฒํท(Loki ์ฒญํฌ ์ ์ฅ์)์ ๋ถ๋ฆฌํ์ต๋๋ค.
- ๊ด์ธก โ Alloy๊ฐ
/actuator/prometheus๋ฉํธ๋ฆญ, ๋์ปค ๋ก๊ทธ, OTLP ํธ๋ ์ด์ค๋ฅผ ๊ฐ๊ฐ Prometheus ยท Loki ยท Tempo๋ก ๋ณด๋ด๊ณ Grafana์์ ํจ๊ป ๋ด ๋๋ค. - ๋ชจ๋ ๋ฆฌ์์ค๋
terraform-infra์์ Terraform Cloud VCS ์ํฌํ๋ก๋ก ๊ด๋ฆฌํฉ๋๋ค.
CI โ .github/workflows/ci.yml (devยทmain ๋์ PR)
- JDK 17 ์ธํ + Gradle ์บ์
./gradlew compileJava compileTestJavaSPRING_PROFILES_ACTIVE=ci๋ก./gradlew test- ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ PR ์ฒดํฌ๋ก ๊ฒ์,
bootJar๋ก ๋น๋ ๊ฐ๋ฅ ์ฌ๋ถ๊น์ง ํ์ธ
CD (dev ๋ธ๋์น push)
bootJar๋น๋ ํ ์ด๋ฏธ์ง ์์ฑ, Docker Hub์latest์ ์ปค๋ฐ SHA 7์๋ฆฌ ํ๊ทธ๋ก push- Terraform Cloud API์์
main_server_ipยทrds_addressยทs3_bucket_name๋ฑ ์ถ๋ ฅ๊ฐ ์กฐํ - EC2์ SSH ์ ์ โ
.env์ฃผ์ โdocker compose pull app && docker compose up -d appโ ๋ฏธ์ฌ์ฉ ์ด๋ฏธ์ง ์ ๋ฆฌ /actuator/health๋ฅผ 5์ด ๊ฐ๊ฒฉ 15ํ๊น์ง ํ์ธ, ์คํจํ๋ฉด ์ปจํ ์ด๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ณ ๋ฐฐํฌ ์คํจ ์ฒ๋ฆฌ
๊ตฌ๋
ํ ์นํ์ด์ง๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํด ์ ๊ธ๋ง ์์ฝํ๊ณ , ์๋ฆผ๊น์ง ๋ง๋ค์ด ๋ด๋ ํ๋ฆ์
๋๋ค.
ํฌ๋กค๋ฌ ์ฝ๋๋ crawler ์ ์ฅ์์ ์๊ณ , ์ด ์๋ฒ๋ /internal/** API๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
| ๋จ๊ณ | ๋์ |
|---|---|
| โ | ํฌ๋กค๋ฌ๊ฐ GET /internal/subscriptions ๋ก ๊ตฌ๋
๋ชฉ๋ก(์ฌ์ดํธ URL, ํค์๋, last_seen_post_id)์ ๋ฐ์ |
| โก | ์ฌ์ดํธ๋ณ ํฌ๋กค๋ฌ(๋๊ตญ๋ SW๊ต์ก์ ยท ์์ด๋ธ๋ด์ค ยท ํ๊ตญ์๊ฐ์ฅ์ ์ธ๋ณต์ง๊ด)๋ก ๋ถ๊ธฐํด ๋ชฉ๋กยท๋ณธ๋ฌธ ์์ง |
| โข | last_seen_post_id ์ดํ์ ์ฌ๋ผ์จ ๊ธ๋ง ์ถ๋ฆผ. ์ฒซ ์คํ์ด๋ฉด ์๋ฆผ ์์ด ๊ธฐ์ค์ ๋ง ์ ์ฅ |
| โฃ | ๊ตฌ๋ ์ ๊ฑธ๋ฆฐ ํค์๋๊ฐ ์ ๋ชฉยท๋ณธ๋ฌธ์ ์๋์ง ํ์ธ. ๊ฐ์ ๊ธ์ ๋ณธ๋ฌธยท์์ฝ ์บ์๋ก ์ฌ์ฌ์ฉ |
| โค | Gemini 2.5 Flash๊ฐ ์ ๋ชฉยท์๊ฐยท์ฅ์ ์ค์ฌ์ผ๋ก ์์ฝ. ํธ์ถ ์คํจ ์ ๋ณธ๋ฌธ ์๋ถ๋ถ์ ์๋ผ ํด๋ฐฑ |
| โฅ | POST /internal/alerts ๋ก ์์ฝยท์๋ฆผ ์์ฑ, PATCH /internal/subscriptions/{id}/last_seen ์ผ๋ก ๊ธฐ์ค์ ๊ฐฑ์ |
| โฆ | ์๋ฒ๊ฐ summaries์ ์ ์ฅํ๊ณ FCM์ผ๋ก ํธ์ ๋ฐ์ก โ iOS ์ฑ์ด ์์ฑ์ผ๋ก ์ฌ์ |
src/main/java/com/todaysound/todaysound_server
โโ domain
โ โโ user # ์ต๋ช
๊ฐ์
ยท๊ธฐ๊ธฐ ์๋ณ, FCM ํ ํฐ
โ โโ url # ๊ตฌ๋
๋์ ์นํ์ด์ง ์ฃผ์
โ โโ subscription # ๊ตฌ๋
์์ฑยท์์ , ํค์๋, last_seen ๊ธฐ์ค์
โ โโ summary # ํฌ๋กค๋ฌ๊ฐ ๋ง๋ ์์ฝ ์ ์ฅยท์กฐํ
โ โโ feed # ๊ตฌ๋
์ฒ๋ณ ํผ๋ ์กฐํ
โ โโ alarm # ์๋ฆผ ๋ชฉ๋ก, ๋ด๋ถ ์๋ฆผ ์์ฑ API
โโ global
โโ config # Security, Web, FCM, QueryDSL ๋ฑ ์ค์
โโ entity # ๊ณตํต BaseEntity
โโ exception # ์ ์ญ ์์ธ ์ฒ๋ฆฌ
โโ response # ๊ณตํต ์๋ต ํฌ๋งท
โโ presentation # FCM ๋ฐ์ก ์ปจํธ๋กค๋ฌ
โโ utils
๊ฐ ๋๋ฉ์ธ์ controller / service / repository / entity / dto / exception ๊ณ์ธต์ผ๋ก ๋๋๋๋ค.
# 1) ์คํ (๊ธฐ๋ณธ ํ๋กํ: local)
./gradlew bootRun
# 2) ํ
์คํธ - Testcontainers๋ก MySQL์ ๋์ฐ๋ฏ๋ก Docker๊ฐ ํ์ํฉ๋๋ค
./gradlew test
# 3) ์ ์ฒด ๋น๋ (์ปดํ์ผ + ํ
์คํธ + bootJar)
./gradlew build
# 4) REST Docs HTML ์์ฑ
./gradlew asciidoctor- ํ๋กํ์
local/ci/prod์ธ ๊ฐ์ง์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์local. - ๋ก์ปฌ DB ์ ์ ์ ๋ณด๋
.env๋๋ ํ๊ฒฝ๋ณ์๋ก ๋ฎ์ด์๋๋ค. (DB_URL,DB_USERNAME,DB_PASSWORD) - ์คํค๋ง๋ Hibernate๊ฐ ์๋ Flyway๊ฐ ๊ด๋ฆฌํฉ๋๋ค(
ddl-auto: none). ๋ณ๊ฒฝ์ด ํ์ํ๋ฉดV{๋ฒํธ}__{์ค๋ช }.sqlํ์ผ์ ์ถ๊ฐํ์ธ์.
| ๋ฌธ์ | ๊ฒฝ๋ก |
|---|---|
| Spring REST Docs | /docs/index.html (bootJar ์ ์ ์ ๋ฆฌ์์ค๋ก ํฌํจ) |
| Swagger UI | /swagger-ui.html |
| OpenAPI JSON | /v3/api-docs |
API ๋์์ด ๋ฐ๋๋ฉด REST Docs ์ค๋ํซ์ ๊ฐฑ์ ํ๊ณ PR ๋ณธ๋ฌธ์ ํจ๊ป ์ ์ด ์ฃผ์ธ์.
- ๊ธฐ๋ณธ ๋ธ๋์น๋
dev, ๋ฐฐํฌ ๊ธฐ์ค ๋ธ๋์น๋main์ ๋๋ค. - ์์
๋ธ๋์น๋
dev์์ ๋ถ๊ธฐํ๊ณ , PR ๋์์ ํญ์dev์ ๋๋ค. - ์ปค๋ฐ ๋ฉ์์ง๋
feat: ...,fix: ...๊ฐ์ ์งง์ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. - PR์๋ ๋ชฉ์ , ์ํํ ํ
์คํธ(
./gradlew test), ์คํค๋ง ๋ณ๊ฒฝ ์ Flyway ๋ง์ด๊ทธ๋ ์ด์ ๋งํฌ๋ฅผ ์ ์ต๋๋ค.
| ์ ์ฅ์ | ์ค๋ช |
|---|---|
| FE | iOS ์ฑ (Swift ยท SwiftUI) |
| crawler | ๊ตฌ๋ ์ฌ์ดํธ ํฌ๋กค๋ฌ (Python) |
| terraform-infra | AWS ์ธํ๋ผ IaC (Terraform) |


