- Problem.io๋ ์ด๋ฏธ์ง ํ ์ฅ์ผ๋ก ์ง๊ด์ ยท์๊ฐ์ ์ธ ํด์ฆ๋ฅผ ๋ง๋ค๊ณ ํ ์ ์๋ UGC ๊ธฐ๋ฐ ํ๋ซํผ์ ๋๋ค.
- Google Gemini ๊ธฐ๋ฐ์ ์์ฑํ AI(GenAI) ๊ธฐ์ ์ ๋์ ํ์ฌ ํด์ฆ ์ ์ ๊ฒฝํ์ ํ์ ํ๊ณ , ์ข์์ยทํ๋ก์ฐยท๋๊ธ ๋ฑ SNSํ ์ํธ์์ฉ์ ํตํด ์ ์์์ ํ๋ ์ด์ด๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ๋๋ ์ปค๋ฎค๋ํฐ๋ฅผ ์งํฅํฉ๋๋ค.
- Gemini 2.0 Flash ๋ชจ๋ธ ์ฐ๋
- ํด์ฆ ์ ๋ชฉ๊ณผ ์ค๋ช ๋ง ์ ๋ ฅํ๋ฉด AI๊ฐ ์ต์ ์ ์ธ๋ค์ผ 2์ฅ์ ์ฆ์ ์์ฑ (Cinematic/Vibrant ์คํ์ผ)
- ์ฌ์ฉ์๋ ๋ง์์ ๋๋ ์คํ์ผ์ ์ ํํ์ฌ ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅ
- ์ด๋ฏธ์ง ์ ๋ก๋ ๋ฐ ๋ณด๊ธฐ(๊ฐ๊ด์) ์ค์
- ๋ณต์ ์ ๋ต ์ฒ๋ฆฌ ๋ฐ ํธ๋์ญ์ ๊ธฐ๋ฐ์ ์์ ํ ์ ์ฅ
- ๊ณต๊ฐ/๋น๊ณต๊ฐ ์ค์ ์ง์
- ์ด๋ฏธ์ง ์ค์ฌ์ ๋ชฐ์ ๊ฐ ์๋ UI
- ์ ๋ต ์ ํ ์ ์ฆ์ O/X ํผ๋๋ฐฑ ๋ฐ ํด์ค ์ ๊ณต
- ์ต์ข ์ ์ ๋ฐ ์์ ์๊ฐ ๊ธฐ๋ก
- ์ข์์ & ๋๊ธ: ํด์ฆ์ ๋ํ ๋ฐ์๊ณผ ์๊ฒฌ ๊ณต์
- ํ๋ก์ฐ & ํผ๋: ๊ด์ฌ ์๋ ์ ์์๋ฅผ ํ๋ก์ฐํ๊ณ ์ ํด์ฆ๋ฅผ ํผ๋์์ ํ์ธ
- ๋ง์ดํ์ด์ง: ๋ด๊ฐ ํผ ํด์ฆ, ๋ง๋ ํด์ฆ, ํ๋ก์ฐ ๋ด์ญ ๋ฑ์ ํ๋์ ๊ด๋ฆฌ
- Core: Spring Boot 3.5, JDK 17
- Security: Spring Security + JWT (Stateless Authentication)
- Persistence: MyBatis (Complex Query Control), MySQL
- AI Service: Google Gemini 2.0 Flash (via GMS), Caffeine Cache (Temporary Image Storage)
- Infra: AWS S3 (Image Storage), Google SMTP (Email Auth)
- Framework: Vue 3 + Vite
- State Management: Pinia (Store)
- UI Component: PrimeVue, Tailwind CSS (Custom)
- Network: Axios (Interceptors for Auto-JWT Injection)
ProblemIO/
โโ frontend/ # Vue 3 + Vite Client
โ โโ src/api # API Services (Axios)
โ โโ src/components
โ โ โโ layout # Header, NavBar, Sidebar
โ โ โโ common # Shared UI Components
โ โ โโ quiz # Quiz Playing Widgets
โ โ โโ comment # Comment & Reply System
โ โโ src/views # Page Routings
โ โ โโ auth # Login / Register
โ โ โโ quiz # List / Create / Solve / Result
โ โ โโ user # Profile / MyPage
โ โ โโ challenge # Ranking & Challenge
โ โโ src/stores # Pinia Stores (Auth, Quiz, User)
โโ backend/ # Spring Boot Server
โ โโ src/main/java/com/problemio
โ โ โโ ai # Gemini Client & Thumbnail Service โจ
โ โ โโ quiz # Quiz CRUD & Like
โ โ โโ submission # Scoring & Ranking
โ โ โโ user # Auth & Profile & Follow
โ โ โโ global # Config, Exception, Security, S3
โ โโ resources/mapper # MyBatis XML Mappers
โโ README.md # Project Documentation
- ํ์๊ฐ์ : ์ด๋ฉ์ผ, ๋๋ค์, ๋น๋ฐ๋ฒํธ(๋ณต์ก๋ ๊ฒ์ฆ) ์ ๋ ฅ ํ ๊ฐ์ .
- ๋ก๊ทธ์ธ: ๊ฐ์ ํ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ์ฌ JWT(Access/Refresh) ํ ํฐ ๋ฐ๊ธ.
- ํ๋กํ ์ค์ : ๋ง์ดํ์ด์ง์์ ๋๋ค์ ์์ ๋ฐ ์๋ฐํ/ํ ๋ง ์์ดํ ์ฅ์ฐฉ.
- ํด์ฆ ๋ง๋ค๊ธฐ ์ง์ : ์ ๋ชฉ๊ณผ ์ค๋ช ์ ์ ๋ ฅ.
- AI ์ธ๋ค์ผ ์์ฑ: "AI ์ธ๋ค์ผ ์์ฑ" ๋ฒํผ ํด๋ฆญ ์, Gemini๊ฐ 2๊ฐ์ง ์คํ์ผ(Cinematic/Vibrant)์ ์ด๋ฏธ์ง๋ฅผ ์ ์.
- ์ธ๋ค์ผ ์ ํ: ๋ง์์ ๋๋ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๊ฑฐ๋ ์ง์ ์ ๋ก๋.
- ๋ฌธ์ ์ถ์ : ๋ฌธ์ ์ด๋ฏธ์ง ์ ๋ก๋ ๋ฐ ์ ๋ต(๋ณต์ ๊ฐ๋ฅ) ์ค์ ํ ์ต์ข ๋ฐํ.
- ํด์ฆ ํ์ด: ๋ฉ์ธ ํผ๋์์ ํด์ฆ ์ ํ -> ์ด๋ฏธ์ง ํ์ธ ํ ์ ๋ต ์ ๋ ฅ -> ์ฆ์ ์ฑ์ (O/X).
- ๊ฒฐ๊ณผ ํ์ธ: ๋ชจ๋ ๋ฌธํญ ํ์ด ํ ์ต์ข ์ ์์ ์์ ์๊ฐ ํ์ธ.
- ์์ ์ํธ์์ฉ: "์ข์์" ํด๋ฆญ ๋ฐ ๋๊ธ ์์ฑ์ผ๋ก ์ ์์์ ์ํต.
- ํ๋ก์ฐ: ๊ด์ฌ ์๋ ์ ์์๋ฅผ ํ๋ก์ฐํ์ฌ ํผ๋ ๊ตฌ๋ .
- ์ฑ๋ฆฐ์ง ์ฐธ์ฌ: ์งํ ์ค์ธ ํ์์ดํ ์ฑ๋ฆฐ์ง ์ ์ฅ.
- ๊ฒฝ์: ์ ํ ์๊ฐ ๋ด์ ๋น ๋ฅด๊ฒ ์ ๋ต ๋งํ๊ธฐ.
- ๋ญํน ํ์ธ: ์ ์ > ์๊ฐ > ์ ์ถ์ผ์ ์์ผ๋ก ์ฐ์ ๋ ์ค์๊ฐ ์์ํ(Leaderboard) ํ์ธ.
- ์ฝํ ์ธ ๊ด๋ฆฌ: ๋ถ์ ์ ํ ํด์ฆ ์จ๊น(Hide) ์ฒ๋ฆฌ.
- ์ฑ๋ฆฐ์ง ์์ฑ: ๊ธฐ์กด ํด์ฆ๋ฅผ ์ ํํ์ฌ ๊ธฐ๊ฐ ํ์ ์ฑ๋ฆฐ์ง ์ด๋ฒคํธ ๊ฐ์ค.
- ๋๊ธ ๊ด๋ฆฌ: ์ ์ฑ ๋๊ธ ์ญ์ ์กฐ์น.
- DB ์ค๊ณ ๋ฐ ์ฑ๋ฅ ์ต์ ํ ์ฃผ๋
- Mono Repo ๊ธฐ๋ฐ Front/Back ์ ๋ฐ ๊ฐ๋ฐ ์ฐธ์ฌ
- Quiz ์์ฑยท์ ์ถยท์ฑ์ ๋ก์ง ๋ฐ ๋นํ์ ํ๋ ์ด/๋๊ธ ํ๋ก์ฐ ๊ตฌํ
- ์ค์๊ฐ ๋ญํน ์์คํ ์ค๊ณยท๊ตฌํ
- AI ๊ธฐ๋ฐ ํด์ฆ ์ธ๋ค์ผ ์์ฑ ๊ธฐ๋ฅ ๋์
- ์๋น์ค ์ ๋ฐ Light/Dark ํ ๋ง UI ์์คํ ๊ตฌํ
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๊ฐ์ฅ ํฌ๊ฒ ๋๋ ์ ์ ๊ธฐ์ ์ ํ์ด ๊ณง ์ค๊ณ ์ฌ๊ณ ๋ฐฉ์์ ๋ฐ๊พผ๋ค๋ ๊ฒ์ด์๋ค.
์ด์ ๊น์ง๋ JPA ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ์ ํด์๊ธฐ ๋๋ฌธ์, ๊ฐ์ฒด ์ค์ฌ ์ค๊ณ์ ์ฐ๊ด๊ด๊ณ ๋งคํ, ์์์ฑ ์ปจํ ์คํธ์ ์์กดํ ๊ฐ๋ฐ ๋ฐฉ์์ด ์ต์ํ๋ค. ํ์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ์์๋ MyBatis๋ฅผ ์ฒ์์ผ๋ก ๋ณธ๊ฒฉ ์ฌ์ฉํ๋ฉฐ, ์ฟผ๋ฆฌ ํ ์ค์ด ๊ณง ์ฑ๋ฅ๊ณผ ์ง๊ฒฐ๋๋ ํ๊ฒฝ์ ์ง์ ๋ง์ฃผํ๊ฒ ๋์๋ค.
DB ์ค๊ณ์ ์ธ๋ฑ์ค ์ ๋ต์ ๋จผ์ ๊ณ ๋ฏผํ์ง ์์ผ๋ฉด ์กฐํ ์ฑ๋ฅ์ด ์ฆ์ ๋ฌธ์ ๋ก ๋๋ฌ๋ฌ๊ณ , ์ด๋ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์ฟผ๋ฆฌ ์คํ ๊ณํ์ ๊น์ด ์ดํดํ๋ ค๋ ํ๋๋ก ์ด์ด์ก๋ค. ํนํ Quiz ์ ์ถยท์ฑ์ , ์ค์๊ฐ ๋ญํน๊ณผ ๊ฐ์ด ํธ๋ํฝ์ด ์ง์ค๋๋ ์์ญ์์๋ JPA์ ์ถ์ํ๋ณด๋ค MyBatis์ ๋ช ์์ฑ์ด ๋ ํฐ ์ฅ์ ์ผ๋ก ๋๊ปด์ก๋ค.
๋ํ Mono Repo ํ๊ฒฝ์์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ํจ๊ป ๋ค๋ฃจ๋ฉฐ, ๋จ์ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด ๋นํ์ ํ๋ก์ฐ, ํ ๋ง ์์คํ , AI ๊ธฐ๋ฅ ๋์ ๊น์ง ์ฌ์ฉ์ ๊ฒฝํ ์ ๋ฐ์ ๊ณ ๋ คํ ๊ฐ๋ฐ์ ์ค์์ฑ์ ์ฒด๊ฐํ๋ค. ์ด๋ฒ ํ๋ก์ ํธ๋ ๋จ์ํ ๊ธฐ์ ์ ์ ์ฉํ ๊ฒฝํ์ด ์๋๋ผ, ์ ์ด ๊ธฐ์ ์ ์ ํํด์ผ ํ๋์ง ์ค์ค๋ก ์ค๋ช ํ ์ ์๊ฒ ๋ ์ ํ์ ์ด์๋ค.
- Front/Back ๊ธฐ์ด ๊ตฌ์กฐ ์ค๊ณ
- Mono Repo ๊ธฐ๋ฐ Front/Back ์ ๋ฐ ๊ฐ๋ฐ ์ฐธ์ฌ
- User / Admin / Challenge / Follow ๋ฑ ๊ธฐ๋ฅ ๊ตฌํ
- ์ด๋ฉ์ผ ์ธ์ฆ ๊ธฐ๋ฐ ํ์๊ฐ์ ยท๋ก๊ทธ์ธ ๊ตฌํ
- Admin ํ์ด์ง ๋ฐ ์ฌ์ฉ์ UI(Popover, My Page) ๊ตฌํ
- ์ฑ๋ฆฐ์ง ๋ชจ๋ ๋ฐ ์ฑ๋ฆฐ์ง ๋ญํน ํ์ ๊ธฐ๋ฅ ๊ตฌํ
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๊ฐ์ฅ ์ธ์ ๊น์๋ ๋ถ๋ถ์ JWT ๊ธฐ๋ฐ ์ธ์ฆ ๊ตฌ์กฐ๋ฅผ ์ค์ ์๋น์ค ํ๋ฆ์ ์ ์ฉํด ๋ณธ ๊ฒฝํ์ด์๋ค.
๋จ์ํ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ ๋์ด, ์ด๋ฉ์ผ ์ธ์ฆ์ ํฌํจํ ํ์๊ฐ์ ๋จ๊ณ๋ถํฐ ํ ํฐ ๋ฐ๊ธ, ์ธ์ฆ ์ํ ์ ์ง๊น์ง ์ ๊ณผ์ ์ ์ค๊ณํ๋ฉฐ ์ธ์ฆ ๋ก์ง์ด ์๋น์ค ์ ๋ฐ์ ๋ฏธ์น๋ ์ํฅ์ ์ฒด๊ฐํ ์ ์์๋ค.
ํนํ Front์ Back์ ํจ๊ป ๋ค๋ฃจ๋ Mono Repo ํ๊ฒฝ์์, ์ธ์ฆ ์ํ์ ๋ฐ๋ผ ์ ๊ทผ ๊ฐ๋ฅํ ๊ธฐ๋ฅ๊ณผ ํ๋ฉด์ด ๋ฌ๋ผ์ง๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ฉด์ ๋ณด์๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ ๊ณ ๋ คํด์ผ ํ๋ค๋ ์ ์ ๋ฐฐ์ ๋ค.
๋ํ Admin, Challenge, Follow์ ๊ฐ์ ๋๋ฉ์ธ์ ๊ตฌํํ๋ฉฐ ๊ถํ์ ๋ฐ๋ฅธ ๊ธฐ๋ฅ ๋ถ๋ฆฌ์ ์ค์์ฑ์ ๋๊ผ๊ณ , JWT๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ธ์ฆ ์ ๋ณด๊ฐ ๊ฐ ๋๋ฉ์ธ์์ ์ผ๊ด๋๊ฒ ํ์ฉ๋ ์ ์๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ง์ถ๋ ๊ณผ์ ์ด ์๋ฏธ ์์๋ค.
์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด ์ธ์ฆ ๊ธฐ๋ฅ์ ๋จ์ํ ๋ก๊ทธ์ธ ์๋จ์ด ์๋, ์๋น์ค ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๊ดํตํ๋ ํต์ฌ ์์๋ก ๋ฐ๋ผ๋ณด๋ ์๊ฐ์ ๊ฐ๊ฒ ๋์๋ค.
-
์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง/์์ถ์ผ๋ก ๋ก๋ฉ ์๋ ๊ฐ์
-
WebSocket์ ์ด์ฉํ ์ค์๊ฐ ์๋ฆผ ๋ฐ ๋ญํน ํ๊ฒฝ ๊ฐ์
-
์์ฑํ AI๋ฅผ ์ด์ฉํ ํด์ฆ ์๋ ์์ฑ ๊ธฐ๋ฅ ์ถ๊ฐ
-
Docker๋ฅผ ํ์ฉํ ์๋ก์ด ์ํคํ ์ฒ ๋์














