Delivery Fee Sharing Platform

Overview

[๋ฐฐ๋‹ฌ๋น„ ๊ณต์œ  ํ”Œ๋žซํผ]์—์„œ ํŒ€ ๋ฆฌ๋”์™€ Backend๋ฅผ ๋งก์•„ 5๋ช…์˜ ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ์„œ๋น„์Šค๋ฅผ ์™„์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜, ์ผ์ • ์กฐ์œจ, ์—ญํ•  ๋ถ„๋‹ด ๋ฐ ๋ฌธ์„œํ™” ๋“ฑ ์ „๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃผ๋„ํ•˜๊ณ , ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋„๋ฉ”์ธ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. Spring Boot์™€ JPA๋กœ ๋ชจ์ง‘ ๊ฒŒ์‹œ๊ธ€ CRUD API๋ฅผ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, QueryDSL์„ ํ™œ์šฉํ•œ ๋™์  ์ฟผ๋ฆฌ๋กœ ๋‹ค์ค‘ ํ•„ํ„ฐ ๊ฒ€์ƒ‰ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. Docker ๊ธฐ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆํ™”๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ํ‘œ์ค€ํ™”ํ•˜๊ณ  AWS EC2์— ๋ฐฐํฌํ–ˆ์œผ๋ฉฐ, Prometheus์™€ Grafana๋กœ ์„œ๋ฒ„ ๋ฉ”ํŠธ๋ฆญ์„ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. Swagger๋ฅผ ํ†ตํ•ด API ๋ฌธ์„œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ ํŒ€ ๋‚ด ํ˜‘์—… ํšจ์œจ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.


Timeline

1. ๊ธฐํš ๋‹จ๊ณ„

๊ต๋‚ด ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ทฐ์™€ ๋ฐฐ๋‹ฌ์Œ์‹ ๋ฌธํ™” ๋ถ„์„์„ ํ†ตํ•ด ๋ฐฐ๋‹ฌ๋น„ ๊ณต์œ ์˜ ๋ถˆํŽธํ•จ์„ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜๋ฅด์†Œ๋‚˜ ๊ธฐ๋ฐ˜์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋„์ถœํ•˜๊ณ , ๋ชจ๋ฐ”์ผ ์ค‘์‹ฌ์˜ ์ง๊ด€์  UX๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ ์„œ๋น„์Šค ๋ฐฉํ–ฅ์„ฑ์„ ํ™•๋ฆฝํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ๊ฐœ๋ฐœ ๋‹จ๊ณ„

ํŒ€ ๋ฆฌ๋”๋กœ์„œ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ ์„ค์ •, ๊ธฐ๋Šฅ ์ •์˜, ์ผ์ • ๊ด€๋ฆฌ, ์—ญํ•  ๋ถ„๋‹ด ๋“ฑ ์ „๋ฐ˜์ ์ธ ์šด์˜์„ ์ฃผ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๊ธฐ์ ์ธ ํšŒ์˜๋ฅผ ํ†ตํ•ด ํŒ€์› ๊ฐ„ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์‹ ์†ํ•œ ์˜์‚ฌ๊ฒฐ์ •์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์™„์ˆ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Spring Boot ๊ธฐ๋ฐ˜ REST API ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ๋ฐฐ๋‹ฌ ๋ชจ์ง‘ ๋ฐ ๋น„์šฉ ์ •์‚ฐ ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. MySQL์— ์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐฐ๋‹ฌ ๊ด€๊ณ„์™€ ์ •์‚ฐ ๊ธฐ๋ก์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. Spring Data JPA์™€ QueryDSL์„ ํ™œ์šฉํ•ด ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.


Service Highlights


Key Features

1. ๋ฐฐ๋‹ฌ ๋ชจ์ž„ ์ƒ์„ฑ ๋ฐ ์ฐธ์—ฌ

์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฐ๋‹ฌ ๋ชจ์ž„์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Œ์‹์ , ๋ฐฐ๋‹ฌ์˜ˆ์ƒ์‹œ๊ฐ„, ์ตœ์†Œ์ฃผ๋ฌธ๊ธˆ์•ก ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋™์ ์œผ๋กœ ๋ฐฐ๋‹ฌ ์ตœ์†Œ๊ธˆ์•ก์„ ๊ณ„์‚ฐํ•˜๊ณ , ์ฐธ์—ฌ์ž๋“ค์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฐธ์—ฌ ํ˜„ํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ๋ฐฐ๋‹ฌ ๋ชจ์ž„ ์ƒ์„ฑ ๋ฐ ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ (์Œ์‹์ , ์นดํ…Œ๊ณ ๋ฆฌ, ์˜ˆ์ƒ ๋ฐฐ๋‹ฌ๋น„)

  • ์‹ค์‹œ๊ฐ„ ์ฐธ์—ฌ์ž ํ˜„ํ™ฉ ๋ฐ ํ˜„์žฌ ์ฃผ๋ฌธ๊ธˆ์•ก ํ‘œ์‹œ

  • ๋ฐฐ๋‹ฌ ์ตœ์†Œ๊ธˆ์•ก ๋„๋‹ฌ ์‹œ ์ž๋™ ์ฐธ์—ฌ ๋งˆ๊ฐ

  • ์ฐธ์—ฌ์ž๋ณ„ ์ฃผ๋ฌธ ํ•ญ๋ชฉ ๋ฐ ๊ธˆ์•ก ๊ธฐ๋ก

2. ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ

๋ฐฐ๋‹ฌ ๋ชจ์ž„ ์ฐธ์—ฌ์ž๋“ค์ด ์ฃผ๋ฌธ ๋‚ด์šฉ, ๋ฐฐ๋‹ฌ ์ƒํ™ฉ, ์ถ”๊ฐ€ ์š”์ฒญ์‚ฌํ•ญ ๋“ฑ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ„ํŒ… ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. WebSocket ๊ธฐ๋ฐ˜์˜ ์ฆ‰์‹œ์„ฑ๊ณผ ๋ฉ”์‹œ์ง€ ์ €์žฅ์„ ํ†ตํ•œ ์ด๋ ฅ ๊ด€๋ฆฌ๋กœ ์ฐธ์—ฌ์ž๋“ค ๊ฐ„์˜ ์˜์‚ฌ์†Œํ†ต์„ ์›ํ™œํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ๋ฐฐ๋‹ฌ ๋ชจ์ž„๋ณ„ ๊ทธ๋ฃน ์ฑ„ํŒ…๋ฐฉ

  • ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€ ์†ก์ˆ˜์‹ 

  • ์ฑ„ํŒ… ์ด๋ ฅ ์ €์žฅ ๋ฐ ์กฐํšŒ

  • ๋ฉ”์‹œ์ง€ ํƒ€์ž„์Šคํƒฌํ”„ ๋ฐ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ํ‘œ์‹œ

  • ์ด์ „ ๋ฉ”์‹œ์ง€ ๋กœ๋“œ (ํŽ˜์ด์ง€๋„ค์ด์…˜)

3. ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ฐฐ๋‹ฌ ๋ถ„๋ฅ˜

์Œ์‹์ ์„ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์Œ์‹ ์ข…๋ฅ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ๊ธฐ ์Œ์‹์ , ์ตœ๊ทผ ์ฃผ๋ฌธ ๋‚ด์—ญ ๋“ฑ์„ ํ™œ์šฉํ•œ ์ถ”์ฒœ ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ์Œ์‹ ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜ (ํ•œ์‹, ์ค‘์‹, ํ”ผ์ž, ์น˜ํ‚จ ๋“ฑ)

  • ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์Œ์‹์  ํ•„ํ„ฐ๋ง

  • ์ธ๊ธฐ๋„ ์ˆœ ์ •๋ ฌ

  • ์ตœ๊ทผ ์ฃผ๋ฌธ ์Œ์‹์  ๋น ๋ฅธ ์ ‘๊ทผ


Architecture


Tech Stack

Backend

  • Spring Boot 3.x

  • Java 17

  • Spring Data JPA

  • QueryDSL

  • Spring Security

  • Spring WebSocket (STOMP)

Frontend

  • React 18

  • TypeScript

  • Axios

  • SockJS + STOMP

Database

  • MySQL

  • AWS S3

DevOps

  • Docker + Docker Compose

  • AWS EC2, S3, Route 53

  • GitHub Actions

  • Prometheus + Grafana


Contributions

1. ํ”„๋กœ์ ํŠธ ์šด์˜ ๋ฐ ํŒ€ ํ˜‘์—… ์ฃผ๋„

ํŒ€ ๋ฆฌ๋” ์—ญํ• 

ํŒ€ ๋ฆฌ๋”๋กœ์„œ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ ์„ค์ •, ๊ธฐ๋Šฅ ์ •์˜, ์ผ์ • ๊ด€๋ฆฌ, ์—ญํ•  ๋ถ„๋‹ด ๋“ฑ ์ „๋ฐ˜์ ์ธ ์šด์˜์„ ์ฃผ๋„ํ•˜๋ฉฐ ํŒ€ ๋‚ด ์†Œํ†ต๊ณผ ํ˜‘์—… ๋ฌธํ™”๋ฅผ ์กฐ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํ™œ๋™

  • ์ •๊ธฐ์ ์ธ ์Šคํƒ ๋“œ์—… ๋ฏธํŒ… (๋งค์ฃผ 2ํšŒ)์œผ๋กœ ์ง„ํ–‰ ์ƒํ™ฉ ๊ณต์œ  ๋ฐ ๋ฆฌ์Šคํฌ ์กฐ๊ธฐ ํŒŒ์•…

  • ์ฃผ๊ฐ„ ๊ณ„ํš ํšŒ์˜์™€ ํšŒ๊ณ  ์„ธ์…˜์„ ํ†ตํ•œ ์ง€์†์ ์ธ ๊ฐœ์„ 

  • Jira๋ฅผ ํ™œ์šฉํ•œ ์ž‘์—… ์ถ”์  ๋ฐ ์ง„ํ–‰ ์ƒํ™ฉ ์‹œ๊ฐํ™”

  • ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐœ์ƒ ์‹œ ์‹ ์†ํ•œ ์˜์‚ฌ๊ฒฐ์ •์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ํŒ€์› ๊ฐ„ ๊ธฐ์ˆ  ๊ณต์œ  ์„ธ์…˜ ๊ฐœ์ตœ๋กœ ์ „์ฒด ์—ญ๋Ÿ‰ ํ–ฅ์ƒ

๊ฒฐ๊ณผ

ํ”„๋กœ์ ํŠธ ์ผ์ •์„ ๊ณ„ํš ๋Œ€๋น„ 95% ์ด์ƒ ์ค€์ˆ˜ํ•˜์˜€๊ณ , ํŒ€์˜ ์ƒ์‚ฐ์„ฑ์ด 30% ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ค‘๋ฐ˜๋ถ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์š”์ฒญ ์‹œ์—๋„ ์‹ ์†ํ•œ ์šฐ์„ ์ˆœ์œ„ ์กฐ์ •์œผ๋กœ ํ”„๋กœ์ ํŠธ ์™„์ˆ˜๋ฅผ ์ด๋Œ์—ˆ์Šต๋‹ˆ๋‹ค.

2. ๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„

MySQL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐ๋‹ฌ ๋ชจ์ž„, ์‚ฌ์šฉ์ž, ์ •์‚ฐ ์ •๋ณด ๊ฐ„์˜ ๋ณต์žกํ•œ ๊ด€๊ณ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • User ํ…Œ์ด๋ธ”: ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์ •๋ณด, ์‹ ๋ขฐ๋„ ์ ์ˆ˜, ๊ฐ€์ž… ์ •๋ณด

  • DeliveryGroup ํ…Œ์ด๋ธ”: ๋ฐฐ๋‹ฌ ๋ชจ์ž„ ์ •๋ณด, ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐฐ๋‹ฌ๋น„ ์ •๋ณด

  • Participant ํ…Œ์ด๋ธ”: ๋ชจ์ž„๋ณ„ ์ฐธ์—ฌ์ž, ์ฃผ๋ฌธ ๊ธˆ์•ก ๊ธฐ๋ก

  • Message ํ…Œ์ด๋ธ”: ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ €์žฅ ๋ฐ ํƒ€์ž„์Šคํƒํ”„

  • Restaurant ํ…Œ์ด๋ธ”: ์Œ์‹์  ์ •๋ณด, ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜, ๋ฐฐ๋‹ฌ๋น„ ๋ฐ์ดํ„ฐ

์ œ3์ •๊ทœํ˜•(3NF)์— ๋งž๊ฒŒ ์ •๊ทœํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ์ „๋žต์  ์ธ๋ฑ์‹ฑ์œผ๋กœ ์กฐํšŒ ์„ฑ๋Šฅ์„ 150ms ์ดํ•˜๋กœ ๋‹จ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„

Spring Boot๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„ํ•˜๊ณ , ๊ธฐ๋Šฅ๋ณ„ ๊ณ„์ธต(Controller, Service, Repository)์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Controller Layer: HTTP ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ ๋ฐ ์ž…๋ ฅ ๊ฒ€์ฆ

  • Service Layer: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ ๋ฐ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ

  • Repository Layer: Spring Data JPA์™€ QueryDSL์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ

ํŠนํžˆ ๋ณต์žกํ•œ ๋ฐฐ๋‹ฌ๋น„ ์ •์‚ฐ ๋กœ์ง๊ณผ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์— ์ง‘์ค‘์‹œ์ผœ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

3. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ ์ตœ์ ํ™”๋œ API ๊ฐœ๋ฐœ

ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Spring Data JPA์™€ QueryDSL์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐ๋‹ฌ ์ธ์› ๋ชจ์ง‘, ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜, ์‹ค์‹œ๊ฐ„ ์ฐธ์—ฌ ํ˜„ํ™ฉ ์กฐํšŒ, ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ €์žฅ ๋ฐ ์กฐํšŒ ๋“ฑ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐฐ๋‹ฌ ๋ชจ์ž„ CRUD ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ API

  • ๋™์  ์Œ์‹์  ๊ฒ€์ƒ‰ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง API (QueryDSL ํ™œ์šฉ)

  • ๋ฐฐ๋‹ฌ๋น„ ์ •์‚ฐ ๊ณ„์‚ฐ ๋ฐ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ API

  • ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ /์ €์žฅ API

  • ์‚ฌ์šฉ์ž ๋ฐฐ๋‹ฌ ์ฐธ์—ฌ ํ†ต๊ณ„ ๋ฐ ์‹ ๋ขฐ๋„ ์กฐํšŒ API


Challenges


Retrospective

Last updated