[FastAPI] 8. ๋น๋๊ธฐ ์ฒ๋ฆฌ์์ SQLAlchemy์ scoped_session์ด ๋ฌธ์ ๊ฐ ๋๋ ์ด์
์๋์ ํฌ์คํธ์์ FastAPI๊ฐ SQLAlchemy์ ์ฐ๋ํ์์ ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด ๋ฏธํกํ๋ค๋ ๋จ์ ์ ๋ํด ์ด์ผ๊ธฐํ์๋ ์ ์ด ์์ต๋๋ค.
์ด ๋ถ๋ถ์์ ๋ค๋ฃฌ SQLAlchemy์ scoped_session์ ๋ํด ์ข ๋ ์ด์ผ๊ธฐํด๋ณด๊ณ , ์ด๋ค ๋ถ๋ถ์ด ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ํด ๋ฏธํกํ ๋ถ๋ถ์ด ์๋์ง ๋ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ด๋ค ๊ฒ๋ค์ด ์๋์ง ์ด์ผ๊ธฐํด๋ณด๊ณ ์ ํฉ๋๋ค.
scoped_session
๋จผ์ scoped_session์ SQLAlchemy์์ ๋จ์ผ์ DB Connection ํ๋๋ฅผ ์ด์ฉํด์ ์ธ์ ์ ๋ง๋ค ์ ์๋ ๋งค์ปค๋์ฆ ์ค ํ๋์ ๋๋ค. SQLAlchemy ๋ฌธ์์์ scoped_session์ ์๋์ ๊ฐ์ด ์ ์๋์ด ์์ต๋๋ค.
-> scoped_session์์ ์์ฑ๋๋ session์ ์ค๋ ๋ ๋จ์๋ก ์์ฑ์ด ๋๋ค.
ํ์ด์ฌ์ ์ค๋ ๋์ ๋ํด์ ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด, ์ค๋ ๋์ ๋ํ ๊ฐ๋ ์ ๋จผ์ ํ์ ํ๊ณ ์ค์๋๊ฑธ ์ถ์ฒํฉ๋๋ค. ๊ฐ๋จํ ์ค๋ช ๋๋ฆฌ์๋ฉด ํ์ด์ฌ์ ์ค๋ ๋๋ "๊ทธ๋ฆฐ ์ค๋ ๋" ์ ๋๋ค. ์ฌ๊ธฐ์ ๊ทธ๋ฆฐ ์ค๋ ๋๋, System-Level์ ์ค๋ ๋๊ฐ ์๋ User-Level์ ์ค๋ ๋๋ฅผ ์ด์ผ๊ธฐ ํฉ๋๋ค.
์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋์ํ๋์ง ํ ๋ฒ ์คํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ฉ์ธ ์ค๋ ๋๋ง์ ์ฌ์ฉํ์ฌ ์์ ๊ฐ์ด 10๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ฃผ๊ณ ๊ฐ์ ์ธ์ ์ ์ฃผ๊ณ ์๋์ง๋ฅผ ํ ๋ฒ ํ์ธํด๋ดค์ต๋๋ค.
๋ฌธ์๋๋ก ๊ฐ์ ์ค๋ ๋์์๋ ๊ฐ์ ์ธ์ ์ ์ฃผ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
์ด๋ฒ์๋ Thread๋ฅผ ์ง์ ๋ง๋ค์ด์ ํ ์คํธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฌธ์์ ๋์ ์๋๋๋ก ์ค๋ ๋๋ง๋ค ๋ค๋ฅธ ์ธ์ ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์์์ ์ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ์์ scoped_session์ ๋ฌธ์ ์
๊ทธ๋ ๋ค๋ฉด scoped_session์ด ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์์ด์ ์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ผ๊น์? ๊ทธ ์ด์ ๋ ๋ฐ๋ก ํ์ด์ฌ์ด ๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ ์๋ฆฌ์ ์์ต๋๋ค.
Python์์ ๋น๋๊ธฐ ์์ ์ ์ฝ๋ฃจํด(Coroutine)์ด๋ผ๊ณ ๋งํฉ๋๋ค. ์ฝ๋ฃจํด์ Python ๋ฟ๋ง ์๋๋ผ Kotlin์๋ ์กด์ฌํ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด์ง๋ง ํ์ด์ฌ์์๋ Event Loop๊ฐ ์ค์์ ์กด์ฌํ๊ณ ์ด Looper๊ฐ ์ฌ๋ฌ ์์ฒญ์ ๋ฐ์ ๋์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์์ ์ฝ๋ฃจํด ๊ทธ๋ฆผ์ ํ๋์ ์ค๋ ๋ ์ฆ, ์ฑ๊ธ ์ค๋ ๋(Single Thread)๋ก ๋์ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ง์น Node.js์ ๊ฐ์ง์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ scoped_session์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋์ ์์ฒญ์ด ๋ค์ด์์ ๋ ๋์ผํ ์ธ์ ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ ์ ๋ฌธ์ ์ผ๊น์? ํ๋์ ์ค๋ ๋์์ ์ฌ๋ฌ ๊ฐ์ง์ ์ผ์ ๋์์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋์ผํ ์ธ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๊ณ , ํด๋น ๊ฐ์ฒด์ ๋ง์ฝ Exception์ด ๋ฐ์ํ๊ฒ ๋๋ค๋ฉด ๋ค๋ฅธ ์์ฒญ์์ ์ฌ์ฉํ session ๊ฐ์ฒด์์๋ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ ์ค๋ฅ ์ ํ์ ์์ธ์ด ๋๊ธฐ๋ ํ๋ ๊ฒ์ด์ฃ .
์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ์ ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ด์ฉํ์ ๋ ๊ณต์ ๋๋ ์ธ์ ์ ์ฌ์ฉํ๋ค ํ ์ง๋๋ผ๋ SQLAlchemy์์ ์ ๊ณตํ๋ Session ๊ฐ์ฒด๋ ๋์์ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฏธํกํ ์ ๋ฐ์ ์์ผ๋ฉฐ ๋ค์ ์์ฒญ์ด ์์๋๊ธฐ ์ ์ด์ ์์ฒญ์ด ๋๋ ๋๊น์ง ์ง์ฐ๋ ์ ์๋๋ก ์ง์๋ง ํ๋ค๋ ๊ฒ์ ์์๋๊ณ ๊ฐ์๋ค.
AsyncIterable
๋จ์ํ๊ฒ ์๊ฐํด๋ด ์๋ค. ํ๋์ Connection์์ ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด ๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ธ์ ์ ๊ณต์ ํด์ ์ฌ์ฉํด๋ ๋จผ์ ๋ค์ด์จ ์์ฒญ์ด ๋๋ ๋ค์ ์ธ์ ์ ๋ซ๊ณ , ๋ค์ ์ฌํ์ฉํ์ฌ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐ ์ฒ๋ฆฌ์ ๋ํด์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํ๋์ ์์ฒญ์ด ์งํ๋๊ณ ์๋ ์ค๊ฐ์๋ ๊ณต์ ํ๊ณ ์๋ ์ธ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด์ ์์ฒญ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ๊ฐ์ฒด์์ ๋ฐ์ํ ์ค๋ฅ์ด๋ฏ๋ก ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ๋ ์์ฒญ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ Context ๋ณ๋ก ThreadLocal์ฒ๋ผ ๋ณ๋์ ์ธ์ ์ ๊ฐ์ ธ์ผํ๋๋ฐ์. FastAPI์์๋ Depends๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด ๋ณผ ์ ์์ต๋๋ค.
๋จผ์ ๊ธฐ์กด์ ์ฌ์ฉํ๋ scoped_session ์ฝ๋๋ฅผ ์ง์ฐ๊ณ , get_db_session ํจ์์์ ์ง์ Session์ ์์ฑํ๋๋ก ํฉ๋๋ค. ์ด ๋ ์์ฑํ ๋ ์ปจํ ์คํธ๊ฐ ์์ฐจ์ ์ผ๋ก ์ธ์ ์ ์์ฑํ๊ณ ์ด๋ฅผ ๋ณด๊ดํ ์ ์๋๋ก ํ์ด์ฌ์ ์ถ์ ํด๋์ค์ธ Iterable์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ฐ๋ฆฌ๋ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ธ์ ์ ๊ฐ์ ธ์ฌํ ๋ AsyncIterable์ ์ฌ์ฉํด์ค์๋ค.
Connection Resource
์ปค๋ฅ์ ์ ์ ์ญ ๋ณ์๋ก ์ฌ์ฉํ๋๋ฐ, ์ ์ญ ๋ณ์๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ฐ๊ฒฐ์ด ๋์ด์ง๋ ์์ ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ง์ ํ๋ ๋ฐ ์ด๋ ค์์ด ์๊น๋๋ค. ๋ฐ๋ผ์ FastAPI์์ ์ ๊ณตํ๋ startup, shutdown ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ ๋์์ ๋ ์ปค๋ฅ์ ์ ์ ์์ ์ผ๋ก ์ข ๋ฃํ ์ ์๋๋ก ์ฝ๋๋ฅผ ๊ฐ์ ํด์ค์๋ค.
๋จผ์ ์ปค๋ฅ์ ์ ์์ฑํ๋ ์ฝ๋, ๊ทธ๋ฆฌ๊ณ Dependency Injection์ผ๋ก ์ปค๋ฅ์ ์ ๊ฐ์ ธ์ค๋ ํจ์, ์ปค๋ฅ์ ์ ์ข ๋ฃํ๋ ํจ์ ์ด๋ ๊ฒ 3๊ฐ์ง๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฌ๊ณ ๋ ๋ค์ FastAPI์ on_event ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ง๋ค๊ณ ํด๋น ํจ์์ ์์์ ์์ฑํ ํจ์๋ฅผ ๋ฃ์ด์ฃผ๋๋ก ํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋ฉด์ ์์ ํ๊ฒ ์ปค๋ฅ์ ์ ๋ซ์ ์ ์๊ณ , ํ๋์ ์ปค๋ฅ์ ์ผ๋ก ๊ฐ์ ์ธ์ ์ ๊ณต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ ์์ฒญ์์ ํธ๋์ญ์ ์ค๋ฅ ๋ฑ์ด ๋ฐ์ํด๋ ๋ค๋ฅธ ์์ฒญ์ ์ํฅ์ ์ฃผ์ง ์๊ฒ ๋ฉ๋๋ค.
๋ง์น๋ฉฐ..
scoped_session์ ๋ฌธ์ ์ ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ดํด๋ดค์ต๋๋ค. FastAPI๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ธ์๋ ์ฌ๋ฌ๋ฐฉ๋ฉด์ด ์กด์ฌํ์ง๋ง ๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ ์ ์ฅ์์ ์๋ฒฝํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์ด๋ ต๋ค ํ๋๋ผ๋ ์ด๋ฅผ ์ด์ฉํ๋ ์๊ฐ์ ์น๋ช ์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋ ๋ฐ๋์ ๊ณ ์ณ์ผ ํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๊ณ ํ์ฌ SQLAlchemy์์ DB ์ฒ๋ฆฌ์ ๋์์ ์ฒ๋ฆฌ๋ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ๋จ์ง ๊ณต์ ๋ ์ธ์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ณต์ ํ๋ ์ธ์ ์ฌ์ด ๋ ๊ฐ์ ์์ฒญ ์ค ํ๋์ ์์ฒญ์ด๋ผ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋ฌธ์ ๊ฐ ์๋ ๋ค๋ฅธ ์์ฒญ์๋ ๊ฐ์ ์ํฅ์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ๋ฑ์ด ์ด๋ ค์์ง๋ ๋ฌธ์ ์ ์ ์ด๋ํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํ ์๋จ์ผ ๋ฟ์ ๋๋ค.
๋ค์ ํฌ์คํธ์์๋ asyncpg ๋ฑ์ ํ์ฉํ์ฌ Persistence Layer์์ ๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.