์ฐจ๋ ๋์ฌ/๋ฐ๋ฉ ๊ณผ์ ์์ ์ฐจ๋ ์์์ ์๋์ผ๋ก ํ์งํ๊ณ , ๋ ํ ์ธ์ ๋จ์๋ก ์์ ์ด๋ ฅ์ ๊ด๋ฆฌํ๋ Spring Boot ๊ธฐ๋ฐ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. โข ์ฐจ๋ ๋ ํ ์ธ์ ๊ด๋ฆฌ โข ๋จ์ผ / 4์ฅ ๋ฐฐ์น ์ด๋ฏธ์ง ์ ๋ก๋ โข YOLO โ ViT ๊ธฐ๋ฐ ์์ ํ์ง (๋น๋๊ธฐ ์ฒ๋ฆฌ) โข ๋ ํธ ์์/๋ฐ๋ฉ ์ ์์ ์์ฝ ๋ฐ ์ถ๊ฐ ์์ ๊ณ์ฐ
โธป
- ์ฃผ์ ๊ธฐ๋ฅ
1.1 ์ด๋ฏธ์ง ์ ๋ก๋ โข POST /api/images โข ๋จ์ผ ์ด๋ฏธ์ง ์ ๋ก๋ โข MinIO์ ์ ์ฅ ํ imageId, rawUrl, width, height ๋ฐํ โข POST /api/images/batch โข ์ต๋ 4์ฅ ์ด๋ฏธ์ง ๋ฐฐ์น ์ ๋ก๋ โข ์์ฒญ: โข files: ์ด๋ฏธ์ง ๋ฆฌ์คํธ (1~4์ฅ) โข slots: ์ดฌ์ ์์น (FRONT, REAR, LEFT, RIGHT) โข ์๋ต: โข images: [{ slot, imageId }] โข ์ดํ ๋ ํธ ์์/์ข ๋ฃ ๋ฐฐ์น API์์ ์ฌ์ฉ
โธป
1.2 ๋จ์ผ ์ด๋ฏธ์ง ์์ ํ์ง (๋น๋๊ธฐ) โข POST /api/predictions/by-image/{imageId} โข ๋จ์ผ ์ด๋ฏธ์ง์ ๋ํด ์ธ๋ถ FastAPI ์๋ฒ๋ก ์์ ํ์ง ์์ฒญ โข ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ: โข yoloThreshold (์ ํ) โข ์๋ต: โข jobId, status๋ฅผ ํฌํจํ ๋น๋๊ธฐ ์์ ์ ๋ณด โข GET /api/predictions/jobs/{jobId} โข ์์ ํ์ง ์์ ์ํ ์กฐํ โข ์๋ต: โข ์งํ ์ค: 202 Accepted โข ์คํจ: 422 Unprocessable Entity โข ์๋ฃ: 200 OK + ํ์ง ๊ฒฐ๊ณผ โข bounding box ์ขํ โข ์์ ํด๋์ค๋ณ ํ๋ฅ โข ์ด๋ฏธ์ง ์๋ณธ ํฌ๊ธฐ ์ ๋ณด
โธป
1.3 ๋ ํธ ์์ / ์ข ๋ฃ (4์ฅ ๋ฐฐ์น ์ฒ๋ฆฌ)
๋ ํธ ์์ ๋ฐ ๋ฐ๋ฉ ์ ์/๋ค/์ข/์ฐ 4์ฅ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ์ ๋จ์์ ์์ ์ด๋ ฅ์ ๊ด๋ฆฌํฉ๋๋ค.
1.3.1 ๋ ํธ ์์ โข POST /api/rentals/batch/start/upload โข ์์ฒญ: โข vehicleNo โข yoloThreshold โข images: [{ slot, imageId }] โข ์ฒ๋ฆฌ: โข ๊ฐ ์ด๋ฏธ์ง์ ๋ํด ์์ ํ์ง ์ํ โข ์์ ํ์ ๋ณ ๊ฐ์ ์ง๊ณ (startSummary) โข ์ธ์ ์ ์ฒด ์์ ๊ฐ์(startTotal) ๊ณ์ฐ โข ๋ ํ ์ธ์ ์์ฑ (IN_RENT) โข ์๋ต: โข rentalId โข startSummary โข startTotal
1.3.2 ๋ ํธ ์ข ๋ฃ (๋ฐ๋ฉ) โข POST /api/rentals/batch/end/upload โข ์์ฒญ: โข rentalId โข vehicleNo โข yoloThreshold โข images: [{ slot, imageId }] โข ์ฒ๋ฆฌ: โข ๋ฐ๋ฉ ์ ์์ ์์ฝ(finishSummary) ๊ณ์ฐ โข ๋ ํธ ์์ ๋๋น ์ฆ๊ฐ๋ถ(deltaSummary) ์ฐ์ถ โข ์ถ๊ฐ ์์ ๊ฐ์(newDamageTotal) ๊ณ์ฐ โข ์ธ์ ์ํ RETURNED๋ก ๋ณ๊ฒฝ โข ์๋ต: โข finishSummary โข deltaSummary โข newDamageTotal
โธป
1.4 ๋ ํ ์ธ์ ์กฐํ โข GET /api/rentals/recent โข ์ต๊ทผ ๋ ํ ์ธ์ ๋ชฉ๋ก ์กฐํ (ํ์ด์ง๋ค์ด์ ) โข ์ฃผ์ ํ๋: โข rentalId, vehicleNo, status โข startedAt, finishedAt โข newDamageTotal โข GET /api/rentals/{rentalId} โข ๋จ์ผ ๋ ํ ์ธ์ ์์ธ ์กฐํ โข ํฌํจ ์ ๋ณด: โข ๋ ํธ ์์/์ข ๋ฃ ์์ ์์ฝ โข ์ถ๊ฐ ์์ ๊ฐ์ โข ์ด๋ฏธ์ง๋ณ ํ์ง ๊ฒฐ๊ณผ (bbox + ์์ ํ๋ฅ )
โธป
- ์ํคํ ์ฒ ๊ฐ์
2.1 ๊ตฌ์ฑ ์์ โข Frontend: React (๋ณ๋ ๋ ํฌ์งํ ๋ฆฌ) โข Backend: Spring Boot โข Inference: FastAPI + YOLO + ViT (๋ณ๋ ๋ ํฌ์งํ ๋ฆฌ) โข Storage: MinIO (S3 ํธํ) โข Database: MySQL
2.2 ์ฒ๋ฆฌ ํ๋ฆ 1. ํ๋ก ํธ์์ ์ด๋ฏธ์ง ์ ๋ก๋ โ Spring โ MinIO ์ ์ฅ 2. ํ์ ์ ๋จ์ผ ์ด๋ฏธ์ง ์์ ํ์ง ์์ฒญ (๋น๋๊ธฐ) 3. ๋ ํธ ์์: โข 4์ฅ ์ด๋ฏธ์ง ๊ธฐ์ค ์์ ์์ฝ ์ ์ฅ 4. ๋ ํธ ์ข ๋ฃ: โข ์์ ๋๋น ์ถ๊ฐ ์์ ๊ณ์ฐ 5. ๋ ํ ์ธ์ ๋ชฉ๋ก ๋ฐ ์์ธ ์กฐํ
โธป
- ๊ธฐ์ ์คํ โข Java 17 โข Spring Boot โข Spring Web โข Spring Data JPA โข MySQL โข MinIO (S3 ํธํ ์คํ ๋ฆฌ์ง) โข FastAPI (์ธ๋ถ ์ถ๋ก ์๋ฒ)
โธป
- ๋๋ฉ์ธ ๋ชจ๋ธ ์์ฝ
RentalSession โข ์ฐจ๋ ๋ ํ ๋จ์ ์ธ์ โข ์ํ: IN_RENT, RETURNED โข ์์ ์์ฝ ์ ๋ณด ๋ฐ ์ด๋ฏธ์ง ์ฐ๊ด ๊ด๊ณ ๋ณด์
RentalImage โข ๋ ํธ ์์/์ข ๋ฃ ์ ์ดฌ์๋ ์ด๋ฏธ์ง โข ์์น(FRONT, REAR, LEFT, RIGHT) ๊ธฐ์ค ๊ด๋ฆฌ โข ์์ ํ์ง ๊ฒฐ๊ณผ์ ์ฐ๊ฒฐ
Prediction / PredictionJob โข ์ด๋ฏธ์ง ์์ ํ์ง ๊ฒฐ๊ณผ ๋ฐ ๋น๋๊ธฐ ์์ ๊ด๋ฆฌ โข bounding box, ์์ ํ๋ฅ ์ ๋ณด ํฌํจ
๊ณตํต Enum โข DamageType: ์์ ์ ํ โข RentalStatus: ์ธ์ ์ํ โข Phase: ๋ ํธ ์์/์ข ๋ฃ โข ImageSlot: ์ดฌ์ ์์น