RV Badminton App
์ ๊ฐ ์ค์ ๋ก ๋ค๋๋ ๋ฐฐ๋๋ฏผํด ๋ชจ์์ ์ํด ๋ง๋ ์ด์ ํ๋ซํผ์ ๋๋ค. ํ์์ Flutter ์ฑ์ผ๋ก ๊ฒฝ๊ธฐ๋ฅผ ๊ธฐ๋กํ๊ณ ์ค์๊ฐ ๋ฆฌ๋๋ณด๋์ ๊ฐ์ธ ๊ธฐ๋ก์ ํ์ธํ๋ฉฐ, Spring Boot ๋ฐฑ์๋ยท์ด์์ง ๋์๋ณด๋ยทPython ํฌ์ธํธ ๊ณ์ฐ ์๋น์ค๊ฐ ์ด๋ฅผ ๋ท๋ฐ์นจํฉ๋๋ค. App Store์ Google Play์ ์ถ์ํด ๋ชจ์์ด ๋งค์ฃผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.

๋ฌธ์
๋ชจ์์ ๋จํก๋ฐฉ 100๋ช ์ด์, ์ ๋ชจ๋ง๋ค 30โ40๋ช ์ด ๋ชจ์ด๋ ๊ท๋ชจ๋ก ์ปค์ก๊ณ , ๋ชจ๋ ๊ฒฝ๊ธฐ ์ ์๋ฅผ ๊ฐ์ธ ํฌ์ธํธ๋ก ํ์ฐํด ์์ฆ๋ง๋ค ์์ํ๋ ๊ฒ์ด ๋ชจ์์ ํต์ฌ ๋ฌธํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ๊ธฐ๋ก๊ณผ ์ ์ฐ์ 2๋ ๋์ ์ฌ๋ ์์ ์์กดํ์ต๋๋ค.
- ์์์ ์ ์ฐ. ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋ โ์ด๋ฆ ๋ค ๊ฐ์ ์ ์ ๋ ๊ฐโ ํ ์ค๋ก ๋จํก๋ฐฉ์ ์ฌ๋ผ๊ฐ๊ณ , ๋ชจ์์ฅ์ด ๋งค์ฃผ ๋ช ์๊ฐ์ฉ ๋ฉ์์ง๋ฅผ ๋ณต์ฌํ๊ณ ์คํ๋ฅผ ๊ณ ์ณ ๊ฐ์ธ C# ํ๋ก๊ทธ๋จ์ ๋ถ์ฌ ๋ฃ์์ต๋๋ค. ๊ทธ ํ๋ก๊ทธ๋จ์ ๋งค๋ฒ ์ฒซ ๊ฒฝ๊ธฐ๋ถํฐ ์ ๋ถ ๋ค์ ๊ณ์ฐํ์ต๋๋ค.
- ๋ฆ์ ๋ฆฌ๋๋ณด๋. ์ ๋ชจ ์ค์๋ ๋๊ตฌ๋ ์๊ธฐ ์์๋ฅผ ๋ชฐ๋๊ณ , ๊ฒฐ๊ณผ๋ ์์ ๋ฌด๋ ต์์ผ ๊ณต์ง๋์ต๋๋ค.
- ์๋ฆผ ๊ณตํด. ๊ฒฝ๊ธฐํ์ง ์์ ํ์๊น์ง ๊ฒฝ๊ธฐ๋ง๋ค ์๋ฆผ์ ๋ฐ์, ๊ฒฐ๊ตญ ๋จํก๋ฐฉ์ ์์๊ฑฐํ๊ณ ์ค์ํ ๊ณต์ง๋ฅผ ๋์ณค์ต๋๋ค.
- ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ. โ์ค๋ ๋ช ๊ฒ์ ์ณค์ง?โ, โ์ ๋ฌ ์ ๋ณด๋ค ๋์์ก๋?โ์ ๋ตํ๋ ค๋ฉด ์ฑํ ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์ผ ํ์ต๋๋ค.
ํด๊ฒฐ
๋ชจ์์ฅ์๊ฒ โ๊ท์น์ ์ ํด ์ฃผ์ธ์. ๊ธฐ๋กํ๊ณ ๊ณ์ฐํ๊ณ ๋ณด์ฌ์ฃผ๋ ์ผ์ ์ฑ์ผ๋ก ๋ง๋ค๊ฒ ์ต๋๋คโ ๋ผ๊ณ ์ ์ํ๊ณ , ํ ๋ฌ์ง๋ฆฌ ์ฌ์ด๋ ํ๋ก์ ํธ๋ก ์์ํ ์ผ์ด 18๊ฐ์์ ๊ฐ๋ฐ๋ก ์ด์ด์ก์ต๋๋ค.
- ๊ฒฝ๊ธฐ ๊ธฐ๋ก๊ณผ ์๋ฆผ์ ๋ถ๋ฆฌ. ํ์์ด ์ฑ์์ ๊ฒฝ๊ธฐ๋ฅผ ๋ฐ๋ก ๊ธฐ๋กํ๋ฉด ์ ์๊ฐ ์๋ ๊ณ์ฐ๋๊ณ , ์๋ฆผ์ ๊ฒฝ๊ธฐ์ ์ฐธ์ฌํ ์ฌ๋์๊ฒ๋ง ๊ฐ๋๋ค. ๊ณต์งยท์ฌ์งยท๊ฑด์๋ ์ฑ์ ์ปค๋ฎค๋ํฐ๋ก ์ฎ๊ฒผ์ต๋๋ค.
- ํฌ์ธํธ ๊ณ์ฐ ์์ง ๋ถ๋ฆฌ. ์ ์ ๊ท์น์ ๊ฑฐ์ ๋งค๋ฌ ๋ฐ๋๋, ์์คํ ์์ ๊ฐ์ฅ ๋ถ์์ ํ ๋ถ๋ถ์ด์์ต๋๋ค. ์ด๋ฅผ Spring Boot์์ ๋ผ์ด๋ด Python/FastAPI ์๋น์ค๋ก ๋ง๋ค๊ณ ๋ฐฐํฌ ๋จ์๋ฅผ ๋ถ๋ฆฌํ์ต๋๋ค. ์ ์ฅ์ ์์ ๊ถ๋ ๋๋ด์ต๋๋ค โ ์๋ณธ ๊ธฐ๋ก์ PostgreSQL, ์ฌ์ฐ ์บ์๋ DuckDB, ๋ฆฌ๋๋ณด๋๋ Redis. Java ์ชฝ์ Redis ๊ณ์ฝ๋ง ์งํค๋ฉด ๊ท์น์ด ์ด๋ป๊ฒ ๋ฐ๋๋ ์ํฅ์ด ์์ต๋๋ค.
- ํ์ํ ๋งํผ๋ง ์ฌ์ฐ. ๋ฆฌ๊ทธํฌ์ธํธ๋ ์ด์ ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๊ฐ ๋ค์ ๊ณ์ฐ์ ์ ๋ ฅ์ด ๋๋ ์์ฐจ ์ฒด์ธ์ด๋ผ, ์ง๋ ๊ฒฝ๊ธฐ ํ๋๋ฅผ ๊ณ ์น๋ฉด ๊ทธ ๋ค ์ ๋ถ๋ฅผ ๋ค์ ๊ตด๋ ค์ผ ํฉ๋๋ค. ๋งค๋ฒ ์ฒ์๋ถํฐ ๊ณ์ฐํ๋ ๋์ ์ง์ ์ค๋ ์ท๋ถํฐ ์ฌ์ฐํ๊ณ , ์ฌ์์ ์ ์๋ณธ๊ณผ ์บ์๋ฅผ ๋์กฐํด ์ค์ค๋ก ๋ง์ถ๋๋ก ํ์ต๋๋ค.
- ๊ท์น ๊ฐํธ์ ๊ณ๊ธฐ๋ก ๊ตฌ์กฐ ์ฌ์ค๊ณ. ์ธ ๊ฐ์ ๋ฆฌ๊ทธํฌ์ธํธ๊ฐ ํ์๋น MMR ํ๋๋ก, ๋ค์ฏ ๋จ๊ณ ๊ณต์์ด ์ธ ๋ฌธ์ฅ์ง๋ฆฌ ์ ๋ก์ฌ ์ ์ฐ์ผ๋ก ๋ฐ๋์์ต๋๋ค. ์ด๋ MMR์ ์ปฌ๋ผ์ ์ ์ฅํ์ง ์๊ณ ๋ธํ๋ฅผ append-only ์์ฅ์ ์์ ํฉ์ผ๋ก ๊ตฌํ๋๋ก ๋ฐ๊ฟจ์ต๋๋ค. ์ถ์ ๋ณด์ ์ด ๋ค์ ์ ๋ชจ์ ์์ MMR์ด ๋๋ฉด์ ์ฌ์ฐ ๋จ์๋ ๊ฒฝ๊ธฐ ์์์ ํ๋ฃจ ์์ผ๋ก ์ฎ๊ฒผ๊ณ , ์ฌ๊ณ์ฐ ์์ฒญ์ 1.5์ด ์ฐฝ์ผ๋ก ๋ชจ์ ๊ฐ์ฅ ์ด๋ฅธ ๋ ์ง ํ๋๋ก ํฉ์นฉ๋๋ค.
๊ฒฐ๊ณผ
- ์ ๋ชจ ์ค ์ค์๊ฐ ๋ฆฌ๋๋ณด๋, ์ฐธ๊ฐ์ ๋์ ์๋ฆผ, ํ์๋ณ ๊ฒฝ๊ธฐยท์น๋ฅ ยทํฌ์ธํธ ์ด๋ ฅ์ ์ ๊ณตํด ๋ชจ์์ฅ์ ๋งค์ฃผ ์์์ ์ ์ฐ์ ์์ด์ต๋๋ค.
- ์ฝ 1,000๊ฐ์ ์ปค๋ฐ, 3๊ฐ ์ธ์ด๋ก ๋ง๋ 4๊ฐ ์๋น์ค๋ฅผ App StoreยทGoogle Play๋ก ์ถ์ํด ํ๋ก๋์ ์์ ์ด์ ์ค์ ๋๋ค.
- ๋งค์ผ ์๋ฒฝ ์ฒ์๋ถํฐ ์ ์ฒด ์ฌ์ฐ์ ๋๋ ค ๋ญํน๊ณผ ๋์กฐํ๋ ๊ฒ์ฆ์ ๋์ ํ์ต๋๋ค. ์ด๋ฅผ ์ํด DuckDB Postgres ์ค์บ๋์ N+1์ ๊ฑท์ด๋ด 1๋ง 2์ฒ์ฌ ๊ฒฝ๊ธฐ ์ ์ฒด ์ฌ์ฐ์ ์ฝ 20๋ถ์์ 80์ด ๋ฏธ๋ง์ผ๋ก ์ค์์ต๋๋ค.
- ์์ฅ ๊ตฌ์กฐ ๋๋ถ์ โ๊ฒฝ๊ณ์ผ๋ถํฐ ๋ถ๋ถ ์ฌ์ฐํ ๊ฒฐ๊ณผ == ์ฒ์๋ถํฐ ์ ์ฒด ์ฌ์ฐํ ๊ฒฐ๊ณผโ๋ฅผ ๋ฌด์์ ๊ฒฝ๊ณ์ผ 5๊ฐ์ ๋ํด ๋ฐ์ดํธ ๋จ์๋ก ๊ฒ์ฆํ๋ ํ ์คํธ๋ฅผ ์ธ ์ ์๊ฒ ๋์ต๋๋ค.
- ๊ฒฝ๊ธฐ๋ณ ์ ์ฐ ๋ด์ญ API๋ ์ ์ฅ๊ฐ์ด ์๋๋ผ ์์ฅ์์ ๊ทธ ์์ ์ํ๋ฅผ ๋ณต์ํด ๋ค์ ๊ณ์ฐํ๊ณ , ์์ฅ๊ณผ์ ์ผ์น ์ฌ๋ถ๋ฅผ ํจ๊ป ๋๋ ค์ค๋๋ค. ์ ๋ชจ ๋จ์ ๊ฒ์ํฌ์ธํธ ์ฌ์ ์ง๊ณ๋ก ๋ฆฌ๋๋ณด๋ ์ฝ๊ธฐ๋ฅผ 31โ33๋ฐฐ ๋น ๋ฅด๊ฒ ํ์ต๋๋ค.
- ๊ฐํธ์ Python ์๋น์ค ์์์ ๋๋ฌ๊ณ , Java ๋ฐฑ์๋์์ ๋ฐ๋ ๊ฒ์ ํ ์๊ทธ๋์ฒ์ ์บ์ ํค ๋ช ๊ฐ๋ฟ์ด์์ต๋๋ค. ์์ง์ ๋ถ๋ฆฌํ ๊ฒฐ์ ์ด ์ฌ๊ธฐ์ ๊ฐ์ ํ์ต๋๋ค.
๋ฐฐ์ด ๊ฒ
- ๊ฐ์ฅ ์์ฃผ ๋ฐ๋๋ ๋ถ๋ถ์ ๋ ๋ฆฝ๋ ๋ฐฐํฌ ๋จ์๋ก. ์๋น์ค ๋ถ๋ฆฌ์ ์ด์ ๋ ๊ธฐ์ ์คํ์ด ์๋๋ผ ๋ณ๊ฒฝ ๋น๋์๊ณ , ๊ทธ ํ๋จ์ ๊ท์น ๊ฐํธ ๋ ๊ทธ๋๋ก ํ์๋์ต๋๋ค.
- ํ์ํ ์ ์๋ ๊ฐ์ ์ ์ฅํ์ง ์์ต๋๋ค. ๋ฎ์ด์ฐ๋ ์ง์ ์ด ์์ผ๋ฉด ๋ก์์ง ๊ฐ๋ ์๊ณ , ์ฌ์ฐ์ด ์์ ํจ์๊ฐ ๋์ด ํ ์คํธํ ์ ์๊ฒ ๋ฉ๋๋ค. ํ์ ์ ์ฅ์๋ ์ธ์ ์ง์๋ ๋๋ ์บ์๋ก ๋ก๋๋ค.
- ๊ท์น์ ์ฝํธ์์ ๋ง๋ก ์ค๋ช ํ ์ ์์ด์ผ ํฉ๋๋ค. ๋ค์ฏ ๋จ๊ณ ๊ณต์์ ์ ํํ์ง๋ง โ์ 5์ ๋ฐ์ ์ ์ฌ๋๋โ์ ๋ตํ ์ ์์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ดํดํ ์ ์๋ ๊ท์น์ด ์์คํ ์ ์๊ตฌ์ฌํญ์ด์์ต๋๋ค.
- ์ค์ฌ์ฉ์์๊ฒ ๋จผ์ ๋ฐฐํฌํ๋ฉด ๋ถ์ฑ๋ ํจ๊ป ์ต๋๋ค. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ ๊ณ ๋ฅด์ง ์๊ณ CI/CD์ API ๋ฌธ์๋ ๋จ์ ๊ณผ์ ์ ๋๋ค. ๋์ ์ค๋ฅ๋ฅผ ๋ฐ๋ก ์๋ ค ์ฃผ๋ ์ฌ์ฉ์๊ฐ ์์๊ณ , ๊ทธ๊ฒ 18๊ฐ์์ ์ด์ด ๊ฐ ์ด์ ์์ต๋๋ค.
๋ ์ฝ๊ธฐ
์ค๊ณ ๊ฒฐ์ ์ ๊ทผ๊ฑฐ์ ๊ตฌํ ๊ณผ์ ์ ๊ฐ๋ฐ ์ผ์ง์ ์ฑํฐ๋ณ๋ก ๊ธฐ๋กํ์ต๋๋ค.
- Chapter 1 โ ํ๋ก์ ํธ ์๊ฐ
- Chapter 2 โ PointCalculator
- Chapter 3 โ PointCalculator, ๋ ๋ฒ์งธ
Flutter ยท Spring Boot ยท Java ยท Python ยท FastAPI ยท PostgreSQL ยท DuckDB ยท Redis