๋ฐ์ํ
asyncio
asyncio๋ Python์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด๋ฒคํธ ๋ฃจํ์ ์ฝ๋ฃจํด์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ์ญํ ์ ํ๋ค.
- ๋น๋๊ธฐ ์ฝ๋ ๊ด๋ฆฌ: asyncio๋ ๋น๋๊ธฐ ์์ ์ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ณ ์ค์ผ์ค๋ง์ด ๊ฐ๋ฅ.
- ์ด๋ฒคํธ ๋ฃจํ: asyncio์ ํต์ฌ ์์๋ ์ด๋ฒคํธ ๋ฃจํ๋ก, ๋น๋๊ธฐ ์์ ์ ์ค์ผ์ค๋ง๊ณผ ์คํ์ ๊ด๋ฆฌํ๋ฉฐ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ฐ๋ณต๋๋ฉด์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌ.
- ์ฝ๋ฃจํด ์ง์: asyncio๋ ์ฝ๋ฃจํด์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ ์ํ๊ณ ์คํ ๊ฐ๋ฅ. async def๋ก ์ ์๋ ์ฝ๋ฃจํด ํจ์๋ await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๊ณ ์์ ์ ์ผ์ ์ค๋จ์ํฌ ์ ์์.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ: asyncio๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์. ์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ์ฐ๊ฒฐ, ์์ผ ํต์ , ํค๋ณด๋ ๋ฐ ๋ง์ฐ์ค ์ ๋ ฅ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์.
- ๋ณ๋ ฌ์ฑ๊ณผ ๋์์ฑ: asyncio๋ฅผ ํตํด ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ณ๋ ฌ๋ก ์คํํ ์ ์์. ์ด๋ I/O ์ค์ฌ์ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์๋ต์ฑ์ ํฅ์์ํค๋ ๋ฐ ์ ์ฉ.
- ๋น๋๊ธฐ ์ ์ถ๋ ฅ(IO): asyncio๋ ๋น๋๊ธฐ ์ ์ถ๋ ฅ์ ์ง์ํ๋ฉฐ ํ์ผ ์ ์ถ๋ ฅ, ๋คํธ์ํฌ ํต์ ๋ฐ ๋ค๋ฅธ I/O ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
asyncpg
asyncpg๋ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๊ธฐ ์ํ ๋น๋๊ธฐ Python ๋๋ผ์ด๋ฒ๋ก, ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ค๋ค.
- ๋น๋๊ธฐ ์ง์: asyncpg๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ์ค๊ณ๋์ด, ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ, ์ ๋ฐ์ดํธ ๋ฐ ํธ๋์ญ์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์.
- PostgreSQL๊ณผ์ ํตํฉ: asyncpg๋ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํํ๊ฒ ํตํฉ๋์ด PostgreSQL์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ํ์ฉํ๊ฑฐ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์.
- ํธ๋์ญ์ ๊ด๋ฆฌ: asyncpg๋ ํธ๋์ญ์ ์ ์ง์ํ์ฌ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์์์ ์ผ๋ก ์คํํ๊ณ ๋กค๋ฐฑํ ์ ์์.
- ์ปค๋ฅ์ ํ๋ง: asyncpg๋ ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋ฉฐ ๋์ ๋์์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋์์ ์ค. (๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ฌ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ)
์ฝ๋ ์์
import asyncio
import asyncpg
async def main():
# PostgreSQL ์ฐ๊ฒฐ ์ค์ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ ์์ฑ
pool = await asyncpg.create_pool(
host="...",
port=...,
user="...",
password="...",
database="..."
)
try:
# ํ์์ ์ฐ๊ฒฐ์ ๊ฐ์ ธ์ด
async with pool.acquire() as conn:
# ํธ๋์ญ์
์์
async with conn.transaction():
# ์ฌ๊ธฐ์ ๋น๋๊ธฐ๋ก ์คํํ๋ ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ์ถ๊ฐํฉ๋๋ค.
# ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๊ฑฐ๋ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
# ์ฟผ๋ฆฌ ์คํ ์์:
result = await conn.fetch("SELECT * FROM my_table")
for row in result:
print(row)
# ์
๋ฐ์ดํธ ์์:
await conn.execute("UPDATE my_table SET column1 = $1 WHERE column2 = $2", new_value, some_condition)
except asyncpg.exceptions.PostgresError as e:
# ์๋ฌ ์ฒ๋ฆฌ
print(f"PostgreSQL ์๋ฌ: {e}")
finally:
# ํ ๋ซ๊ธฐ
await pool.close()
if __name__ == "__main__":
asyncio.run(main())
- asyncpg ๋ก postgresql DB ์ฐ๊ฒฐ pool์ ๋ง๋ค์ด ํธ๋์ญ์ ์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ
- API ์ค๊ณ์ API ํธ์ถํ ๋ DB์ ํธ๋์ญ์ ์ ํ๋ ๊ฒฝ์ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์
๋ฐ์ํ