Skip to content

hyeeyoung/wishboard-server-v2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

wishboard-server-v2


μœ„μ‹œλ¦¬μŠ€νŠΈ 관리λ₯Ό μœ„ν•œ λ°±μ—”λ“œ μ„œλ²„μž…λ‹ˆλ‹€.


λͺ©μ°¨


wishboard-server-v2 정보

이 ν”„λ‘œμ νŠΈλŠ” μ‚¬μš©μžκ°€ μœ„μ‹œλ¦¬μŠ€νŠΈλ₯Ό λ§Œλ“€κ³  관리할 수 μžˆλŠ” ν”Œλž«νΌμΈ Wishboard μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ°±μ—”λ“œ μ„œλ²„μž…λ‹ˆλ‹€. μ‚¬μš©μž 인증, 데이터 μ €μž₯ 및 ν”„λ‘ νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ APIλ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. Wishboard μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ Google Play Store 및 App Storeμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


λͺ¨λ“ˆ μ„€λͺ…

.github (CI/CD)

GitHub Actions μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ‚¬μš©ν•˜μ—¬ CI/CD (지속적 톡합/지속적 배포) νŒŒμ΄ν”„λΌμΈμ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œ λ³€κ²½ 사항을 μžλ™μœΌλ‘œ λΉŒλ“œ, ν…ŒμŠ€νŠΈ 및 배포할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ£Όμš” μ›Œν¬ν”Œλ‘œμš°:
    • deploy-dev.yaml: develop λΈŒλžœμΉ˜μ— ν‘Έμ‹œλ˜κ±°λ‚˜ μˆ˜λ™μœΌλ‘œ 트리거될 λ•Œ, λ³€κ²½λœ λͺ¨λ“ˆ(api, parsing-api, push)을 λΉŒλ“œν•˜μ—¬ 개발 ν™˜κ²½(AWS S3)에 λ°°ν¬ν•©λ‹ˆλ‹€.
    • deploy-prod.yaml: main λΈŒλžœμΉ˜μ— ν‘Έμ‹œλ˜κ±°λ‚˜ μˆ˜λ™μœΌλ‘œ 트리거될 λ•Œ, λ³€κ²½λœ λͺ¨λ“ˆμ„ λΉŒλ“œν•˜μ—¬ 운영 ν™˜κ²½(AWS S3)에 λ°°ν¬ν•©λ‹ˆλ‹€.
  • μ£Όμš” μ‚¬μš© μ•‘μ…˜:
    • actions/checkout@v3: 리포지토리 μ½”λ“œλ₯Ό μ²΄ν¬μ•„μ›ƒν•©λ‹ˆλ‹€.
    • dorny/paths-filter@v3: νŠΉμ • 경둜의 파일 λ³€κ²½ 사항을 κ°μ§€ν•˜μ—¬ μ‘°κ±΄λΆ€λ‘œ μ›Œν¬ν”Œλ‘œμš° 단계λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
    • actions/setup-java@v3: Java (Corretto JDK) ν™˜κ²½μ„ μ„€μ •ν•©λ‹ˆλ‹€. (api λͺ¨λ“ˆ)
    • actions/setup-node@v1: Node.js ν™˜κ²½μ„ μ„€μ •ν•©λ‹ˆλ‹€. (parsing-api, push λͺ¨λ“ˆ)
    • aws-actions/configure-aws-credentials@v1: AWS 자격 증λͺ…을 κ΅¬μ„±ν•˜μ—¬ S3 등에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

api (메인 API μ„œλ²„)

Spring Boot 기반으둜 κ΅¬μΆ•λœ 메인 λ°±μ—”λ“œ API μ„œλ²„μž…λ‹ˆλ‹€. Wishboard μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  • μ£Όμš” κΈ°λŠ₯: μ‚¬μš©μž 인증, μœ„μ‹œλ¦¬μŠ€νŠΈ μ•„μ΄ν…œ 관리, 폴더 관리, μž₯λ°”κ΅¬λ‹ˆ, μ•Œλ¦Ό μ„€μ • λ“±
  • 기술 μŠ€νƒ 및 μ˜μ‘΄μ„±:
    • μ–Έμ–΄/ν”„λ ˆμž„μ›Œν¬: Java 21, Spring Boot 3.3.3, Spring Security, Spring Data JPA
    • λ°μ΄ν„°λ² μ΄μŠ€: MySQL
    • μΊμ‹œ: Redis, Caffeine (둜컬 μΊμ‹œ)
    • 검색 및 ORM: QueryDSL
    • API λ¬Έμ„œν™”: Swagger (OpenAPI)
    • ν΄λΌμš°λ“œ μ„œλΉ„μŠ€: AWS S3 (이미지 λ“± 파일 μ €μž₯)
    • 인증: JWT (JSON Web Token)
    • λͺ¨λ‹ˆν„°λ§ 및 λ‘œκΉ…: Sentry, Spring Boot Actuator, Micrometer (Prometheus), Logback
    • λΉŒλ“œ 도ꡬ: Gradle
    • 기타: ModelMapper, Spring WebFlux (뢀뢄적 μ‚¬μš©), Spring Mail
  • μ•„ν‚€ν…μ²˜:
    • 도메인 주도 섀계(DDD) 기반: 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 도메인 λͺ¨λΈμ— μ§‘μ€‘μ‹œμΌœ λ³΅μž‘μ„±μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
    • νŒ¨ν‚€μ§€ ꡬ쑰: κΈ°λŠ₯적 λͺ¨λ“ˆν™”(예: auth, item, folder, user λ“±)λ₯Ό λ”°λ₯΄λ©°, 각 λͺ¨λ“ˆμ€ DDD의 κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ„ λ°˜μ˜ν•©λ‹ˆλ‹€.
      • com.wishboard.server.<도메인λͺ…>.presentation:
        • Controller: HTTP μš”μ²­μ„ λ°›μ•„ Application Service에 처리λ₯Ό μœ„μž„ν•˜κ³ , κ²°κ³Όλ₯Ό HTTP μ‘λ‹΅μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€. (예: ItemController.java)
        • dto: ν”„λ ˆμ  ν…Œμ΄μ…˜ κ³„μΈ΅μ—μ„œ μ‚¬μš©ν•˜λŠ” 데이터 전솑 객체 (μš”μ²­/응닡 DTO)λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
        • docs: API λ¬Έμ„œν™” κ΄€λ ¨ 클래슀 (Swagger λ“±)λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
      • com.wishboard.server.<도메인λͺ…>.application:
        • service: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μœ μŠ€μΌ€μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. 도메인 객체와 μΈν”„λΌμŠ€νŠΈλŸ­μ²˜ 계측을 μ‘°μ •ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. (예: ItemService.java)
        • dto: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλΉ„μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 데이터 전솑 객체λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
      • com.wishboard.server.<도메인λͺ…>.domain:
        • model: 도메인 μ—”ν‹°ν‹°, κ°’ 객체(VO) λ“± 핡심 도메인 λͺ¨λΈμ„ μ •μ˜ν•©λ‹ˆλ‹€. (예: Item.java, Folder.java)
        • repository: 도메인 객체의 μ˜μ†μ„±μ„ μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. (예: ItemRepository.java)
      • com.wishboard.server.<도메인λͺ…>.infrastructure:
        • λ¦¬ν¬μ§€ν† λ¦¬μ˜ μ‹€μ œ κ΅¬ν˜„μ²΄(JPA, QueryDSL λ“± ν™œμš©), μ™ΈλΆ€ μ„œλΉ„μŠ€(S3, 메일 μ„œλ²„ λ“±)μ™€μ˜ 연동 둜직 등을 ν¬ν•¨ν•©λ‹ˆλ‹€. (예: ItemRepositoryImpl.java, S3FileStorageClient.java)
    • API: RESTful APIλ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈ(λͺ¨λ°”일 μ•± λ“±)와 ν†΅μ‹ ν•©λ‹ˆλ‹€.
    • μ˜ˆμ™Έ 처리: @ControllerAdviceλ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ—­μ μœΌλ‘œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κ³ , μΌκ΄€λœ 였λ₯˜ 응닡 ν˜•μ‹μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
    • 곡톡 관심사: Spring AOPλ₯Ό ν™œμš©ν•˜μ—¬ λ‘œκΉ…, νŠΈλžœμž­μ…˜ 관리 λ“± 곡톡 관심사λ₯Ό λͺ¨λ“ˆν™”ν•˜μ—¬ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • μ„€μ • 및 곡톡 μœ ν‹Έλ¦¬ν‹°: com.wishboard.server.config νŒ¨ν‚€μ§€μ—μ„œ 각쒅 μ„€μ •(λ³΄μ•ˆ, Swagger, Redis, S3 λ“±)을 κ΄€λ¦¬ν•˜κ³ , com.wishboard.server.common νŒ¨ν‚€μ§€μ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” μœ ν‹Έλ¦¬ν‹°, μ˜ˆμ™Έ 클래슀, 응닡 DTO 등을 μ œκ³΅ν•©λ‹ˆλ‹€.

parsing-api (μƒν’ˆ 정보 νŒŒμ‹± API μ„œλ²„)

Node.js 및 Express 기반으둜 κ΅¬μΆ•λœ API μ„œλ²„λ‘œ, 제곡된 URLλ‘œλΆ€ν„° μƒν’ˆ 정보λ₯Ό νŒŒμ‹±(μŠ€ν¬λž˜ν•‘)ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

  • μ£Όμš” κΈ°λŠ₯: μ™ΈλΆ€ μ‡Όν•‘λͺ° μƒν’ˆ νŽ˜μ΄μ§€ URL을 μž…λ ₯λ°›μ•„ μƒν’ˆλͺ…, 가격, 이미지 URL λ“±μ˜ 정보λ₯Ό μΆ”μΆœν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 기술 μŠ€νƒ 및 μ˜μ‘΄μ„±:
    • μ–Έμ–΄/ν”„λ ˆμž„μ›Œν¬: Node.js (18.x), Express.js
    • μ›Ή μŠ€ν¬λž˜ν•‘: Cheerio (HTML νŒŒμ‹±), Axios (HTTP μš”μ²­)
    • λ‘œκΉ…: Winston, Morgan
    • λ³΄μ•ˆ: Helmet, HPP
    • μš”μ²­ μ œν•œ: express-rate-limit
    • λΉŒλ“œ 도ꡬ: Webpack
    • 기타: dotenv, app-root-path
  • μ•„ν‚€ν…μ²˜:
    • νŠΉμ • μ—”λ“œν¬μΈνŠΈ (/item/parse)둜 μš”μ²­μ„ λ°›μœΌλ©΄, ν•΄λ‹Ή URL의 HTML을 가져와 Cheerioλ₯Ό μ‚¬μš©ν•˜μ—¬ 메타 νƒœκ·Έ(Open Graph λ“±) 및 μ£Όμš” HTML μš”μ†Œμ—μ„œ μƒν’ˆ 정보λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.
    • 였λ₯˜ 처리 및 λ‘œκΉ… 미듀웨어λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•ˆμ •μ„±μ„ λ†’μž…λ‹ˆλ‹€.

push (ν‘Έμ‹œ μ•Œλ¦Ό μ„œλ²„)

Node.js 및 Express 기반으둜 κ΅¬μΆ•λœ μ„œλ²„λ‘œ, μ‚¬μš©μžμ—κ²Œ λ‹€μ–‘ν•œ 쑰건에 따라 ν‘Έμ‹œ μ•Œλ¦Όμ„ μ „μ†‘ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

  • μ£Όμš” κΈ°λŠ₯: μƒν’ˆ 가격 변동 μ•Œλ¦Ό, μž¬μž…κ³  μ•Œλ¦Ό, 폴더 μ•„μ΄ν…œ κ΄€λ ¨ μ•Œλ¦Ό λ“± μ‚¬μš©μž 섀정에 λ”°λ₯Έ ν‘Έμ‹œ λ©”μ‹œμ§€ λ°œμ†‘.
  • 기술 μŠ€νƒ 및 μ˜μ‘΄μ„±:
    • μ–Έμ–΄/ν”„λ ˆμž„μ›Œν¬: Node.js (18.x), Express.js
    • ν‘Έμ‹œ μ•Œλ¦Ό: Firebase Admin SDK (FCM - Firebase Cloud Messaging)
    • μŠ€μΌ€μ€„λ§: node-schedule (주기적인 μ•Œλ¦Ό μž‘μ—… μˆ˜ν–‰)
    • λ°μ΄ν„°λ² μ΄μŠ€: MySQL2 (μ•Œλ¦Ό λŒ€μƒ μ‚¬μš©μž 및 μƒν’ˆ 정보 쑰회)
    • λ‘œκΉ…: Winston, Morgan
    • λ³΄μ•ˆ: Helmet, HPP
    • λΉŒλ“œ 도ꡬ: Webpack
    • 기타: dotenv, app-root-path, axios
  • μ•„ν‚€ν…μ²˜:
    • node-schedule을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • μ‹œκ°„ κ°„κ²©μœΌλ‘œ μ•Œλ¦Ό 쑰건을 ν™•μΈν•˜κ³ , 쑰건에 λΆ€ν•©ν•˜λŠ” μ‚¬μš©μžμ—κ²Œ FCM을 톡해 ν‘Έμ‹œ μ•Œλ¦Όμ„ μ „μ†‘ν•©λ‹ˆλ‹€.
    • API μ—”λ“œν¬μΈνŠΈλ₯Ό 톡해 μ¦‰μ‹œ μ•Œλ¦Όμ„ νŠΈλ¦¬κ±°ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. (예: νŠΉμ • 이벀트 λ°œμƒ μ‹œ)
    • MySQL λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°λ™ν•˜μ—¬ μ•Œλ¦Ό λŒ€μƒ 및 κ΄€λ ¨ 데이터λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

개발 ν™˜κ²½

  • Core Stack (api λͺ¨λ“ˆ κΈ°μ€€):
    • Java 21
    • Spring Boot 3.3.3
    • Gradle
  • Core Stack (parsing-api, push λͺ¨λ“ˆ κΈ°μ€€):
    • Node.js 18.x
    • Express.js
    • Webpack
  • Database & Cache:
    • MySQL
    • Redis
  • Cloud Services:
    • AWS S3 (for file storage)
  • API & Documentation:
    • Swagger (OpenAPI) - for api module
  • DevOps & Monitoring:
    • Docker (둜컬 개발 ν™˜κ²½)
    • Sentry (μ—λŸ¬ νŠΈλž˜ν‚Ή)
    • Spring Boot Actuator (μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λͺ¨λ‹ˆν„°λ§ - api module)
    • Micrometer (Prometheus) (λ©”νŠΈλ¦­ μˆ˜μ§‘ - api module)
    • Winston (λ‘œκΉ… - parsing-api, push modules)

API λ¬Έμ„œ

메인 API μ„œλ²„(api λͺ¨λ“ˆ)의 API λ¬Έμ„œλŠ” Swagger (OpenAPI)λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λ©λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ ν›„ λ‹€μŒ μ£Όμ†Œμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€: http://localhost:8080/swagger-ui.html (μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‹€λ₯Έ ν¬νŠΈμ—μ„œ μ‹€ν–‰λ˜λŠ” 경우 포트λ₯Ό μ‘°μ •ν•˜μ‹­μ‹œμ˜€.)


μ„€μ •

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •(λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°, AWS 자격 증λͺ…, Redis 호슀트/포트 λ“±)은 λ‹€μŒ νŒŒμΌμ„ 톡해 κ΄€λ¦¬λ©λ‹ˆλ‹€:

  • api λͺ¨λ“ˆ: api/src/main/resources/application.yml (및 application-{profile}.yml νŒŒμΌλ“€)
  • parsing-api λͺ¨λ“ˆ: parsing-api/.env
  • push λͺ¨λ“ˆ: push/.env

ERD

λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ 및 μ—”ν‹°ν‹° 관계에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 여기에 λ¬Έμ„œν™”λ  μ˜ˆμ •μž…λ‹ˆλ‹€.


μ•„ν‚€ν…μ²˜

μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜, ꡬ성 μš”μ†Œ 및 μƒν˜Έ μž‘μš©μ— λŒ€ν•œ κ°œμš”λŠ” 여기에 제곡될 μ˜ˆμ •μž…λ‹ˆλ‹€. (각 λͺ¨λ“ˆλ³„ μ•„ν‚€ν…μ²˜λŠ” λͺ¨λ“ˆ μ„€λͺ… μ„Ήμ…˜ μ°Έκ³ )


디렉토리 ꡬ쑰

wishboard-server-v2/
β”œβ”€β”€ .github/                    # GitHub Actions μ›Œν¬ν”Œλ‘œμš° (CI/CD)
β”‚   └── workflows/
β”‚       β”œβ”€β”€ deploy-dev.yaml     # 개발 ν™˜κ²½ 배포 μ›Œν¬ν”Œλ‘œμš°
β”‚       └── deploy-prod.yaml    # 운영 ν™˜κ²½ 배포 μ›Œν¬ν”Œλ‘œμš°
β”œβ”€β”€ api/                        # 메인 API μ„œλ²„ (Spring Boot)
β”‚   β”œβ”€β”€ build.gradle
β”‚   β”œβ”€β”€ src/main/java/          # Java μ†ŒμŠ€ μ½”λ“œ
β”‚   └── src/main/resources/     # μ„€μ • 파일, 정적 λ¦¬μ†ŒμŠ€
β”œβ”€β”€ parsing-api/                # μƒν’ˆ 정보 νŒŒμ‹± API μ„œλ²„ (Node.js)
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ src/                    # JavaScript μ†ŒμŠ€ μ½”λ“œ
β”‚   └── webpack.config.js
β”œβ”€β”€ push/                       # ν‘Έμ‹œ μ•Œλ¦Ό μ„œλ²„ (Node.js)
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ src/                    # JavaScript μ†ŒμŠ€ μ½”λ“œ
β”‚   └── webpack.config.js
β”œβ”€β”€ README.md                   # ν”„λ‘œμ νŠΈ κ°œμš” 및 λ¬Έμ„œ
β”œβ”€β”€ deploy.sh                   # 배포 슀크립트 (EC2 λ‚΄λΆ€μ—μ„œ μ‚¬μš©)
β”œβ”€β”€ v2-pm2-run-dev.js           # PM2 개발 ν™˜κ²½ μ‹€ν–‰ μ„€μ •
└── v2-pm2-run-prod.js          # PM2 운영 ν™˜κ²½ μ‹€ν–‰ μ„€μ •
...

(이것은 λ‹¨μˆœν™”λœ ν‘œν˜„μž…λ‹ˆλ‹€. μ‹€μ œ ꡬ쑰에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ ls() λͺ…λ Ή 좜λ ₯을 μ°Έμ‘°ν•˜κ±°λ‚˜ 'tree'와 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•˜μ‹­μ‹œμ˜€.)



μœ„ λ¬Έμ„œλŠ” google 비동기 μ½”λ”© μ—μ΄μ „νŠΈ julesκ°€ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

About

WishBoard Server with DDD (Domain-Driven Design) & mono repo πŸš›

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •