๊ฐ์ธ ํฌํธํด๋ฆฌ์ค์ฉ ์ ๋ฆฌ > ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2026.01.20 ~ 2026.01.23 (4์ผ)
์ฃผ์ ์ญํ : ๋ฐฑ์๋ ์ธํ๋ผ ๊ตฌ์ถ, ์ธ์ฆ ์์คํ ๊ตฌํ, ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํฌ๋ํ ์์ง ๊ฐ๋ฐ
J2S2๋ ์ฌ์ฉ์์ ์ผ์์ ๊ธฐ๋กํ๋ ์ผ๊ธฐ, ์์ ์ฑ์ฐฐ์ ๋๋ ์ง๋ฌธ, ๊ทธ๋ฆฌ๊ณ ์ธ๋ถ ์ค์๊ฐ ์์ง ๊ธฐ๋ฐ์ ๋ช ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ฌ๋ฆฌ ์ผ์ด ํ๋ซํผ์ ๋๋ค. ์งง์ ๊ธฐ๊ฐ ๋ด์ ๋น๋๊ธฐ ์ํคํ ์ฒ๋ฅผ ํ์ฉํ์ฌ ์์ ์ ์ธ ๋ฐ์ดํฐ ์์ง ๋ฐ ์ธ์ฆ ์์คํ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ต๋๋ค.
python-jose๋ฅผ ํ์ฉํ JSON Web Token ๋ฐํ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฆ ๋ก์ง ๊ตฌํ.Passlib์ PBKDF2-SHA256 ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ๋ณด์์ฑ ๊ฐํ.OAuth2PasswordBearer์ Dependency Injection์ ํตํ ์ค์ ์ง์ค์ ์ ์ ๊ถํ ๊ด๋ฆฌ.HTTPX์ BeautifulSoup4๋ฅผ ์ด์ฉํด ์ธ๋ถ ์ฌ์ดํธ(saramro.com)์์ ๋๋์ ๋ช
์ธ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ๋ ์์ง ๊ฐ๋ฐ.get_or_create ๋ฐฉ์์ผ๋ก ์บ์ฑํ์ฌ API ์๋ต ์๋ ์ต์ ํ.offset ์ฐ์ฐ์ ํ์ฉํด ํจ์จ์ ์ธ ๋๋ค ๋ช
์ธ/์ง๋ฌธ ์ถ์ถ ๋ก์ง ๊ตฌํ.prefetch_related๋ฅผ ์ ์ฉํ์ฌ ์ฐ๊ด ๊ด๊ณ ๋ฐ์ดํฐ๋ฅผ ๋จ์ผ ์ฟผ๋ฆฌ๋ก ์กฐํ(N+1 ๋ฌธ์ ํด๊ฒฐ).๋ณธ ํ๋ก์ ํธ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ต์ ํ๋ Layered Architecture๋ฅผ ์ฑํํ์ต๋๋ค.
```text app/ โโโ core/ # JWT ์ค์ , ์ํธํ ๋ณด์, ํ๊ฒฝ ๋ณ์ (๋ด๋น) โโโ db/ # DB ์ฐ๊ฒฐ ๋ฐ ์ด๊ธฐํ (๋ด๋น) โโโ models/ # DB ํ ์ด๋ธ ์คํค๋ง ์ ์ (๋ด๋น) โโโ repositories/ # ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต (๋ด๋น - ๋ถ๋งํฌ, ๋๋ค ์กฐํ ๋ฑ) โโโ routers/ # API ์๋ํฌ์ธํธ ์ ์ โโโ schemas/ # Pydantic ๋ฐ์ดํฐ ๋ชจ๋ธ (DTO) โโโ services/ # ๋ช ์ธ ์คํฌ๋ํ ๋น์ฆ๋์ค ๋ ์ด์ด (๋ด๋น) โโโ templates/ # HTML ํ ํ๋ฆฟ