๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/Database

[PostgreSQL/Python] DB ํŠธ๋žœ์žญ์…˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ | asyncio, asyncpg | ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€ ๋งŒ๋“ค๊ธฐ

by ๋ญ…์ฆค 2023. 11. 3.
๋ฐ˜์‘ํ˜•

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์— ํŠธ๋žœ์žญ์…˜์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜

 

๋ฐ˜์‘ํ˜•