Skip to content

Latest commit

ย 

History

211 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽง ์˜ค๋Š˜์˜ ์†Œ๋ฆฌ ยท Backend

์‹œ๊ฐ์žฅ์• ์ธ์„ ์œ„ํ•œ ๋งž์ถคํ˜• ์ •๋ณด ๊ตฌ๋… ์•Œ๋ฆผ ์„œ๋น„์Šค์˜ API ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ๊ตฌ๋…ํ•œ ์›นํŽ˜์ด์ง€์˜ ์ƒˆ ๊ธ€์„ ํฌ๋กค๋Ÿฌ๊ฐ€ ์ˆ˜์ง‘ยท์š”์•ฝํ•˜๋ฉด, ์ด ์„œ๋ฒ„๊ฐ€ ์ €์žฅํ•˜๊ณ  ํ‘ธ์‹œ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

App Store ์ „์ฒด ๋ฌธ์„œ


1๏ธโƒฃ ๊ธฐ์ˆ  ์Šคํƒ

๊ตฌ๋ถ„ ์‚ฌ์šฉ ๊ธฐ์ˆ 
์–ธ์–ดยท๋Ÿฐํƒ€์ž„ 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

2๏ธโƒฃ ์ธํ”„๋ผ ๊ตฌ์„ฑ

AWS ์ธํ”„๋ผ

  • 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 ์›Œํฌํ”Œ๋กœ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ CI/CD ํŒŒ์ดํ”„๋ผ์ธ

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

CI โ€” .github/workflows/ci.yml (devยทmain ๋Œ€์ƒ PR)

  1. JDK 17 ์„ธํŒ… + Gradle ์บ์‹œ
  2. ./gradlew compileJava compileTestJava
  3. SPRING_PROFILES_ACTIVE=ci ๋กœ ./gradlew test
  4. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ PR ์ฒดํฌ๋กœ ๊ฒŒ์‹œ, bootJar๋กœ ๋นŒ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊นŒ์ง€ ํ™•์ธ

CD (dev ๋ธŒ๋žœ์น˜ push)

  1. bootJar ๋นŒ๋“œ ํ›„ ์ด๋ฏธ์ง€ ์ƒ์„ฑ, Docker Hub์— latest์™€ ์ปค๋ฐ‹ SHA 7์ž๋ฆฌ ํƒœ๊ทธ๋กœ push
  2. Terraform Cloud API์—์„œ main_server_ip ยท rds_address ยท s3_bucket_name ๋“ฑ ์ถœ๋ ฅ๊ฐ’ ์กฐํšŒ
  3. EC2์— SSH ์ ‘์† โ†’ .env ์ฃผ์ž… โ†’ docker compose pull app && docker compose up -d app โ†’ ๋ฏธ์‚ฌ์šฉ ์ด๋ฏธ์ง€ ์ •๋ฆฌ
  4. /actuator/health ๋ฅผ 5์ดˆ ๊ฐ„๊ฒฉ 15ํšŒ๊นŒ์ง€ ํ™•์ธ, ์‹คํŒจํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ๋ฐฐํฌ ์‹คํŒจ ์ฒ˜๋ฆฌ

4๏ธโƒฃ ํฌ๋กค๋ง ยท ์š”์•ฝ ์•„ํ‚คํ…์ฒ˜

๊ตฌ๋…ํ•œ ์›นํŽ˜์ด์ง€๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•ด ์ƒˆ ๊ธ€๋งŒ ์š”์•ฝํ•˜๊ณ , ์•Œ๋ฆผ๊นŒ์ง€ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ํ๋ฆ„์ž…๋‹ˆ๋‹ค. ํฌ๋กค๋Ÿฌ ์ฝ”๋“œ๋Š” 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 ์•ฑ์ด ์Œ์„ฑ์œผ๋กœ ์žฌ์ƒ

5๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

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 ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.


6๏ธโƒฃ ๋กœ์ปฌ ์‹คํ–‰

# 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 ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

7๏ธโƒฃ API ๋ฌธ์„œ

๋ฌธ์„œ ๊ฒฝ๋กœ
Spring REST Docs /docs/index.html (bootJar ์‹œ ์ •์  ๋ฆฌ์†Œ์Šค๋กœ ํฌํ•จ)
Swagger UI /swagger-ui.html
OpenAPI JSON /v3/api-docs

API ๋™์ž‘์ด ๋ฐ”๋€Œ๋ฉด REST Docs ์Šค๋‹ˆํŽซ์„ ๊ฐฑ์‹ ํ•˜๊ณ  PR ๋ณธ๋ฌธ์— ํ•จ๊ป˜ ์ ์–ด ์ฃผ์„ธ์š”.


8๏ธโƒฃ ๋ธŒ๋žœ์น˜ ยท ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

  • ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋Š” dev, ๋ฐฐํฌ ๊ธฐ์ค€ ๋ธŒ๋žœ์น˜๋Š” main์ž…๋‹ˆ๋‹ค.
  • ์ž‘์—… ๋ธŒ๋žœ์น˜๋Š” dev์—์„œ ๋ถ„๊ธฐํ•˜๊ณ , PR ๋Œ€์ƒ์€ ํ•ญ์ƒ dev์ž…๋‹ˆ๋‹ค.
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” feat: ..., fix: ... ๊ฐ™์€ ์งง์€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • PR์—๋Š” ๋ชฉ์ , ์ˆ˜ํ–‰ํ•œ ํ…Œ์ŠคํŠธ(./gradlew test), ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์‹œ Flyway ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋งํฌ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.

9๏ธโƒฃ ๊ด€๋ จ ์ €์žฅ์†Œ

์ €์žฅ์†Œ ์„ค๋ช…
FE iOS ์•ฑ (Swift ยท SwiftUI)
crawler ๊ตฌ๋… ์‚ฌ์ดํŠธ ํฌ๋กค๋Ÿฌ (Python)
terraform-infra AWS ์ธํ”„๋ผ IaC (Terraform)

About

๐Ÿ“ข ๋“ค๋ ค์ฃผ๋Š” ์›น์˜ ์†Œ๋ฆฌ, ์˜ค๋Š˜์˜ ์†Œ๋ฆฌ

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages