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
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