Skip to content

Central-MakeUs/Delta-Server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

545 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

img_4.png

์„ธ๋ชจ - ์ˆ˜ํ•™ ๋ฌธ์ œ ์‚ฌ์ง„์œผ๋กœ ์˜ค๋‹ต์นด๋“œ ์ƒ์„ฑ/๊ด€๋ฆฌ ์„œ๋น„์Šค

์„ธ๋ชจ๋Š” ์ˆ˜ํ•™ ๋ฌธ์ œ ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ•˜๋ฉด OCR/AI ๋ถ„์„์„ ํ†ตํ•ด ๋‹จ์›ยท์œ ํ˜•์„ ์ถ”์ฒœํ•˜๊ณ , ์‚ฌ์šฉ์ž๋Š” ์ตœ์†Œ ์ˆ˜์ •๋งŒ์œผ๋กœ ์˜ค๋‹ต์นด๋“œ๋ฅผ ์ƒ์„ฑ/๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

Architecture

Service/Infra Architecture

System Architecture

๊ฐœ์„  ๊ณผ์ •

Tech Stack

  • Java 17
  • Spring Boot 3.5.x
  • Gradle (Wrapper)
  • MySQL, Redis
  • JPA + QueryDSL
  • Spring Security + JWT
  • Swagger (springdoc-openapi)
  • AWS S3 (Asset + Presigned URL)
  • ์™ธ๋ถ€ ์—ฐ๋™: Mathpix(OCR), Gemini(AI), Kakao/Apple OAuth

ํ…Œ์ŠคํŠธ/์ปค๋ฒ„๋ฆฌ์ง€

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: JUnit 5, Mockito
  • ๋ชฉํ‘œ: ์ „์ฒด ์ปค๋ฒ„๋ฆฌ์ง€ 60%+ ์œ ์ง€, ์ฃผ์š” ๋„๋ฉ”์ธ/์„œ๋น„์Šค ์šฐ์„ 
  • ํ˜„์žฌ: 65%+ ์œ ์ง€ ์ค‘

์ฃผ์š” ๊ธฐ๋Šฅ

ProblemScan ํŒŒ์ดํ”„๋ผ์ธ

  • ์‚ฌ์ง„ ์—…๋กœ๋“œ โ†’ problem_scan ์ž‘์—…์นด๋“œ ์ƒ์„ฑ โ†’ ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ Asset(ORIGINAL)๋กœ S3 ์ €์žฅ
  • ๋น„๋™๊ธฐ OCR ์ˆ˜ํ–‰ โ†’ ๊ฒฐ๊ณผ ์ €์žฅ โ†’ ์ƒํƒœ OCR_DONE
  • ๋น„๋™๊ธฐ AI ๋ถ„๋ฅ˜(๋‹จ์›/์œ ํ˜•) ์ˆ˜ํ–‰ โ†’ ๊ฒฐ๊ณผ ์ €์žฅ โ†’ ์ƒํƒœ AI_DONE
  • ์ถ”์ฒœ ๊ฒฐ๊ณผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์†Œ ์ˆ˜์ • ํ›„ ์ตœ์ข… ๋“ฑ๋ก

์šด์˜ ์•ˆ์ •์„ฑ(์™ธ๋ถ€ API)

  • ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€(๋ฝ): locked_at / lock_owner / lock_token
  • ์žฌ์‹œ๋„/๋ฐฑ์˜คํ”„: *_attempt_count, next_retry_at
  • 429(๋ ˆ์ดํŠธ๋ฆฌ๋ฐ‹): ์‹คํŒจ๊ฐ€ ์•„๋‹ˆ๋ผ ๋Œ€๊ธฐ ์„ฑ๊ฒฉ์œผ๋กœ ๋ณ„๋„ ์ƒํ•œ/๋”œ๋ ˆ์ด ์ •์ฑ…
  • ์ƒํƒœ ์ „์ด ์ œํ•œ: UPLOADED โ†’ OCR_DONE โ†’ AI_DONE ๋˜๋Š” FAILED
  • ์›๋ฌธ ์ €์žฅ: ocr_raw_json(OCR), ai_draft_json(AI)

์ด๋ฏธ์ง€/์ž์‚ฐ ๊ด€๋ฆฌ

  • Asset ํ…Œ์ด๋ธ” SSOT: ์›๋ณธ/๋ณด์ •/ํฌ๋กญ ์ž์‚ฐ ์ผ์›ํ™”
  • storage_key ๊ทœ์น™ํ™” ๋ฐ Presigned URL ๊ธฐ๋ฐ˜ ์กฐํšŒ

์ฝ”๋“œ ๊ตฌ์กฐ(ํ—ฅ์‚ฌ๊ณ ๋‚ )

  • Hexagonal Architecture (Ports & Adapters)
    • ์™ธ๋ถ€ ์‹œ์Šคํ…œ(S3/OCR/AI/OAuth)์€ port/out + adapter/out๋กœ ๋ถ„๋ฆฌ
    • Controller๋Š” ์š”์ฒญ ๋ฐ”์ธ๋”ฉ/๊ฒ€์ฆ/์œ ์Šค์ผ€์ด์Šค ํ˜ธ์ถœ ์ค‘์‹ฌ์œผ๋กœ ์œ ์ง€
    • ๊ฒ€์ฆ/๊ฐ€๊ณต/์™ธ๋ถ€ ํ˜ธ์ถœ/ํ›„์ฒ˜๋ฆฌ๋Š” Validator/Mapper/Client/PostProcessor๋กœ ๋ถ„๋ฆฌ

์šด์˜ ๊ด€์  (Runbook)

TraceId / ๋กœ๊ทธ

  • ๋ชจ๋“  ์š”์ฒญ์— X-Trace-Id๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์‘๋‹ต ํ—ค๋”๋กœ๋„ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.
  • ์—๋Ÿฌ ๋กœ๊ทธ๋Š” traceId, errorCode, exType, exMsg๋ฅผ ํ•จ๊ป˜ ๋‚จ๊น๋‹ˆ๋‹ค.

์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ •์ฑ…

  • ๋น„์ฆˆ๋‹ˆ์Šค/๋„๋ฉ”์ธ ์—๋Ÿฌ๋Š” BusinessException + ErrorCode๋กœ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค.
  • 5xx(ErrorCode.status๊ฐ€ 5xx)์ธ ๊ฒฝ์šฐ, ํด๋ผ์ด์–ธํŠธ์—๋Š” ์ƒ์„ธ ๋ฉ”์‹œ์ง€/๋ฐ์ดํ„ฐ๋ฅผ ์ˆจ๊ธฐ๊ณ  ๊ธฐ๋ณธ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.

ProblemScan ์›Œ์ปค ์•ˆ์ •์„ฑ(๋ฝ/์žฌ์‹œ๋„)

  • ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€: DB ๊ธฐ๋ฐ˜ ๋ฝ(locked_at / lock_owner / lock_token)
  • ์žฌ์‹œ๋„/๋ฐฑ์˜คํ”„: *_attempt_count, next_retry_at
  • AI๋Š” 429(๋ ˆ์ดํŠธ๋ฆฌ๋ฐ‹) ์ผ€์ด์Šค๋ฅผ ๋ณ„๋„ ์นด์šดํŠธ/์ƒํ•œ์œผ๋กœ ๋” ๊ธธ๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์—ฐ๋™(OAuth/OCR/AI) ์‹คํŒจ ์‹œ ๊ด€์ 

  • provider 4xx(์ž˜๋ชป๋œ code/ํ† ํฐ ๋“ฑ): ์ธ์ฆ ์‹คํŒจ๋กœ ๊ฐ„์ฃผ
  • provider 5xx/timeout: ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์žฅ์• ๋กœ ๊ฐ„์ฃผ(์šด์˜ ์•Œ๋ฆผ/์žฌ์‹œ๋„ ๋Œ€์ƒ)

Lint / Format (Spotless)

  • ํฌ๋งท ์ ์šฉ: ./gradlew spotlessApply
  • ํฌ๋งท ๊ฒ€์‚ฌ: ./gradlew spotlessCheck

About

๐Ÿฅ‡ CMC 18th ๋Œ€์ƒ ๐Ÿฅ‡ ๋‚˜๋งŒ์˜ ์ˆ˜ํ•™ ์˜ค๋‹ต๋…ธํŠธ - ์„ธ๋ชจ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors