SURL Study λ λ©ν -λ©ν° κ° μ²΄κ³μ μΈ νμ΅ κ΄λ¦¬λ₯Ό μν νμ€ν μΉ νλ«νΌμ
λλ€.
λ©ν λ λ©ν°μκ² κ³Όμ λ₯Ό λ°°μ νκ³ νΌλλ°±μ μ 곡νλ©°, λ©ν°λ μΌμΌ νμ΅ κ³νμ μΈμ°κ³ κ³Όμ λ₯Ό μ μΆνλ©° μμ μ μ±μ₯μ μΆμ ν μ μμ΅λλ€. μΊλ¦°λ κΈ°λ° μΈν°νμ΄μ€μ νμ΅ μκ° ν΅κ³λ₯Ό ν΅ν΄ ν¨μ¨μ μΈ νμ΅ κ΄λ¦¬κ° κ°λ₯ν©λλ€.
κΈ°λ₯
μ€λͺ
λ©ν° κ΄λ¦¬
λ©ν° κ³μ μμ±, λͺ©λ‘ μ‘°ν, λ―Έμμ± νΌλλ°± νν© νμΈ
κ³Όμ λ°°μ
λ μ§ λ²μ / μμΌ λ¨μ μΌκ΄ κ³Όμ μμ±, νμ΅μλ£ μ²¨λΆ
νΌλλ°± μμ±
λ μ§λ³ νΌλλ°± λκΈ° λͺ©λ‘ μ‘°ν, νΌλλ°± μμ±Β·μμ Β·μμ
νμ΅ μ½ν
μΈ
μ€ν°λ μΉΌλΌ(νμ΅ κΈ) μμ±, λ©ν°λ³ λ©λͺ¨ κ΄λ¦¬
κΈ°λ₯
μ€λͺ
μΌμΌ νμ΅ κ΄λ¦¬
λ°μΌλ¦¬ ν μΌ λͺ©λ‘ μ‘°ν, κ³Όμ μΆκ°Β·μλ£ μ²΄ν¬
μΊλ¦°λ & ν΅κ³
μ£Όκ° μΊλ¦°λ λ·°, μΌλ³Β·μ£Όλ³ μ§μ²λ μκ°ν (μ°¨νΈ)
νμ΅ μκ° κΈ°λ‘
κ³Όλͺ©λ³ κ³΅λΆ μκ° κΈ°λ‘Β·μμ Β·μμ , μκ° ν΅κ³ νμΈ
κ³Όμ μ μΆ
νμΌ μ
λ‘λλ₯Ό ν΅ν κ³Όμ μ μΆ, λ©ν νΌλλ°± νμΈ
μν΅
κ³Όμ λ³ λκΈμ ν΅ν λ©ν μμ μ€μκ° μν΅
ποΈ μμ€ν
μν€ν
μ²
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β β β β β β
β React + Vite ββββββββββΊβ Spring Boot ββββββββββΊβ TiDB Cloud β
β (Cloudflare β REST β (Docker) β JPA β (MySQL) β
β Pages) β API β β β β
β β β β β β
ββββββββββββββββββββ ββββββββββ¬ββββββββββ ββββββββββββββββββββ
β
β S3 SDK
βΌ
ββββββββββββββββββββ
β β
β Cloudflare R2 β
β (File Storage) β
β β
ββββββββββββββββββββ
κΈ°μ
λ²μ
μ©λ
Spring Boot
4.0.2
μΉ νλ μμν¬
Spring Security
-
μΈμ¦ & μΈκ°
JPA / Hibernate
-
ORM
JWT (jjwt)
0.11.5
ν ν° κΈ°λ° μΈμ¦
AWS S3 SDK
-
Cloudflare R2 νμΌ μ€ν 리μ§
Gradle
-
λΉλ λꡬ
Docker
-
컨ν
μ΄λ λ°°ν¬
κΈ°μ
λ²μ
μ©λ
React
19.2
UI λΌμ΄λΈλ¬λ¦¬
Vite
7.2
λΉλ λꡬ
Tailwind CSS
4.1
μ€νμΌλ§
React Router
7.13
ν΄λΌμ΄μΈνΈ λΌμ°ν
Recharts
3.7
νμ΅ ν΅κ³ μ°¨νΈ
MSW
2.12
Mock API (κ°λ°μ©)
κΈ°μ
μ©λ
TiDB Cloud
MySQL νΈν ν΄λΌμ°λ DB
Cloudflare R2
S3 νΈν μ€λΈμ νΈ μ€ν 리μ§
Cloudflare Pages
νλ‘ νΈμλ νΈμ€ν
Docker
λ°±μλ 컨ν
μ΄λν
blaybus/
βββ BE/backend/ # Spring Boot λ°±μλ
β βββ src/main/java/com/blaybus/backend/
β βββ domain/
β β βββ user/ # μ¬μ©μ (λ©ν /λ©ν° νλ‘ν)
β β βββ match/ # λ©ν -λ©ν° λ§€μΉ
β β βββ content/ # μΉΌλΌ, νΌλλ°±, λ©λͺ¨, λκΈ
β β βββ planner/ # νμ΅ κ³ν, κ³Όμ , μ μΆ
β β βββ notification/ # μλ¦Ό
β βββ global/ # JWT, Security, κ³΅ν΅ μ€μ
β
βββ FE/frontend/surl_study/ # React νλ‘ νΈμλ
βββ src/
βββ api/ # API ν΄λΌμ΄μΈνΈ
βββ components/
β βββ common/ # κ³΅ν΅ μ»΄ν¬λνΈ
β βββ mentee/ # λ©ν° μ μ© μ»΄ν¬λνΈ
β βββ mentor/ # λ©ν μ μ© μ»΄ν¬λνΈ
βββ pages/ # νμ΄μ§ μ»΄ν¬λνΈ
βββ context/ # Auth Context
βββ mocks/ # MSW Mock νΈλ€λ¬
Java 17+
Node.js 18+
Docker (μ ν)
cd BE/backend
# λ‘컬 μ€ν
./gradlew bootRun
# λλ Docker
docker build -t blaybus-backend .
docker run -p 8080:8080 blaybus-backend
cd FE/frontend/surl_study
# μμ‘΄μ± μ€μΉ
npm install
# κ°λ° μλ² μ€ν
npm run dev
κ°λ° μλ²: http://localhost:5173
# Backend
./gradlew build
# Frontend
npm run build
npm run preview # λΉλ κ²°κ³Ό 미리보기
π‘ API μλν¬μΈνΈ (μ£Όμ)
μΈμ¦
Method
Endpoint
μ€λͺ
POST
/api/v1/auth/login
λ‘κ·ΈμΈ
λ©ν API
Method
Endpoint
μ€λͺ
GET
/api/v1/matchings?date={date}
λ©ν° λͺ©λ‘ + νΌλλ°± νν©
GET
/api/v1/matchings/daily-tasks?date={date}
λ μ§λ³ νΌλλ°± λκΈ°
POST
/api/v1/mentors/me/mentees
λ©ν° κ³μ μμ±
POST
/api/v1/mentor/tasks/batch
κ³Όμ μΌκ΄ μμ±
POST
/api/v1/mentor/worksheets
νμ΅μλ£ μ
λ‘λ
GET/POST/PUT
/api/v1/assignments/{id}/feedback
νΌλλ°± CRUD
λ©ν° API
Method
Endpoint
μ€λͺ
GET
/api/v1/study/daily?menteeId={id}&date={date}
μΌμΌ κ³Όμ μ‘°ν
GET
/api/v1/study/progress
νμ΅ μ§μ²λ
POST
/api/v1/mentee/tasks/batch
κ³Όμ μμ±
PATCH
/api/v1/study/tasks/{id}
κ³Όμ μν μ
λ°μ΄νΈ
POST
/api/v1/study/time-records
νμ΅ μκ° κΈ°λ‘
POST
/api/v1/mentee/study/tasks/{id}/submissions
κ³Όμ μ μΆ
JWT κΈ°λ° Stateless μΈμ¦ (Access Token 1μκ°)
μν κΈ°λ° μ κ·Ό μ μ΄ (MENTOR / MENTEE)
Spring Security κΈ°λ° API 보νΈ
Presigned URL μ ν΅ν μμ ν νμΌ μ
λ‘λ
μμ
κ°
Primary
#6D87ED
Light
#8CA3FF
Lighter
#DAE1FF
Gradient
#ADBCF7 β #6D87ED
Font
System Default
Made with β€οΈ by λ°νμ