Skip to content
@Team-MOISAM

Team MOISAM

๐Ÿ“ ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ SPOT

๐Ÿ”— ๋ฐฐํฌ ์ฃผ์†Œ : https://www.pickspot.co.kr

spot

๐Ÿ’ป Development

๐Ÿ—’๏ธ API ๋ช…์„ธ์„œ

๐Ÿ”— API ๋ช…์„ธ์„œ

๐Ÿ”— Swagger

๐Ÿ›๏ธ System Architecture

system

๐Ÿ“Š ERD

erd

๐Ÿ”Œ Frontend

Frontend ๊ธฐ์ˆ  ์Šคํƒ

๊ธฐ์ˆ  ์Šคํƒ ์„ ํƒ ์ด์œ 
React.js ์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI๋กœ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ™•๋ณด
TypeScript ์ •์  ํƒ€์ดํ•‘์œผ๋กœ ์˜ค๋ฅ˜ ์˜ˆ๋ฐฉ ๋ฐ ์ž๋™์™„์„ฑ/๋ฆฌํŒฉํ† ๋ง ํŽธ์˜์„ฑ ํ–ฅ์ƒ
Vite ๋น ๋ฅธ ๋ฒˆ๋“ค๋ง๊ณผ HMR๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์ฆ๊ฐ€
Zustand ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ
Axios ๊ฐ„ํŽธํ•œ API ์š”์ฒญ ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ๊ด€๋ฆฌ
TailwindCSS ๋น ๋ฅด๊ณ  ์ผ๊ด€๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง
React-Query ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ ๋ฐ ๋กœ๋”ฉ/์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ API ์ค‘์‹ฌ ์•ฑ์— ์ตœ์ ํ™”
Jest ์•ˆ์ •์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

Directory ๊ตฌ์กฐ

src/
โ”œโ”€โ”€ ๐Ÿ“app/ # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”, ์Šคํƒ€์ผ, ํ”„๋กœ๋ฐ”์ด๋”
โ”‚   โ”œโ”€โ”€ ๐Ÿ“routes/ # ๋ผ์šฐํ„ฐ ์„ค์ •
โ”œโ”€โ”€ ๐Ÿ“pages/ #ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ (๊ฐ ํŒŒ์ผ์€ URL ๊ฒฝ๋กœ ํ•˜๋‚˜๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, ๊ฐ ํŽ˜์ด์ง€๋Š” ์•„๋ž˜ features์—์„œ ์กฐํ•ฉ๋œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จ)
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œMapViewPage.tsx
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œHistoryPage.tsx
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œFindPage.tsx
โ”‚   โ””โ”€โ”€ ๐Ÿ“œReviewPage.tsx
โ”‚   โ””โ”€โ”€ ๐Ÿ“œDetailPage.tsx
โ”‚   โ””โ”€โ”€ ๐Ÿ“œMainPage.tsx
โ”œโ”€โ”€ ๐Ÿ“widgets/ # ๋ณตํ•ฉ์ ์ธ UI ๋ธ”๋ก(ํŽ˜์ด์ง€์™€ ์—”ํ‹ฐํ‹ฐ ์‚ฌ์ด์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” UI ๊ตฌ์„ฑ ์š”์†Œ)
โ”‚   โ””โ”€โ”€ ๐Ÿ“headers/
โ”œโ”€โ”€ ๐Ÿ“features/ # ๊ฐ ๊ธฐ๋Šฅ(๋„๋ฉ”์ธ) ๋‹จ์œ„๋กœ ๋ฌถ์ธ ์ปดํฌ๋„ŒํŠธ ์ง‘ํ•ฉ
โ”‚   โ”œโ”€โ”€ ๐Ÿ“mapView/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“history/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“find/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“review/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“visited/
โ”‚   โ””โ”€โ”€ ๐Ÿ“notVisited/
โ”œโ”€โ”€ ๐Ÿ“entities/ # ๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์‹ฌ์˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„ (์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ api, hooks, model ๋ถ„๋ฆฌ)
โ”‚   โ”œโ”€โ”€ ๐Ÿ“user/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“place/
โ”‚   โ””โ”€โ”€ ๐Ÿ“event/
โ”œโ”€โ”€ ๐Ÿ“shared/ # ํ”„๋กœ์ ํŠธ ์ „์—ญ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ/์„ค์ • ๋ชจ์Œ
โ”‚   โ”œโ”€โ”€ ๐Ÿ“api/ # Axios ๋“ฑ์˜ API ์ธ์Šคํ„ด์Šค, ์ธํ„ฐ์…‰ํ„ฐ ์ •์˜
โ”‚   โ”œโ”€โ”€ ๐Ÿ“utils/ # ๋‚ ์งœ ํฌ๋งคํŒ…, debounce ๋“ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์ด ์œ„์น˜
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ui/ # ๋ฒ„ํŠผ, ๋ชจ๋‹ฌ, ์ธํ’‹, ๋ฐ”ํ…€์‹œํŠธ ๋“ฑ ์›์ž ๋‹จ์œ„ UI ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ ๐Ÿ“stores/ # ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ
โ”‚   โ””โ”€โ”€ ๐Ÿ“model/ # ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ๋˜๋Š” ํƒ€์ž… ํ˜น์€ Enum
โ””โ”€โ”€ ๐Ÿ“assets/ # ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋” (์ด๋ฏธ์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”)
    โ”œโ”€โ”€ ๐Ÿ“icon/
    โ””โ”€โ”€ ๐Ÿ“image/

Feature ๊ตฌ์กฐ

feature/
โ”œโ”€โ”€ ๐Ÿ“ui/                    # UI ๊ด€๋ จ ์ฝ”๋“œ
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œindex.ts          # ์ปดํฌ๋„ŒํŠธ export
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œComponent.tsx     # ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“model/                # ํƒ€์ž… ์ •์˜
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œindex.ts         # ํƒ€์ž… export
โ”‚   โ””โ”€โ”€ ๐Ÿ“œfeature.type.ts         # ํƒ€์ž… ์ •์˜ ํŒŒ์ผ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“service/             # API ๊ด€๋ จ ์ฝ”๋“œ
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œindex.ts        # ์„œ๋น„์Šค export
โ”‚   โ””โ”€โ”€ ๐Ÿ“œapi.ts          # API ํ˜ธ์ถœ ํ•จ์ˆ˜
โ”‚
โ”œโ”€โ”€ ๐Ÿ“hooks/              # ์ปค์Šคํ…€ ํ›…
โ”‚   โ”œโ”€โ”€ ๐Ÿ“œindex.ts       # ํ›… export
โ””โ”€โ”€ โ””โ”€โ”€ ๐Ÿ“œuseHook.ts     # ํ›… ์ •์˜ ํŒŒ์ผ

์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง

Axios + React + Query

API ์š”์ฒญ์€ service์—์„œ Axios๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ , hooks์—์„œ React Query๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ถ„๋ฆฌํ•ด ๊ฐ ์—ญํ• ์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Jest ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

utils ์ผ๋ถ€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ์‹ ๋ขฐ๋„๋ฅผ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ ธ ์•ˆ์ •์ ์ธ ๋ฆฌํŒฉํ† ๋ง๊ณผ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๋ฐ”ํ…€์‹œํŠธ ์‚ฌ์šฉ์„ฑ ๊ฐœ์„ 

  • ์Šค๋ƒ… ํฌ์ธํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„: 30%, 50%, 80% ์œ„์น˜์— ๋ฐ”ํ…€์‹œํŠธ๊ฐ€ ๊ณ ์ •๋˜๋„๋ก ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋™์  ๋†’์ด ์กฐ์ ˆ: ResizeObserver๋ฅผ ํ™œ์šฉํ•ด ์ฝ˜ํ…์ธ  ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฐ”ํ…€์‹œํŠธ ๋†’์ด๊ฐ€ ์ž๋™์œผ๋กœ ์กฐ์ ˆ๋˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์Šคํฌ๋กค/๋“œ๋ž˜๊ทธ ๋ถ„๋ฆฌ ๋กœ์ง:

    • data-scrollable ์†์„ฑ์œผ๋กœ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์˜์—ญ์„ ์‹๋ณ„
    • scrollTop === 0์ผ ๋•Œ๋งŒ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅ
    • touchAction: pan-y, overscrollBehavior: contain์„ ์ ์šฉํ•ด ์Šคํฌ๋กค๊ณผ ๋“œ๋ž˜๊ทธ์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€

์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ๋ถ€๋“œ๋Ÿฝ๊ณ  ์ง๊ด€์ ์ธ UX๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ปดํŒŒ์šด๋“œ ์ปดํฌ๋„ŒํŠธ ํŒจํ„ด์„ ๋„์ž…ํ•˜์—ฌ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ์„ ์–ธ์ ์ด๊ณ  ์œ ์—ฐํ•œ API๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ตœ์ ํ™”

Lighthouse ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

๊ธฐ์กด์˜ PNG ํŒŒ์ผ์„ WebP ํฌ๋งท์œผ๋กœ ๊ต์ฒดํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Vite ํ™˜๊ฒฝ์— ๋งž์ถฐ public/icons์— ์žˆ๋˜ ์ด๋ฏธ์ง€๋ฅผ src/assets/icons๋กœ ์˜ฎ๊ธฐ๊ณ , static import ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ ์„ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿš€ Backend

Backend ๊ธฐ์ˆ  ์Šคํƒ

๊ธฐ์ˆ  ์Šคํƒ ์ฃผ์š” ํ™œ์šฉ ๋ฐ ์„ ํƒ ์ด์œ 
Java 21 ์žฅ๊ธฐ ์ง€์›(LTS, ~2031) ์ œ๊ณต, Virtual Thread๋กœ ๋‹ค์ค‘ ์™ธ๋ถ€ API ํ˜ธ์ถœ ์ตœ์ ํ™”
Spring Boot 3.4.4 Java 21 ๊ณต์‹ ์ง€์›, Virtual Thread ์ตœ์ ํ™”, RestClient ๋ฐ Actuator ๋“ฑ ์ตœ์‹  ๊ธฐ๋Šฅ ํฌํ•จ
Spring Data JPA JPA ๊ธฐ๋ฐ˜ ORM ๊ตฌํ˜„, Repository๋กœ CRUD ์ž๋™ํ™”, QueryDSL๊ณผ์˜ ์—ฐ๊ณ„๋กœ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ๊ฐ„๊ฒฐ ์ฒ˜๋ฆฌ
PostgreSQL + PostGIS ์ธ๋ฑ์Šค ์ตœ์ ํ™”๋กœ ์ €์žฅ ํšจ์œจ ์ฆ๊ฐ€, PostGIS๋กœ ๋Œ€์šฉ๋Ÿ‰ ๊ณต๊ฐ„ ์ขŒํ‘œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
Redis ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋กœ ์‹ค์‹œ๊ฐ„ ๊ฒฝ๋กœ ์กฐํšŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ, TTL ๊ธฐ๋ฐ˜ ์บ์‹ฑ์œผ๋กœ ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ
Docker & Docker Compose ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„ ๋ฐฐํฌ๋กœ ํ™•์žฅ์„ฑ ๋†’์Œ, ์ปดํฌ๋„ŒํŠธ๋ณ„ ๋…๋ฆฝ ์‹คํ–‰ ๋ฐ ๊ด€๋ฆฌ ์šฉ์ด
GitHub Actions ์ฝ”๋“œ ํ‘ธ์‹œ ์‹œ ์ž๋™ CI/CD ์‹คํ–‰, GUI ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ ํ–ฅ์ƒ
QueryDSL ํƒ€์ž… ์•ˆ์ „ํ•œ DSL ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ์ž‘์„ฑ, ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฒ€์ถœ๋กœ ์•ˆ์ •์„ฑ ํ™•๋ณด
Naver Cloud Platform ์œ ์—ฐํ•œ ๋ฐฐํฌ/๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ, ํ•œ๊ธ€ ๋ฌธ์„œ๋กœ ์ ‘๊ทผ์„ฑ ์šฐ์ˆ˜, ์ปจํ…Œ์ด๋„ˆ/๋ ˆ์ง€์ŠคํŠธ๋ฆฌ/Object Storage ์—ฐ๋™ ์šฉ์ด

์„ฑ๋Šฅ ์ตœ์ ํ™”

๋ฌดํ•œ ์Šคํฌ๋กค ์ฟผ๋ฆฌ ์ตœ์ ํ™”

  • slice ๋ฐฉ์‹์˜ ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฐฉ์‹๊ณผ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ fetch join ์„ ํ†ตํ•ด์„œ ์ฟผ๋ฆฌ ๋ฐœ์ƒ์„ ๊ฐ์†Œ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค
  • ์ด ๊ณผ์ •์—์„œ QueryDSL ์‚ฌ์šฉ์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์กฐ๊ฑด์˜ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค

Redis ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์บ์‹ฑ ์ฒ˜๋ฆฌ

  • ์™ธ๋ถ€ API๋ฅผ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๊ฒฝ๋กœ ์กฐํšŒ ๋ฐ ์ค‘๊ฐ„ ์ง€์  ๊ณ„์‚ฐ ์‹œ, ๋””์Šคํฌ ๊ธฐ๋ฐ˜ DB ์ ‘๊ทผ(I/O)์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ธ๋ฉ”๋ชจ๋ฆฌ NoSQL์ธ Redis๋ฅผ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ API ์‘๋‹ต์„ Redis์— ์บ์‹ฑํ•˜๊ณ , TTL(Time To Live) ์„ ์ ์šฉํ•˜์—ฌ ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ ๋ฐ ์ค‘๋ณต ํ˜ธ์ถœ ๋ฐฉ์ง€๋ฅผ ์‹คํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ API ํ˜ธ์ถœ ํšŸ์ˆ˜ ์ œํ•œ ์ •์ฑ…์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ฃผ์†Œ ํŒŒ์‹ฑ ์‹œ ๋ถˆํ•„์š”ํ•œ Pattern ๊ฐ์ฒด ์ƒ์„ฑ ์ œ๊ฑฐ

  • ๊ธฐ์กด์—๋Š” address.split(" ")์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ง€์—ญ๋ช…์„ ์ถ”์ถœํ–ˆ์ง€๋งŒ, ์ด๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Pattern.compile()์„ ํ†ตํ•ด ์ •๊ทœํ‘œํ˜„์‹ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ substring()๊ณผ indexOf()๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ Pattern ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ , GC ๋ถ€๋‹ด์„ ์ค„์—ฌ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ํ™•๋ณดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

performance

Popular repositories Loading

  1. moisam-server moisam-server Public

    ์–ด๋””์„œ ๋ชจ์ผ๊นŒ? ์—ฌ๊ธฐ์„œ ๋ชจ์ด์‚ผ!

    Java 2

  2. moisam-client moisam-client Public

    TypeScript 1

  3. .github .github Public

Repositories

Showing 3 of 3 repositories

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ