Software Development ๊ด๋ จ ๊ณต๋ถํ ๋ด์ฉ์ ์๋์ ๊ธฐ๋กํฉ๋๋ค.
Versioning
- SemVer(Semantic Versioning):
{major}.{minor}.{patch}๋ก ์๋ฏธ๋ฅผ ๋ถ์ฌํ ๋ฒ์ ๋ ์์คํ . ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ ์ํํธ์จ์ด ๋ฒ์ ๋ ๋ฐฉ์major: ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ์ด ์์ ๋ ์ฆ๊ฐ. ์๋ฅผ ๋ค์ด, ๊ธฐ์กด ํจ์์ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๊พธ๊ฑฐ๋, ์ค์ํ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๋ฑ์ ๋ณ๊ฒฝ์ด ํฌํจ๋ ์ ์์. 'breaking change'๋ผ๋ ๊ฒฝ๊ณ ์ฑ ์๋ฏธ๋ก ์ค์ minor: ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ผ๋, ํ์ ํธํ์ฑ์ ์ ์ง๋ ๋ ์ฆ๊ฐ. ์๋ฅผ ๋ค์ด, ์๋ก์ด ํจ์๋ ์ต์ ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ, ํด๋น ๋ฒ์ ๋ฒํธ๊ฐ ์ฆ๊ฐpatch: ํ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฒ๊ทธ ์์ ์ด ์์ ๋ ์ฆ๊ฐ. ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋์์ ์์ ํ๊ฑฐ๋ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ณ๊ฒฝ์ด ํฌํจ- ์์: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ์ 1.3.0 / ๋ฒ๊ทธ ์์ ์ 1.2.4 / ํ์ ํธํ์ฑ์ด ์๋ ๋ณ๊ฒฝ ์ 2.0.0
- HeadVer:
{head}.{yearweek}.{build}๋ก ์๋ฏธ๋ฅผ ๋ถ์ฌํ ๋ฒ์ ๋ ์์คํ . SemVer๋ API๋ฅผ ์ํ ๋ฒ์ ๋ ์์คํ ์ด๋ผ๋ ์ ์ ์ง์ ํ๋ฉฐ, ์ต์ข ์ฌ์ฉ์(end-user)๋ฅผ ๋ ์ผ๋์ ๋๊ณ ๋ฒ์ ๋ํ ๋ฐฉ์. ํ ํ์ฌ์ ๋ชจ๋ ์ฑ์ ๋ชจ๋๊ฐ ๊ฐ์ ๊ท์น์ผ๋ก ํด์. ์ด๋ฆ์ '์ด ๋ฒ์ ๋์์ ์ ๊ฒฝ ์ธ ๊ฒ์ Head ๋ฐ์ ์๋ค. ๋๋จธ์ง๋ ์๋์ด๋ค'๋ผ๋ ์๋ฏธhead: SemVer์ ๋ฌ๋ฆฌ ์ฒซ์งธ ์๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ฆ๊ฐ์ํค๋ ๊ฒ์ ๊ถํจ. ์ฌ์ฉ์์๊ฒ ๋๋ฌํ๋ ํ์๋ง๋ค ์ฆ๊ฐํ๋ฉด ์ข๋ค๊ณ ํจyearweek: ์ฃผ ์ฐจ(week number) ์ ๋ณด. ์๋์ผ๋ก ์ฆ๊ฐํ๋๋ก ์ค์ build: ๋น๋ ๋ฒํธ. ์๋์ผ๋ก ์ฆ๊ฐํ๋๋ก ์ค์
- GitHub release: ํ๋ก์ ํธ์ ํน์ ๋ฒ์ (e.g., v1.0, v2.1)์ ์ฝ๊ฒ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณต. ์ํํธ์จ์ด์ ํน์ ์ํ(์ผ๋ฐ์ ์ผ๋ก ์ฃผ์ ๋ฒ์ ์ด๋ ์ค์ํ ์ ๋ฐ์ดํธ)๋ฅผ 'release'๋ก ์ ์ํ๊ณ , ํด๋น ์์ ์ ์์ค ์ฝ๋์ ํจ๊ป ๋ฆด๋ฆฌ์ค ๋ ธํธ, ๋ฐ์ด๋๋ฆฌ ํ์ผ ๋ฑ์ ํจ๊ป ์ ๊ณต
Versioning for ML
-
Labeling rule versioning: GitBook๊ณผ ๊ฐ์ git ๊ธฐ๋ฐ documentation ํด์ ์ฌ์ฉํ์ฌ ๋ผ๋ฒจ๋ง ๊ฐ์ด๋๋ผ์ธ ๋ฌธ์๋ฅผ ์์ฑํ ๋ค์, ํด๋น ๋ผ๋ฒจ๋ง ๊ฐ์ด๋๋ผ์ธ ์ ์ฅ์๋ฅผ ๋ฒ์ ๋. ๋ฒ์ ๋ ์์คํ ์ SemVer ์ฌ์ฉํ๋ ๊ฒ ์ข์๋ณด์
-
Data versioning: Data Version Control (DVC), Delta Lake์ Time Travel๋ฑ์ ๊ธฐ๋ฅ ํ์ฉํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์
-
Model versioning: MLflow Model Registry ํ์ฉํด์ ๋ฐฐํฌ ๋ชจ๋ธ ๋ฒ์ ๋ ํ๋ ๊ฒ ์ข์๋ณด์
Exception
Exception(์์ธ)์ ์๊ธฐ์น ์์ ์ค๋ฅ๋ ๋น์ ์์ ์ธ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ, ํ๋ก๊ทธ๋จ์ด ๊ฐ์์ค๋ฝ๊ฒ ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ , ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ํฉ์ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ์ฌ ํ๋ก๊ทธ๋จ์ด ์์ ํ๊ฒ ์ข ๋ฃ๋๊ฑฐ๋ ๊ณ์ ์คํ๋ ์ ์๋๋ก ๋์ต๋๋ค.
์์ธ๋ ์ค๋ฅ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฒ์ด์ง ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ํ๋ฆ ์ ์ด๋ฅผ ์ํ ๊ฒ์ด ์๋๊ธฐ์ ํ๋ฆ ์ ์ด์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ถฉ๋ถํ ์ฒ๋ฆฌํ ์ ์๋ ์ํฉ์์๋ ์์ธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
Python Exceptions
Python exception ์ข ๋ฅ์ ๋ํด ์๋์ ๊ธฐ๋กํฉ๋๋ค.
-
Exception: ํน์ ์์ธ๋ฅผ ์ง์ ํ์ง ์๊ณ ๋ชจ๋ ์์ธ๋ฅผ ์ก์์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ -
ArithmeticError: ๋ชจ๋ ์ฐ์ ๊ณ์ฐ ์ค๋ฅ์ ๊ธฐ๋ณธ ํด๋์ค.ZeroDivisionError,OverflowError,FloatingPointError๋ฑ์ ์์ ํด๋์ค. ์ง์ ์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๊ณ , ํ์ ํด๋์ค๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋จ -
ZeroDivisionError: ์ซ์๋ฅผ 0์ผ๋ก ๋๋๋ ค๊ณ ํ ๋ ๋ฐ์ -
ValueError: ํจ์๋ ์ฐ์ฐ์๊ฐ ์๋ชป๋ ๊ฐ์ ๋ฐ์์ ๋ ๋ฐ์. ์๋ฅผ ๋ค์ด,int()ํจ์์ ์ซ์๊ฐ ์๋ ๋ฌธ์์ด์ ์ ๋ฌํ๋ฉด ๋ฐ์ -
TypeError: ์ฐ์ฐ ๋๋ ํจ์๊ฐ ์๋ชป๋ ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ ๋ ๋ฐ์ -
IndexError: ๋ฆฌ์คํธ๋ ํํ ๋ฑ์ ์ํ์ค์์ ์๋ชป๋ ์ธ๋ฑ์ค๋ฅผ ์ฐธ์กฐํ ๋ ๋ฐ์ -
KeyError: ๋์ ๋๋ฆฌ์์ ์กด์ฌํ์ง ์๋ ํค๋ฅผ ์ฐธ์กฐํ ๋ ๋ฐ์ -
AttributeError: ๊ฐ์ฒด์ ์กด์ฌํ์ง ์๋ ์์ฑ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ๋ฐ์ -
ImportError: ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ค๊ณ ํ ๋, ๋ชจ๋์ด ์๊ฑฐ๋ ๋ชจ๋ ๋ด์ ์กด์ฌํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ ๋ ๋ฐ์ -
FileNotFoundError: ํ์ผ์ ์ด๋ ค๊ณ ํ ๋ ํด๋น ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฐ์ -
OSError: ์์คํ ๊ด๋ จ ์๋ฌ๋ก, ํ์ผ ์์คํ ์ด๋ ์ด์ ์ฒด์ ์ ์ํธ์์ฉํ ๋ ๋ฐ์ -
RuntimeError: ๋ค๋ฅธ ๋ฒ์ฃผ์ ์ํ์ง ์๋ ์ผ๋ฐ์ ์ธ ์คํ ์ ์ค๋ฅ๋ฅผ ๋ํ๋. ๊ตฌ์ฒด์ ์ธ ์์ธ๋ก ์ค๋ช ๋์ง ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ์ฌ์ฉ -
StopIteration:next()ํจ์๊ฐ ๋ ์ด์ ์์ดํ ์ ๋ฐํํ ์ ์์ ๋ ๋ฐ์. ์ฃผ๋ก ๋ฐ๋ณต์์ ์ข ๋ฃ๋ฅผ ์๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉ -
KeyboardInterrupt: ์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ์ข ๋ฃํ๋ ค๊ณ Ctrl+C๋ฅผ ์ ๋ ฅํ์ ๋ ๋ฐ์ -
MemoryError: ์์คํ ์์ ๋ ์ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์ ๋ ๋ฐ์
Logging
Python Log Libraries
- loguru: ์ฌ์ฉํ๊ธฐ ์ฌ์ด API์ ๊ธฐ๋ณธ ์ ๊ณต๋๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค๋ก ๋น ๋ฅด๊ฒ ๋ก๊น ์์คํ ์ ๊ตฌ์ถํ ์ ์์. ํ์ค์ด ์๋๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ถ๊ฐํด์ผ ํจ
- logging: Python์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ณต์กํ ์๊ตฌ ์ฌํญ์ ๋ง๋ ์ ์ฐํ ์ค์ ์ด ๊ฐ๋ฅํ์ง๋ง, ์ด๊ธฐ ์ค์ ์ด ๋ณต์กํ ์ ์์
- logbook:
logging์ ๋ณต์ก์ฑ์ ์ค์ด๋ฉด์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋์์ผ๋ก, ๋น๋๊ธฐ ๋ก๊น ์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฉ (๋น๋๊ธฐ ๋ก๊น ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ์ฌ, ๊ณ ์ฑ๋ฅ ๋ก๊น ์ด ๊ฐ๋ฅ)
Log Level
loguru ๊ธฐ์ค์ผ๋ก ์ดํด๋ณธ log level์ ์๋์ ๊ฐ์ต๋๋ค.
TRACE(5): ํ๋ก๊ทธ๋จ์ ๋ ผ๋ฆฌ ํ๋ฆ์ ๋ํ ์ ์์ค ์ ๋ณดDEBUG(10): ๋๋ฒ๊น ์ค์ ๋์์ด ๋๋ ์ ๋ณดINFO(20): ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ก ์๋ํ๊ณ ์์์ ํ์ธSUCCESS(25): ์์ ์ด ์ฑ๊ณตํ์์ ํ์WARNING(30): ์ถํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ด์๋ฅผ ํ์ERROR(40): ์ฆ๊ฐ์ ์ธ ์ฃผ์๊ฐ ํ์ํ์ง๋ง ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํค์ง ์๋ ์ด์CRITICAL(50): OOM๊ณผ ๊ฐ์ด, ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํฌ ์ ์๋ ์ฌ๊ฐํ ์ด์
ํน์ log level ์ด์๋ง ํ์ถํ๋๋ก ์ค์ ํ ์ ์์ด์, ๋๋ฒ๊น ํ๊ฒฝ, Devํ๊ฒฝ, Prod ํ๊ฒฝ ๋ฑ, ํ๊ฒฝ ๋ณ๋ก ๋ค๋ฅธ log level์ ์ ์ฉํ์ฌ log๋ฅผ ํ์ธํ ์๋ ์์ต๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ธ๋ค์ ๋งํฌ๋ฅผ ์ฒจ๋ถํฉ๋๋ค
- ํฅ๋ก๋ - 1. ํจ์จ์ ์ผ๋ก ๋ก๊ทธ ๋ชจ๋ํฐ๋งํ๊ธฐ - ๋ก๊ทธ ๋ ๋ฒจ ๊ตฌ๋ถํ๊ธฐ
- ํฅ๋ก๋ - ์ข์ ์์ธ(Exception) ์ฒ๋ฆฌ
- ํฅ๋ก๋ - ์ด์ ๋ก๊ทธ์ ๋๋ฒ๊ทธ ๋ก๊ทธ ๋ถ๋ฆฌํ๊ธฐ
Sentry
Sentry๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋ฅ ์ถ์ ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ ๊ณตํ๋ ์คํ ์์ค ํ๋ซํผ์ ๋๋ค. Sentry๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ์ค๋ฅ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ฐ์งํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค.
- ์๋ฌ ์ถ์ (Error Tracking): ์ฝ๋์์ ๋ฐ์ํ ์์ธ(Exception)๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ์ฌ ๋์๋ณด๋์ ํ์. ์๋ฌ์ stack trace, ํ๊ฒฝ ์ ๋ณด, ์ฌ์ฉ์ ์ ๋ณด ๋ฑ์ ์๋ ์์ง
- ๋ฆด๋ฆฌ์ฆ ํฌ์ค ๋ชจ๋ํฐ๋ง (Release Health): ํน์ ๋ฆด๋ฆฌ์ฆ ๋ฒ์ ์์ ๋ฐ์ํ ์ด์๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ถ์ . ๊ฐ ๋ฆด๋ฆฌ์ฆ์ ๋ํ crash-free rate, adoption rate ๋ฑ ํ์ธ ๊ฐ๋ฅ
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง (Performance Monitoring): ํธ๋์ญ์ ๋ณ ์๋ต ์๊ฐ, ์ฟผ๋ฆฌ ์ง์ฐ, API ์์ฒญ ๋ณ๋ชฉ ๋ฑ ์ถ์ . APM(Application Performance Monitoring) ์์ค์ ๊ธฐ๋ฅ ์ ๊ณต
- ์๋ฆผ ์์คํ : ์ฌ๋, ์ด๋ฉ์ผ, MS Teams, Discord ๋ฑ๊ณผ ์ฐ๋ํด ์๋ฆผ ์ ์ก ๊ฐ๋ฅ. ํน์ ์กฐ๊ฑด(์: ๋์ผ ์๋ฌ ๋ฐ๋ณต, ํน์ ์ฌ์ฉ์ ๋ฐ์)์ ๋ฐ๋ฅธ ์๋ฆผ ์ค์
- ์ด์ ๊ทธ๋ฃนํ ๋ฐ ์๋ํ: ๊ฐ์ ์ข ๋ฅ์ ์๋ฌ๋ฅผ ํ๋์ ์ด์๋ก ๋ฌถ์ด์ ๊ด๋ฆฌ. ํน์ ์ด์์ ํ๊ทธ ์ง์ , ์ฐ์ ์์ ์ค์ , ๋ด๋น์ ํ ๋น ๊ฐ๋ฅ
์๋ฅผ ๋ค์ด ์น์ฌ์ดํธ์์ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ์ ๋ JS ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด:
- ์๋ฌ๊ฐ Sentry SDK๋ฅผ ํตํด ์๋์ผ๋ก ์ ์ก๋จ
- ๋์๋ณด๋์์ ํด๋น ์ค๋ฅ์ ๊ฒฝ๋ก, ํ๊ฒฝ, ์ฌ์ฉ์ ID ๋ฑ ํ์ธ
- ์ฌ๋์ผ๋ก ์๋ฌ ๋ฐ์ ์๋ฆผ ์์
- ํน์ ์ปค๋ฐ๊ณผ ์ฐ๊ฒฐํด ์ด๋ค ์ฝ๋ ๋ณ๊ฒฝ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ๋์ง๋ ์ถ์ ๊ฐ๋ฅ
Data Libraries
Encoding
UTF-8(8-bit Unicode Transformation Format)๋ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ผ์ข
์ผ๋ก, ์ ์ธ๊ณ์ ๊ฑฐ์ ๋ชจ๋ ๋ฌธ์๋ฅผ ํํํ ์ ์๋ ๊ฐ๋ณ ๊ธธ์ด ๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์
๋๋ค. Python์์๋ ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉํ๊ฑฐ๋ ๋์ฝ๋ฉํ ๋ str๊ณผ bytes ํ์
๊ฐ์ ๋ณํํ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ๋ณ ๊ธธ์ด ์ธ์ฝ๋ฉ: ASCII ๋ฌธ์๋ 1๋ฐ์ดํธ, ๊ทธ ์ธ์ ๋ฌธ์๋ 2๋ฐ์ดํธ์์ 4๋ฐ์ดํธ๊น์ง ์ฌ์ฉ๋จ
- ์ ๋์ฝ๋ ํธํ: UTF-8์ ์ ๋์ฝ๋์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ง์
- ํ์ ํธํ์ฑ: ASCII์ ์๋ฒฝํ๊ฒ ํธํ๋๋ฉฐ, ASCII ๋ฌธ์์ด์ UTF-8์์๋ ๋์ผํ๊ฒ ํํ๋จ
Compression
blosc2๋ ๊ณ ์ฑ๋ฅ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํนํ ๋๊ท๋ชจ ๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ์์ถํ๊ณ ์์ถ ํด์ ํ๋ ๋ฐ ์ต์ ํ๋์ด ์์ต๋๋ค. ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ ์์ถ์ ์ํํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํ๋ ๋ฐ ์ค์ ์ ๋ . ๋ฐ์ดํฐ ๋ถ์, ๋จธ์ ๋ฌ๋ ๋ฑ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค. ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์คํธ๋ฆฌ๋ฐ ์์ถ: ์ฐ์์ ์ธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ํด ํจ์จ์ ์ผ๋ก ์์ถํ ์ ์์
- ๋ค์ํ ์์ถ ์ฝ๋ฑ ์ง์: LZ4, Zlib, Zstandard ๋ฑ์ ๋ค์ํ ์ฝ๋ฑ์ ์ง์
- ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ง์: ๋ฉํฐ์ฝ์ด CPU๋ฅผ ํ์ฉํ์ฌ ๋ณ๋ ฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ถํ๊ณ ํด์ ํ ์ ์์
Serialization
orjson๋ python์์ ๋งค์ฐ ๋น ๋ฅธ JSON ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.. ๊ธฐ๋ณธ json ๋ชจ๋์ ๋นํด ํจ์ฌ ๋น ๋ฅด๊ฒ ๋์ํ๋ฉฐ, ํนํ ํฐ ๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค. ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ณ ์ฑ๋ฅ: JSON ๋ฐ์ดํฐ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ง๋ ฌํ(encode) ๋ฐ ์ญ์ง๋ ฌํ(decode)ํ ์ ์์
- ์ ๋์ฝ๋ ์ง์: UTF-8 ์ธ์ฝ๋ฉ์ ๊ธฐ๋ณธ์ผ๋ก ํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ
- ์ ํ์ฑ: ์ ํํ ๋ ์ง ๋ฐ ์๊ฐ ์ง๋ ฌํ, IEEE 754 ๊ท๊ฒฉ์ ๋ง์ถ ๋ถ๋์์์ ํํ ๋ฑ์ ์ง์
Test Code
์ ๋ํ ์คํธ์์ ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ฒดํ์ฌ ์ฌ์ฉ๋๋ ํ ์คํธ ๋๋ธ(์ค์ ๊ฐ์ฒด๋ฅผ ๋์ ํด์ ํ ์คํ ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐฉ๋ฒ)์ ํ์ ์๋ mock๊ณผ stub ๋ฑ์ด ์์ผ๋ฉฐ, ์ด ๋์ ๋ชฉ์ ๊ณผ ํน์ฑ ์ธก๋ฉด์์ ์กฐ๊ธ ์ฐจ์ด๋ฅผ ๊ฐ์ง๋๋ค.
-
Dummy Object: ์๋ฌด ๋์๋ ํ์ง ์์ผ๋ฉฐ, ๋จ์ง ์ธ์คํด์ค๊ฐ ํ์ํ ๋ ์๋ฆฌ๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ฌ์ฉ. ์๋ฅผ ๋ค์ด, ๋ฉ์๋ ํธ์ถ ์ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ฒด๊ฐ ์๊ตฌ๋์ง๋ง ์ค์ ๋ก ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ์ ๋๋ฏธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์
-
Stub: ๋ฏธ๋ฆฌ ์ ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฐ์ฒด. ํน์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์์ธก ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ์ค์ ํ ์ ์์
-
Spy: ์คํ ๊ณผ ๋น์ทํ์ง๋ง, ์คํ์ด๋ ํธ์ถ๋ ๋ฉ์๋๋ ์ ๋ฌ๋ ์ธ์์ ๊ฐ์ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์. ์ด๋ฅผ ํตํด ํ ์คํธ ํ์ ํน์ ๋ฉ์๋๊ฐ ์ผ๋ง๋ ์์ฃผ ํธ์ถ๋์๋์ง ๋๋ ์ด๋ค ์ธ์๊ฐ ์ ๋ฌ๋์๋์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
-
Mock: ๋ชจํฌ๋ ํ๋ ๊ธฐ๋ฐ ํ ์คํธ์ ์ฌ์ฉ๋จ. ํธ์ถ๋๋ ๋ฉ์๋์ ๊ทธ ํธ์ถ ํ์, ํธ์ถ ์์ ๋ฑ์ ๋ฏธ๋ฆฌ ์ค์ ํ๊ณ , ํ ์คํธ๊ฐ ์๋ฃ๋๋ฉด ์ด ๋ชจ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์๋์ง ๊ฒ์ฆ
-
Fake: ์ค์ ๊ตฌํ์ด ์๋ ํ ์คํธ ๋ชฉ์ ์ผ๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํ๋ ๊ฐ์ฒด. ์๋ฅผ ๋ค์ด, ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ ์ด๋ก์จ ํ ์คํธ ํ๊ฒฝ์์ ๋์ฑ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ํ ์คํธํ ์ ์์
Stub and Mock
Stub์ ํ ์คํธ ์ค์ ํน์ ํธ์ถ์ ๋ํด ๋ฏธ๋ฆฌ ์ ์๋ ์๋ต์ ์ ๊ณตํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. (์ํ ๊ฒ์ฆ)
- ์ผ๋ฐ์ ์ผ๋ก ๋จ์ ํ ์คํธ๊ฐ ์ํธ์์ฉํ๋ ์ค์ ๊ตฌ์ฑ ์์์ ๋์์ ์๋ฎฌ๋ ์ดํธํ๊ธฐ ์ํด ์ฌ์ฉ๋จ
- ์๋ฅผ ๋ค์ด, ๊ณ ์ ๋ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ํน์ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ํธ๋ฆฌ๊ฑฐ. '์ด๋ป๊ฒ' ์ฌ์ฉ๋๋์ง์ ๋ํด ํธ๋ํน์ ํ์ง ์์
- ์ฆ, ํธ์ถ ํ์๋ ํธ์ถ ์์์ ๋ํด์๋ ์ ๊ฒฝ์ฐ์ง ์๊ณ , ๊ธฐ๋๋๋ ๊ฒฐ๊ณผ๋ฅผ '๋ฆฌํด'ํ๋ ๊ฒ์ด ์ฃผ์ ์ญํ ์
- ๋ฐ๋ผ์ stub์ ํ ์คํธ๊ฐ ๋จ์ ํ ์คํธ์ ๋์์ ์ง์คํ๊ณ , ๊ตฌ์ฑ ์์ ๊ฐ์ ์ํธ์์ฉ์ด ์๋๋ผ ํ ์คํธ์ ์ด์ ์ ๋ง์ถ ๋ ์ฌ์ฉ
class UserRepositoryStub:
def get_user(self, user_id):
return {"id": user_id, "name": "John Doe"}
def test_get_user():
user_repo_stub = UserRepositoryStub()
user_service = UserService(user_repo_stub)
user = user_service.get_user(1)
assert user == {"id": 1, "name": "John Doe"}Mock์ ๋จ์ ํ ์คํธ ๋์๊ณผ ๊ทธ ์์กด์ฑ ๊ฐ์ ์ํธ์์ฉ์ ๊ฒ์ฆํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. (ํ๋ ๊ฒ์ฆ)
- ๋ฏธ๋ฆฌ ์ ์๋ ์๋ต์ ์ ๊ณตํ ๋ฟ๋ง ์๋๋ผ '์ด๋ป๊ฒ' ํธ์ถ๋์๋์ง๋ ๊ธฐ๋ก
- Mock์ ํน์ ๋ฉ์๋๊ฐ ํน์ ํ์๋งํผ, ํน์ ์ธ์๋ก, ํน์ ์์๋๋ก ํธ์ถ๋์๋์ง ๋ฑ์ ํ์ธ
- ๋ฐ๋ผ์ mock์ ๋จ์ ํ ์คํธ ๋์์ด ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํธ์์ฉํ๋์ง ํ์ธํ๋๋ฐ ์ฌ์ฉ
from unittest.mock import Mock
def test_get_user():
user_repo_mock = Mock()
user_repo_mock.get_user.return_value = {"id": 1, "name": "John Doe"}
user_service = UserService(user_repo_mock)
user = user_service.get_user(1)
user_repo_mock.get_user.assert_called_once_with(1)
assert user == {"id": 1, "name": "John Doe"}Branching Strategy
GitFlow
GitFlow๋ Vincent Driessen์ด ์ ์ํ ๋ชจ๋ธ๋ก, ๋ณต์กํ ํ๋ก์ ํธ์ ์ ํฉํ ๋งค์ฐ ๊ตฌ์กฐํ๋ branching ์ ๋ต์ ๋๋ค. GitFlow์ ํต์ฌ์ ์ฌ๋ฌ ๊ฐ์ ๋ธ๋์น๋ฅผ ์ฌ์ฉํด ์ฝ๋์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , ๋ช ํํ๊ฒ ์ญํ ์ ๋ถ๋ดํ๋ ๊ฒ์ ๋๋ค.
-
main: ์ต์ข ์ ์ผ๋ก ๋ฐฐํฌ๋ ์์ ์ ์ธ ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ธ๋์น. ๋ชจ๋ ๋ฐฐํฌ ๋ฒ์ ์ ์ด ๋ธ๋์น์์ ๊ด๋ฆฌ๋จ -
develop: ๊ฐ๋ฐ ์ค์ธ ์ต์ ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ธ๋์น. ์ ๊ธฐ๋ฅ์ด๋ ์์ ์ฌํญ์ ์ด ๋ธ๋์น์์ ๋ณํฉ๋๋ฉฐ, ๋ค์ ๋ฆด๋ฆฌ์ค์ ๊ธฐ์ด๊ฐ ๋จ -
feature: ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ํ ๋ธ๋์น. develop ๋ธ๋์น์์ ๋ถ๊ธฐํ์ฌ ์์ ์ ์งํํ๊ณ , ์๋ฃ๋๋ฉด ๋ค์ develop ๋ธ๋์น์ ๋ณํฉ -
release: ๋ค์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ค๋นํ๋ ๋ธ๋์น. develop ๋ธ๋์น์์ ๋ถ๊ธฐํ์ฌ, ํ ์คํธ์ ๋ฒ๊ทธ ์์ ์ ์งํํ ํ main ๋ธ๋์น์ develop ๋ธ๋์น์ ๋ณํฉ -
hotfix: ๋ฐฐํฌ๋ ์ฝ๋์์ ๋ฐ์ํ ๊ธด๊ธํ ๋ฒ๊ทธ ์์ ์ ์ํ ๋ธ๋์น. main ๋ธ๋์น์์ ๋ถ๊ธฐํ์ฌ ์์ ํ, main๊ณผ develop ๋ธ๋์น์ ๋ณํฉ
์์ ๋ธ๋์น๋ค์ ํ์ฉํ์ฌ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์ด ์ํ๋ฉ๋๋ค.
- ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ:
develop๋ธ๋์น์์ ์ ๊ธฐ๋ฅ์ ์ํดfeature๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค. ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ์๋ฃ๋๋ฉด,feature๋ธ๋์น๋ฅผdevelop๋ธ๋์น์ ๋ณํฉํฉ๋๋ค. - ๋ฆด๋ฆฌ์ค ์ค๋น: ๋ฆด๋ฆฌ์ค๋ฅผ ์ค๋นํ ๋,
develop๋ธ๋์น์์release๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค. ๋ฆด๋ฆฌ์ค ๋ธ๋์น์์๋ ํ ์คํธ ๋ฐ ๋ฒ๊ทธ ์์ ์ด ์งํ๋ฉ๋๋ค. ๋ชจ๋ ์์ ์ด ์๋ฃ๋๋ฉด,release๋ธ๋์น๋ฅผmain๊ณผdevelop๋ธ๋์น์ ๋ณํฉํ๊ณ ,main๋ธ๋์น์์ ํ๊ทธ๋ฅผ ์์ฑํฉ๋๋ค. - ๊ธด๊ธ ๋ฒ๊ทธ ์์ : ๋ฐฐํฌ๋ ๋ฒ์ ์์ ์ฌ๊ฐํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ฉด,
main๋ธ๋์น์์hotfix๋ธ๋์น๋ฅผ ์์ฑํ์ฌ ๋ฒ๊ทธ๋ฅผ ์์ ํฉ๋๋ค. ์์ ์ด ์๋ฃ๋๋ฉด,hotfix๋ธ๋์น๋ฅผmain๊ณผdevelop๋ธ๋์น์ ๋ณํฉํ๊ณ ,main๋ธ๋์น์์ ํ๊ทธ๋ฅผ ์์ฑํฉ๋๋ค.
Trunk-Based Development (TBD)
Trunk-Based Development(TBD)๋ GitFlow์๋ ๋์กฐ์ ์ผ๋ก ๋จ์ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ๋ต์
๋๋ค. ์ด ๋ฐฉ์์ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์ค์ ๋ธ๋์น(์ฃผ๋ก main ๋ธ๋์น)์ ์์ ๋จ์๋ก ์์ฃผ ๋ณํฉํ๋ ๋ฐฉ์์
๋๋ค.
- ์ค์ ๋ธ๋์น(Trunk):
main๋ธ๋์น ๋๋trunk๋ธ๋์น๊ฐ ์ ์ผํ ์ค์ ๋ธ๋์น๋ก, ๋ชจ๋ ์ฝ๋๊ฐ ์ด ๋ธ๋์น์ ๋ณํฉ๋จ - ์งง์ ์๋ช
๋ธ๋์น:
feature๋ธ๋์น๊ฐ ์กด์ฌํ ์ ์์ง๋ง, ๋งค์ฐ ์งง์ ๊ธฐ๊ฐ ๋์๋ง ์ ์ง๋๋ฉฐ, ๋น ๋ฅด๊ฒmain๋ธ๋์น์ ๋ณํฉ๋จ - ์ง์์ ํตํฉ(CI): TBD์์๋ ์ง์์ ํตํฉ(CI)์ด ํ์์ ์. ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ CI ํ์ดํ๋ผ์ธ์ ํตํด ์๋์ผ๋ก ๋น๋๋๊ณ ํ ์คํธ๋๋ฉฐ, ๋ณํฉ ์ ์ ์ฝ๋์ ์์ ์ฑ์ด ํ์ธ๋จ
TBD์์๋ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์ด ์ํ๋ฉ๋๋ค.
- ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ: ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ํด ์งง์ ์๋ช
์
feature๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค. ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ ํ, ๋น ๋ฅด๊ฒmain๋ธ๋์น์ ๋ณํฉํฉ๋๋ค. ๋ณํฉ ์, CI ํ์ดํ๋ผ์ธ์ ํตํด ์๋์ผ๋ก ๋น๋์ ํ ์คํธ๊ฐ ์ํ๋ฉ๋๋ค. - ์ง์์ ๋ณํฉ: ๋ชจ๋ ๊ฐ๋ฐ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ์์ฃผ
main๋ธ๋์น์ ๋ณํฉํฉ๋๋ค. ๋ณํฉ ์ฃผ๊ธฐ๋ ํ๋ฃจ๋ ๋ฉฐ์น ๋จ์๋ก ๋งค์ฐ ์งง์ต๋๋ค. ํฐ ๋ณ๊ฒฝ ์ฌํญ๋ ์์ ๋จ์๋ก ๋๋์ด ์ ์ง์ ์ผ๋ก ๋ณํฉํฉ๋๋ค. - ๋ฐฐํฌ:
main๋ธ๋์น๊ฐ ํญ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํ๋ฅผ ์ ์งํ๋ฏ๋ก, ํ์ํ ๋ ๋ฐ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค. ๋ฐฐํฌ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ ๊ธฐ๋ฅ ๋จ์๋ก ์ด๋ฃจ์ด์ง๋๋ค.
Concurrecny and Parallelism
- Concurrency: ๋์์ฑ์ ์ฌ๋ฌ ์์ ์ ๋์์ ์งํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋๋ ๊ฐ๋ ์ ๋๋ค. ์ค์ ๋ก๋ ํ๋์ ์์ ์ด ์กฐ๊ธ์ฉ ๊ต์ฐจํ๋ฉฐ ์คํ๋๋ ๋ฐฉ์์ผ๋ก, ์์ ์ด ์งง์ ์๊ฐ ๋์ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์คํ๋ฉ๋๋ค. ์ฆ, ๋์์ ์ฌ๋ฌ ์์ ์ ์์ํ์ง๋ง, ํน์ ์์ ์์๋ ํ๋์ ์์ ๋ง ์คํ๋๊ณ ์์ ์ ์์ต๋๋ค
- Parallelism: ๋ณ๋ ฌ์ฑ์ ์ฌ๋ฌ ์์ ์ ์ ๋ง๋ก ๋์์ ์คํํ๋ ๊ฐ๋ ์ ๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ CPU ์ฝ์ด์์ ๊ฐ๊ฐ์ ์์ ์ ๋์์ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋๋ค. ๋ณ๋ ฌ์ฑ์ ์ค์ ํ๋์จ์ด์ ์ง์์ด ํ์ํ๋ฉฐ, ์ฌ๋ฌ CPU ์ฝ์ด ๋๋ ์ฌ๋ฌ ์์คํ ์ด ๋์์ ์ผ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
Multi-Threading
๋ฉํฐ ์ค๋ ๋ฉ์ ํ๋์ ํ๋ก์ธ์ค ๋ด์์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์์ฑํ์ฌ ์์ ์ ๋์์ ์คํํ๋ ๋ฐฉ์์ ๋๋ค. GIL(Global Interpreter Lock) ๋๋ฌธ์ CPU ๋ฐ์ด๋ ์์ ์์๋ ์ฑ๋ฅ ํฅ์์ด ํฌ์ง ์์ง๋ง, I/O ๋ฐ์ด๋ ์์ ์์๋ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
import threading
import time
def task(name, delay):
for i in range(3):
time.sleep(delay)
print(f"Task {name} running")
# ์ค๋ ๋ ์์ฑ
thread1 = threading.Thread(target=task, args=("A", 1))
thread2 = threading.Thread(target=task, args=("B", 2))
# ์ค๋ ๋ ์์
thread1.start()
thread2.start()
# ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋๋ค์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆผ
thread1.join()
thread2.join()
print("All tasks completed.")
Multi-Processing
๋ฉํฐ ํ๋ก์ธ์ฑ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ๋ก ์์ ์ ์คํํ๋ ๋ฐฉ์์ ๋๋ค. ๋ฉํฐ ํ๋ก์ธ์ฑ์ CPU ๋ฐ์ด๋ ์์ ์์ ์ฑ๋ฅ ์ด์ ์ ํฌ๊ฒ ์ป์ ์ ์์ต๋๋ค.
import multiprocessing
import time
def task(name, delay):
for i in range(3):
time.sleep(delay)
print(f"Process {name} running")
if __name__ == '__main__':
# ํ๋ก์ธ์ค ์์ฑ
process1 = multiprocessing.Process(target=task, args=("A", 1))
process2 = multiprocessing.Process(target=task, args=("B", 2))
# ํ๋ก์ธ์ค ์์
process1.start()
process2.start()
# ๋ฉ์ธ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆผ
process1.join()
process2.join()
print("All processes completed.")
Multi-Threading vs. Multi-Processing
GIL๋ก ์ธํด Python์ ์ค๋ ๋๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง Python ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ I/O ๋ฐ์ด๋ ์์ , ์๋ฅผ ๋ค์ด ๋คํธ์ํฌ ์์ฒญ ์ฒ๋ฆฌ, ํ์ผ ์ ์ถ๋ ฅ ๋ฑ์ ์์ ์์๋ ๋ฉํฐ ์ค๋ ๋ฉ์ด ์ ์ฉํฉ๋๋ค. ์ด์ ๋ค๋ฅด๊ฒ ๋ฉํฐ ํ๋ก์ธ์ฑ์ GIL์ ์ ์ฝ์ ๋ฐ์ง ์๊ณ , ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ด CPU ๋ฐ์ด๋ ์์ , ์๋ฅผ ๋ค์ด ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์์ ์ ๋ฆฌํฉ๋๋ค.
Asyncio
Asyncio๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ Python์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํ ๋ฒ์ ํ๋์ ์์ ์ ์ฒ๋ฆฌํ๋ ๋์ , ์์ ์ ์ ๊น ๋ฉ์ถ๊ณ (์: I/O ๋๊ธฐ) ๊ทธ ์๊ฐ ๋์ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค. Asyncio๋ GIL์ ํฌ๊ฒ ์ํฅ์ ๋ฐ์ง ์์ผ๋ฉฐ, ์ฃผ๋ก I/O-bound ์์ ์ ์ ํฉํฉ๋๋ค. ์น ์๋ฒ, ๋คํธ์ํฌ ์๋ฒ, ๋น๋๊ธฐ ํ์ผ ์ฒ๋ฆฌ ๋ฑ์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. Asyncio๋ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋์์ ์๋ํ๋ฉฐ, ๋ง์ ์์ ์์ ์ ํจ์จ์ ์ผ๋ก ์ค์ผ์ค๋งํ์ง๋ง, CPU-bound ์์ ์์๋ Multi-Processing๋งํผ ๊ฐ๋ ฅํ์ง ์์ต๋๋ค.
Database
CoackroachDB
CockroachDB๋ ๋ถ์ฐ SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ์ํ ํ์ฅ์ฑ, ์๋ ๋ณต์ ๋ฐ ๋ณต๊ตฌ, ๊ทธ๋ฆฌ๊ณ ๊ฐํ ์ผ๊ด์ฑ(strong consistency)์ ํน์ง์ผ๋ก ํจ. ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, Cockroach์ฒ๋ผ ์ฝ๊ฒ ์ฃฝ์ง ์๋(disaster resilient) ์์คํ ์ ๋ชฉํ๋ก ๋ง๋ค์ด์ก์. Google์ Spanner์์ ์๊ฐ์ ๋ฐ์ ๊ฐ๋ฐ๋์๊ณ , Go ์ธ์ด๋ก ์์ฑ๋์์
- ๋ถ์ฐ SQL: ์ ํต์ ์ธ RDBMS์ฒ๋ผ SQL์ ์ฌ์ฉํ์ง๋ง, ๋ฐ์ดํฐ๋ ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐ๋์ด ์ ์ฅ. PostgreSQL wire protocol์ ์ฌ์ฉํด์ PostgreSQL ํด๋ผ์ด์ธํธ๋ ORM๊ณผ ํธํ
- ๊ฐํ ์ผ๊ด์ฑ: Raft consensus ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ ธ๋ ๊ฐ์ ๋ณต์ ๋ณธ(replica) ๊ฐ์ ๊ฐํ ์ผ๊ด์ฑ์ ์ ์ง. ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ชจ๋ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ด, ๋ถ์ฐ ํ๊ฒฝ์์๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅ
- ์๋ ์ค๋ฉ(Auto-Sharding): ๋ฐ์ดํฐ๋ ์๋์ผ๋ก range ๋จ์๋ก ์ชผ๊ฐ์ ธ ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐ. ํน์ range๊ฐ ์ปค์ง๋ฉด ์๋์ผ๋ก ๋ถํ
- ๋ณต์ ๋ฐ ์ฅ์ ๋ณต๊ตฌ: ๊ฐ range๋ ๊ธฐ๋ณธ์ ์ผ๋ก 3๊ฐ ์ด์์ replica๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ค์๊ฒฐ(majority)๋ก ๊ฒฐ์ . ํน์ ๋ ธ๋๊ฐ ์ฅ์ ๊ฐ ๋๋ ๋๋จธ์ง ๋ ธ๋๋ก ์๋ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅ
- Geo-Distribution ์ง์: ์ฌ๋ฌ ์ง์ญ์ ๊ฑธ์น ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๊ณ , ์ง์ญ ๊ธฐ๋ฐ ๋ ์ดํด์ ์ต์ ํ๋ ๋ฐ์ดํฐ ์ง์ญ์ฑ(geo-partitioning) ๊ธฐ๋ฅ๋ ์ ๊ณต
์์ ๊ฐ์ ํน์ง ๋๋ฌธ์ ๊ณ ๊ฐ์ฉ์ฑ๊ณผ ๋ณต์๋ ฅ์ด ์ค์ํ ์์คํ (์: ๊ธ์ต, ๊ฒ์, ํฌ์ค์ผ์ด) / ๋ฉํฐ ๋ฆฌ์ ๋๋ ๋ฉํฐ ๋ฐ์ดํฐ์ผํฐ ํ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ / ๊ธฐ์กด RDBMS์ SQL ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ๋ถ์ฐ ์์คํ ์ ์ด์ ์ ๋๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ
+----------------+
| SQL Layer | <- PostgreSQL ํธํ SQL ์ธํฐํ์ด์ค
+----------------+
+-------------------+
| Transaction Layer | <- ๋ถ์ฐ ํธ๋์ญ์
, ๊ฐํ ์ผ๊ด์ฑ (Raft + MVCC)
+-------------------+
+-----------------------+
| Distributed KV Layer | <- Range ๋ถํ , ์๋ ์ค๋ฉ, ๋ณต์ ๊ด๋ฆฌ
+-----------------------+
+----------------------+
| Storage Layer | <- RocksDB ๊ธฐ๋ฐ ๋ก์ปฌ ์คํ ๋ฆฌ์ง
+----------------------+DuckDB
OLAP(Online Analytical Processing)์ ์ต์ ํ๋ ๊ฒฝ๋ ์ปฌ๋ผ ์งํฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค. ์ฃผ๋ก ๋ถ์ ์ฟผ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์
- ์ปฌ๋ผ ์งํฅ ์ ์ฅ (Columnar Storage): ๊ฐ ์ปฌ๋ผ์ ๋ณ๋๋ก ์ ์ฅํ์ฌ, ํ์ํ ์ปฌ๋ผ๋ง ์ฝ์ ์ ์์. ๋์ฉ๋ ๋ฐ์ดํฐ์์ ๋ถ์ ์ฟผ๋ฆฌ ์๋๊ฐ ๋น ๋ฆ.
SELECT avg(salary) FROM employees๊ฐ์ ์ฟผ๋ฆฌ์ ์ ๋ฆฌ - ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค: SQLite์ฒ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ๋ฉ ๊ฐ๋ฅ (์๋ฒ ์์ด๋ ์คํ ๊ฐ๋ฅ). Python, C++, R ๋ฑ ๋ค์ํ ์ธ์ด์์ import ํด์ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- ์ธ๋ฉ๋ชจ๋ฆฌ + ๋์คํฌ ์ ์ฅ: ๋ฉ๋ชจ๋ฆฌ์์ ๋น ๋ฅด๊ฒ ์ฐ์ฐํ๋, ํ์ํ ๊ฒฝ์ฐ ๋์คํฌ์ ์ ์ฅํ๊ฑฐ๋ ์ฝ์ด์ค๋ ํ์ด๋ธ๋ฆฌ๋ ๋ชจ๋ธ
- Parquet, CSV ๋ฑ ๋ค์ํ ํฌ๋งท ์ง์: ํนํ Parquet๊ณผ์ ์ฐ๋์ด ์ข์์, ๋ฐ์ดํฐ๋ฅผ ๊ตณ์ด DuckDB๋ก importํ์ง ์๊ณ ๋ ๋ฐ๋ก ์ฟผ๋ฆฌ ๊ฐ๋ฅ
- Vectorized Execution Engine: SIMD ๋ฑ์ ํ์ฉํด ๋ค์์ ๊ฐ์ ํ ๋ฒ์ ์ฒ๋ฆฌ โ ๋งค์ฐ ๋น ๋ฅธ ์ฟผ๋ฆฌ ์ฑ๋ฅ
- ๋ฉํฐ์ค๋ ๋ ์ง์: ์ฟผ๋ฆฌ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํด์ ๋ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ
| ํน์ง | DuckDB | SQLite | Postgres | BigQuery |
|---|---|---|---|---|
| ์ ์ฅ ๊ตฌ์กฐ | Columnar | Row | Row | Columnar |
| ์คํ ์์ง | Vectorized | Row-based | Row-based | Vectorized |
| ๋ถ์ ์ฟผ๋ฆฌ ์ฑ๋ฅ | ๋งค์ฐ ๋น ๋ฆ | ๋๋ฆผ | ๋ณดํต | ๋งค์ฐ ๋น ๋ฆ |
| ์ค์น ๋ฐ ์คํ | ๋งค์ฐ ๊ฐ๋จ | ๋งค์ฐ ๊ฐ๋จ | ๋ณต์ก | ํด๋ผ์ฐ๋ |
| ์๋ฒ ํ์ | ์์ | ์์ | ์์ | ์์ |
| ๋ณ๋ ฌ ์ฒ๋ฆฌ | ์์ | ์์ | ์์ | ์์ |
Message Broker
RabbitMQ
-
์ฅ์ 1. ๋ฉ์์ง ๋ณด์ฅ: RabbitMQ๋ ๋ฉ์์ง ์ ์ก, ํ์ธ, ์ฌ์๋, TTL(Time-to-Live) ์ค์ ๋ฑ ๋ฉ์์ง ๋ณด์ฅ ๊ธฐ๋ฅ์ด ๋ฐ์ด๋จ
-
์ฅ์ 2. ํ๋ฌ๊ทธ์ธ ๋ฐ ๊ด๋ฆฌ ๋๊ตฌ: ๋ค์ํ ํ๋ฌ๊ทธ์ธ ๋ฐ ์น ๊ธฐ๋ฐ์ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ ๋ฐ ๊ด๋ฆฌ๊ฐ ํธ๋ฆฌ
-
์ฅ์ 3. ์ฑ์๋: ์ค๋๋ ํ๋ก์ ํธ๋ก, ๋ค์ํ ์ปค๋ฎค๋ํฐ ์ง์๊ณผ ์์ ์ฑ์ ์ ๊ณต
-
๋จ์ 1. ๋์ ์ง์ฐ ์๊ฐ: Kafka๋ RedisQ์ ๋นํด ์๋์ ์ผ๋ก ์ง์ฐ ์๊ฐ์ด ๋์ ์ ์์
-
๋จ์ 2. ๋ณต์ก์ฑ: ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋งํผ ์ค์ ๊ณผ ์ฌ์ฉ์ด ์๋์ ์ผ๋ก ๋ณต์กํ ์ ์์
-
๋จ์ 3. ํ์ฅ์ฑ ํ๊ณ: RabbitMQ๋ ๊ณ ๋๋ก ํ์ฅ ๊ฐ๋ฅํ ์์คํ ์ด์ง๋ง, Kafka์ ๋นํด ํ์ฅ์ฑ ๋ฉด์์ ์ ํ์ ์
Kafka
-
์ฅ์ 1. ํ์ฅ์ฑ: ๋งค์ฐ ๋ฐ์ด๋ ํ์ฅ์ฑ์ ๊ฐ์ง๊ณ ์์ด, ์๋ฐฑ ํ ๋ผ๋ฐ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์
-
์ฅ์ 2. ๊ณ ์ฑ๋ฅ: ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ต์ ํ๋์ด ์์ด, ๋์ ์ฒ๋ฆฌ๋์ ์๊ตฌํ๋ ํ๊ฒฝ์์ ํ์
-
์ฅ์ 3. ๋ด๊ตฌ์ฑ: ๋ฉ์์ง๊ฐ ๋ก๊ทธ์ ๊ธฐ๋ก๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ์ด ๋ฎ์
-
๋จ์ 1. ๋ณต์ก์ฑ: ์ด๊ธฐ ์ค์ ๊ณผ ์ด์์ด ๋ณต์กํ๋ฉฐ, ํด๋ฌ์คํฐ ๊ด๋ฆฌ๊ฐ ๊น๋ค๋ก์ธ ์ ์์
-
๋จ์ 2. ๋์ ํ์ต ๊ณก์ : Kafka๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ง์ ํ์ต๊ณผ ์ดํด๊ฐ ํ์
-
๋จ์ 3. ์ง์ฐ ํ์ฉ: ๋งค์ฐ ๋ฎ์ ์ง์ฐ์ด ํ์ํ ๊ฒฝ์ฐ RabbitMQ๋ RedisQ๊ฐ ๋ ์ ํฉํ ์ ์์
RedisQ
-
์ฅ์ 1. ์๋: RedisQ๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋น ๋ฅธ ์ฒ๋ฆฌ ์๋๋ฅผ ์ ๊ณต
-
์ฅ์ 2. ๊ฐํธ์ฑ: Redis ์์ฒด๊ฐ ๋จ์ํ๋ฉฐ, ํ๋ฅผ ์ค์ ํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ์์ด ๋งค์ฐ ๊ฐํธ
-
์ฅ์ 3. ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ: Redis๋ ํ ์ธ์๋ ์ฌ๋ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ์ฌ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์์
-
๋จ์ 1. ๋ฐ์ดํฐ ์ง์์ฑ ๋ฌธ์ : ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์์์ฑ์ด ๋ณด์ฅ๋์ง ์์ผ๋ฉฐ, ์๋ฒ๊ฐ ์ฌ์์๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง ์ ์์
-
๋จ์ 2. ํ์ฅ์ฑ ์ ํ: Redis๋ ์ํ์ ํ์ฅ์ด ์ ํ์ ์ด๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ์ปค์ง์๋ก ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์
-
๋จ์ 3. ๊ธฐ๋ฅ ์ ํ: RedisQ๋ ๋ค๋ฅธ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋นํด ๊ธฐ๋ฅ์ด ์ ํ์ ์
Summary
-
RabbitMQ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ๋ฉฐ, ์์ ์ ์ด๊ณ ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ํ๋ถํ์ง๋ง, ์๋์ ์ผ๋ก ๋ณต์กํ๊ณ ํ์ฅ์ฑ์ ์ ํ์ด ์์
-
Kafka๋ ๋์ ์ฒ๋ฆฌ๋๊ณผ ํ์ฅ์ฑ์ ํ์๋ก ํ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. ํ์ง๋ง ์ค์ ๊ณผ ์ด์์ด ๋ณต์กํ ์ ์์
-
RedisQ๋ ๋งค์ฐ ๋น ๋ฅธ ์ฑ๋ฅ๊ณผ ๋จ์ํ ์ฌ์ฉ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ฉฐ, ์์์ฑ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ถ์ ํฉํ ์ ์์
Celery
Celery๋ Python์ผ๋ก ์์ฑ๋ ๋ถ์ฐ ์์ ํ ์์คํ ์ผ๋ก, ๋๊ท๋ชจ ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋๊ตฌ์ ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ฐฑ์๋ ์์คํ ์์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ์ฌ๋ฌ ์์ ์ ๋ณ๋ ฌ๋ก ์คํํ๊ฑฐ๋, ์ง์ฐ๋ ์์ ์ ์์ฝํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- Task: Celery์์ ์คํํ ์ ์๋ ํจ์. ์ด ์์ ์ worker์ ์ํด ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋จ
- Worker: Celery์์ ์์ ์ ์ค์ ๋ก ์คํํ๋ ํ๋ก์ธ์ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ์์ปค๊ฐ ๋์์ ์๋ํ์ฌ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ
- Broker: ์์ ์ ํ์ ๋ฃ๊ณ , ์์ปค๊ฐ ์ด ํ์์ ์์ ์ ๊ฐ์ ธ๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋์. ๋ํ์ ์ธ ๋ธ๋ก์ปค๋ก๋ Redis, RabbitMQ ๋ฑ์ด ์์
- Backend: ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์คํ . Redis, RabbitMQ, Memcached, ๋๋ DB๋ฅผ ๋ฐฑ์๋๋ก ์ฌ์ฉํ ์ ์์
Monitoring
Hardware Monitoring
Prometheus๋ ์์คํ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ฒฝ๊ณ ๋ฅผ ์ํด ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์คํ ์์ค ๋๊ตฌ์ ๋๋ค. Prometheus๋ ๊ฐ ํ๊ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ฐ์ ธ์ค๋(Pull) ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๋ํ, ์์ฒด์ ์ผ๋ก ๋ค์ํ ์์คํ , ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์๋น์ค์์ ๋ฉํธ๋ฆญ์ ์์งํ๊ธฐ ์ํด Exporter๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Node Exporter๋ Prometheus์ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ Exporter ์ค ํ๋๋ก, ์๋ฒ์ ํ๋์จ์ด ๋ฐ ์ด์์ฒด์ ๊ด๋ จ ๋ฉํธ๋ฆญ์ ์์งํ๋ ์ญํ ์ ํฉ๋๋ค. Prometheus๊ฐ ์์งํ ์ ์๋ ๋ฉํธ๋ฆญ์๋ CPU ์ฌ์ฉ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๋์คํฌ I/O, ๋คํธ์ํฌ ํธ๋ํฝ ๋ฑ์ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค.
Prometheus, Node Exporter, Grafana๋ฅผ ํ์ฉํ์ฌ ํ๋์จ์ด ๋ชจ๋ํฐ๋ง์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ด๊ณณ์ ๋ ์์ธํ ๊ธฐ๋กํ์์ต๋๋ค.
Deployment
ArgoCD
ArgoCD๋ Kubernetes ํ๊ฒฝ์์ GitOps ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๋ ๋๊ตฌ์ ๋๋ค. ArgoCD๋ฅผ ์ฌ์ฉํ๋ฉด Git ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ฅ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์(Manifest)๋ฅผ ๊ธฐ์ค์ผ๋ก Kubernetes ํด๋ฌ์คํฐ์ ์๋์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ , ํด๋ฌ์คํฐ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ฉด์ Git์ ์ํ์ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋๊ธฐํํ ์ ์์ต๋๋ค.
- Application ์ค๋ธ์ ํธ: Application์ Git ๋ฆฌํฌ์งํ ๋ฆฌ์ Kubernetes ํด๋ฌ์คํฐ ๊ฐ์ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์์ ํด๋ฌ์คํฐ์ ์ ์ฉ๋ ๋ฆฌ์์ค, ๋๊ธฐํ ์ ์ฑ ๋ฑ์ ํฌํจ
- App Controller: Kubernetes ํด๋ฌ์คํฐ์ ์ํ์ Git ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง. ๋ ์ํ๊ฐ ๋ค๋ฅด๋ฉด ๋๊ธฐํ ์์ ์ ์ํํ์ฌ ํด๋ฌ์คํฐ ์ํ๋ฅผ Git ์ํ์ ์ผ์น์ํค๋ ค ํจ
- Repository Server: Git ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ๊ทผํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์ฝ์ด์ค๋ ์ญํ
- Dex: ์ธ์ฆ ์๋น์ค๋ก, ArgoCD๋ ์ธ๋ถ ์ธ์ฆ ์์คํ (Google, GitHub, LDAP ๋ฑ)๊ณผ ํตํฉํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ๊ถํ์ ๊ด๋ฆฌ
๋กค๋ฐฑ์ด ํ์ํ ๊ฒฝ์ฐ์ ArgoCD UI์์ ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ํ์ธํ๊ณ , ํน์ ํ์คํ ๋ฆฌ(๋ฐฐํฌ ์ด๋ ฅ)๋ฅผ ์ ํํ์ฌ ํด๋น ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑํ ์ ์์ต๋๋ค.
Supabase
Supabase๋ ์คํ์์ค ๋ฐฑ์๋ ์๋น์ค ํ๋ซํผ(BaaS, Backend as a Service)์ผ๋ก, Firebase์ ์คํ์์ค ๋์์ผ๋ก ์์ฃผ ์ธ๊ธ๋ฉ๋๋ค. Supabase๋ ํนํ PostgreSQL์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ๋น ๋ฅด๊ฒ ํ๋์ ์ธ ์นยท๋ชจ๋ฐ์ผ ์ฑ์ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ๋์์ค๋๋ค. ์ฃผ์ ๊ตฌ์ฑ ์์๋ ์๋์ ๊ฐ์ต๋๋ค.
- PostgreSQL: ๊ฐ๋ ฅํ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ฅ์ฑ๊ณผ ์ ํฉ์ฑ ์ ๊ณต
- Realtime: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณํ ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ์คํธ๋ฆฌ๋ฐ
- Authentication: OAuth, email/password, magic link ๋ฑ์ ํตํ ์ธ์ฆ
- Storage: ํ์ผ ์คํ ๋ฆฌ์ง (์ด๋ฏธ์ง, ๋์์ ๋ฑ) ์ง์
- Edge Functions: ์๋ฒ๋ฆฌ์ค ํจ์, Vercel์ Edge Functions์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ
- ์๋ API ์์ฑ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก RESTful + GraphQL API ์๋ ์์ฑ
Layered Architecture
์ด ๋ถ๋ถ์ ์ธํ๋ฐ ๊ฐ์ '์ ๋ฏธ๋์ ๊ฐ๋ฐ์ค๋ฌด' ๋ฌด๋ฃ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ ๋ด์ฉ์ ๋๋ค. ์งง๊ณ ์ ์ตํ ๋ด์ฉ์ด ์์ผ๋ ๋ค์ด๋ณด์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
- Presentation Layer: ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์ API๋ก ์๋ตํ๋ ์์ญ. ์ฆ, Controller์ ๊ฐ์ด API์ ๋ ธ์ถ์ ๋ด๋นํ๋ ์์ญ
- Business Layer: ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์์ญ
- Implementation Layer: ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ์ฉํ๋ ๋๋ฉ์ธ ๊ฐ์ฒด์ ์ ํธ๋ฆฌํฐ ํด๋์ค๊ฐ ํฌํจ๋ ์์ญ
- Data Access Layer: DB, ์บ์ ๋ฑ ์ธ๋ถ ๋ฐ์ดํฐ ์ ์ฅ์์ ํต์ ํ๋ ์์ญ
graph TD
A["Presentation Layer"] --> B["Business Layer"]
B --> C["Implementation Layer"]
C --> D["Data Access Layer<br>(DB, Cache, Storage)"]์ด๋ฌํ ๋ ์ด์ด๋ ์ํคํ ์ณ์์ ์ง์ผ์ผ ํ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ ์ด์ด๋ ์์์ ์๋๋ก ์๋ฐฉํฅ์ผ๋ก๋ง ์ฐธ์กฐ
- ๋ ์ด์ด์ ์ฐธ์กฐ ๋ฐฉํฅ์ด ์ญ๋ฅ๋์ง ์์
- ๋ ์ด์ด์ ์ฐธ์กฐ๊ฐ ํ์ ๋ ์ด์ด๋ฅผ ๊ฑด๋ ๋ฐ์ง ์์
- ๋์ผ ๋ ์ด์ด ๊ฐ์๋ ์๋ก ์ฐธ์กฐํ์ง ์์์ผ ํ๋ค. (๋ค๋ง implement layer๋ ์์ธ)
- ๋น์ฆ๋์ค ๋ ์ด์ด๊ฐ ์ค์ผ๋์ง ์์ผ๋ฉด์๋ ๊ตฌํ์ฑ์ ์ฌ์ฌ์ฉ์ฑ ๋์ผ ์ ์์
Domain-Driven Development
๊ด๋ จํ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ผ๋ก๋ DDD๊ฐ ์์ผ๋ฉฐ ์ด์ ๊ด๋ จํด์๋ ์นด์นด์คํ์ด ํ ํฌ ๋ธ๋ก๊ทธ์ ์ ๋์์์ผ๋ ์ฐธ๊ณ ํ์๋ฉด ์ข์ต๋๋ค.
- Layered Architecture: ์ํํธ์จ์ด๋ฅผ ์ฌ๋ฌ ์ญํ (๋ ์ด์ด, ๊ณ์ธต)๋ก ๋๋์ด ๊ฐ ๊ณ์ธต์ด ํน์ ์ฑ ์๋ง์ ๊ฐ๊ณ ๋์ํ๋๋ก ํ๋ ์ค๊ณ ํจํด
- Domain-Driven Development(DDD): '๋น์ฆ๋์ค ๋๋ฉ์ธ(ํต์ฌ์ ๋ฌด)'์ ์ง์คํ์ฌ ์ํํธ์จ์ด๋ฅผ ์ค๊ณยท๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ก
- DDD๋ Layered Architecture๋ฅผ ๊ถ์ฅํ๋ฉฐ, ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ต๋ํ ๋ช ํํ๊ฒ ์ ์ง. ์ฆ, DDD์์๋ ์ค์ ๋ก Layered Architecture ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ ์ํํธ์จ์ด๋ฅผ ์ค๊ณํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
- DDD๋ Layered Architecture๋ฅผ ์ฌ์ฉํด ๋๋ฉ์ธ(๋น์ฆ๋์ค ๊ท์น)๊ณผ ๊ธฐ์ ์ธ๋ถ์ฌํญ, ์ ์ถ๋ ฅ ๋ฑ์ ๋ช ํํ ๊ตฌ๋ถํ์ฌ, ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ก