<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%8B%A4%EC%A4%91DB_%2B_%EC%BB%A4%EB%84%A5%EC%85%98%ED%92%80%EC%BA%90%EC%8B%9C_%2B_%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0</id>
	<title>다중DB + 커넥션풀캐시 + 데코레이터 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%8B%A4%EC%A4%91DB_%2B_%EC%BB%A4%EB%84%A5%EC%85%98%ED%92%80%EC%BA%90%EC%8B%9C_%2B_%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%EB%8B%A4%EC%A4%91DB_%2B_%EC%BB%A4%EB%84%A5%EC%85%98%ED%92%80%EC%BA%90%EC%8B%9C_%2B_%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0&amp;action=history"/>
	<updated>2026-05-17T22:00:12Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%EB%8B%A4%EC%A4%91DB_%2B_%EC%BB%A4%EB%84%A5%EC%85%98%ED%92%80%EC%BA%90%EC%8B%9C_%2B_%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0&amp;diff=1707&amp;oldid=prev</id>
		<title>Devcafe: 새 문서: == 다중DB 비동기커넥션풀캐시 데코레이터 == * 여러 DB 선택 처리를 지원하도록 비동기 커넥션 풀 구조 * 다수의 DB가 db_config.json에 정의 * 데코레이터에서 DB 이름만 바꾸면 자동으로 해당 DB에 접속되도록 구현  === db_config.json 예시 (여러 DB) === &lt;source lang=js&gt; {   &quot;Database&quot;: [     {       &quot;Name&quot;: &quot;MyDB1&quot;,       &quot;Username&quot;: &quot;user1&quot;,       &quot;Password&quot;: &quot;pass1&quot;,       &quot;Host&quot;: &quot;localhost&quot;,       &quot;Port&quot;: 1521,...</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%EB%8B%A4%EC%A4%91DB_%2B_%EC%BB%A4%EB%84%A5%EC%85%98%ED%92%80%EC%BA%90%EC%8B%9C_%2B_%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0&amp;diff=1707&amp;oldid=prev"/>
		<updated>2025-06-16T23:35:39Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == 다중DB 비동기커넥션풀캐시 데코레이터 == * 여러 DB 선택 처리를 지원하도록 비동기 커넥션 풀 구조 * 다수의 DB가 db_config.json에 정의 * 데코레이터에서 DB 이름만 바꾸면 자동으로 해당 DB에 접속되도록 구현  === db_config.json 예시 (여러 DB) === &amp;lt;source lang=js&amp;gt; {   &amp;quot;Database&amp;quot;: [     {       &amp;quot;Name&amp;quot;: &amp;quot;MyDB1&amp;quot;,       &amp;quot;Username&amp;quot;: &amp;quot;user1&amp;quot;,       &amp;quot;Password&amp;quot;: &amp;quot;pass1&amp;quot;,       &amp;quot;Host&amp;quot;: &amp;quot;localhost&amp;quot;,       &amp;quot;Port&amp;quot;: 1521,...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 다중DB 비동기커넥션풀캐시 데코레이터 ==&lt;br /&gt;
* 여러 DB 선택 처리를 지원하도록 비동기 커넥션 풀 구조&lt;br /&gt;
* 다수의 DB가 db_config.json에 정의&lt;br /&gt;
* 데코레이터에서 DB 이름만 바꾸면 자동으로 해당 DB에 접속되도록 구현&lt;br /&gt;
&lt;br /&gt;
=== db_config.json 예시 (여러 DB) ===&lt;br /&gt;
&amp;lt;source lang=js&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Database&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;Name&amp;quot;: &amp;quot;MyDB1&amp;quot;,&lt;br /&gt;
      &amp;quot;Username&amp;quot;: &amp;quot;user1&amp;quot;,&lt;br /&gt;
      &amp;quot;Password&amp;quot;: &amp;quot;pass1&amp;quot;,&lt;br /&gt;
      &amp;quot;Host&amp;quot;: &amp;quot;localhost&amp;quot;,&lt;br /&gt;
      &amp;quot;Port&amp;quot;: 1521,&lt;br /&gt;
      &amp;quot;ServiceName&amp;quot;: &amp;quot;orclpdb1&amp;quot;,&lt;br /&gt;
      &amp;quot;Min&amp;quot;: 2,&lt;br /&gt;
      &amp;quot;Max&amp;quot;: 5,&lt;br /&gt;
      &amp;quot;Increment&amp;quot;: 1&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;Name&amp;quot;: &amp;quot;MyDB2&amp;quot;,&lt;br /&gt;
      &amp;quot;Username&amp;quot;: &amp;quot;user2&amp;quot;,&lt;br /&gt;
      &amp;quot;Password&amp;quot;: &amp;quot;pass2&amp;quot;,&lt;br /&gt;
      &amp;quot;Host&amp;quot;: &amp;quot;remotehost&amp;quot;,&lt;br /&gt;
      &amp;quot;Port&amp;quot;: 1521,&lt;br /&gt;
      &amp;quot;ServiceName&amp;quot;: &amp;quot;orclpdb2&amp;quot;,&lt;br /&gt;
      &amp;quot;Min&amp;quot;: 1,&lt;br /&gt;
      &amp;quot;Max&amp;quot;: 3,&lt;br /&gt;
      &amp;quot;Increment&amp;quot;: 1&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 여러 DB 자동 선택 + 커넥션 풀 캐시 + 데코레이터 ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import oracledb&lt;br /&gt;
import asyncio&lt;br /&gt;
import json&lt;br /&gt;
from functools import wraps&lt;br /&gt;
&lt;br /&gt;
# 전역 커넥션 풀 저장소&lt;br /&gt;
connection_pools = {}&lt;br /&gt;
&lt;br /&gt;
# DB 설정 불러오기&lt;br /&gt;
def load_db_config(name):&lt;br /&gt;
    with open(&amp;quot;db_config.json&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        config = json.load(f)&lt;br /&gt;
    for db in config[&amp;quot;Database&amp;quot;]:&lt;br /&gt;
        if db[&amp;quot;Name&amp;quot;] == name:&lt;br /&gt;
            return db&lt;br /&gt;
    raise ValueError(f&amp;quot;No DB config found for name: {name}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# DB 이름 기반 커넥션 풀 초기화&lt;br /&gt;
async def init_connection_pool(name):&lt;br /&gt;
    if name in connection_pools:&lt;br /&gt;
        return connection_pools[name]&lt;br /&gt;
&lt;br /&gt;
    cfg = load_db_config(name)&lt;br /&gt;
&lt;br /&gt;
    pool = await oracledb.create_pool(&lt;br /&gt;
        user=cfg[&amp;quot;Username&amp;quot;],&lt;br /&gt;
        password=cfg[&amp;quot;Password&amp;quot;],&lt;br /&gt;
        host=cfg[&amp;quot;Host&amp;quot;],&lt;br /&gt;
        port=cfg[&amp;quot;Port&amp;quot;],&lt;br /&gt;
        service_name=cfg[&amp;quot;ServiceName&amp;quot;],&lt;br /&gt;
        min=cfg[&amp;quot;Min&amp;quot;],&lt;br /&gt;
        max=cfg[&amp;quot;Max&amp;quot;],&lt;br /&gt;
        increment=cfg[&amp;quot;Increment&amp;quot;],&lt;br /&gt;
        getmode=oracledb.SPOOL_ATTRVAL_WAIT,&lt;br /&gt;
        timeout=10&lt;br /&gt;
    )&lt;br /&gt;
    connection_pools[name] = pool&lt;br /&gt;
    return pool&lt;br /&gt;
&lt;br /&gt;
# 비동기 데코레이터 - DB 선택 가능&lt;br /&gt;
def with_async_connection(db_name):&lt;br /&gt;
    def decorator(func):&lt;br /&gt;
        @wraps(func)&lt;br /&gt;
        async def wrapper(*args, **kwargs):&lt;br /&gt;
            pool = await init_connection_pool(db_name)&lt;br /&gt;
            async with pool.acquire() as conn:&lt;br /&gt;
                async with conn.cursor() as cursor:&lt;br /&gt;
                    return await func(cursor, *args, **kwargs)&lt;br /&gt;
        return wrapper&lt;br /&gt;
    return decorator&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 사용 예시: DB별 쿼리 ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
@with_async_connection(&amp;quot;MyDB1&amp;quot;)&lt;br /&gt;
async def get_users_from_db1(cursor):&lt;br /&gt;
    await cursor.execute(&amp;quot;SELECT * FROM users&amp;quot;)&lt;br /&gt;
    return await cursor.fetchall()&lt;br /&gt;
&lt;br /&gt;
@with_async_connection(&amp;quot;MyDB2&amp;quot;)&lt;br /&gt;
async def get_products_from_db2(cursor):&lt;br /&gt;
    await cursor.execute(&amp;quot;SELECT * FROM products&amp;quot;)&lt;br /&gt;
    return await cursor.fetchall()&lt;br /&gt;
&lt;br /&gt;
async def main():&lt;br /&gt;
    users = await get_users_from_db1()&lt;br /&gt;
    products = await get_products_from_db2()&lt;br /&gt;
    print(&amp;quot;Users:&amp;quot;, users)&lt;br /&gt;
    print(&amp;quot;Products:&amp;quot;, products)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    asyncio.run(main())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{요약&lt;br /&gt;
|내용=기능설명&lt;br /&gt;
# 다중 DB 설정&lt;br /&gt;
# JSON 파일에서 DB별로 설정&lt;br /&gt;
# DB 이름에 따라 자동 연결&lt;br /&gt;
# @with_async_connection(&amp;quot;MyDB1&amp;quot;) 방식&lt;br /&gt;
# 커넥션 풀 재사용&lt;br /&gt;
## 이미 만들어진 풀은 재사용 (성능 최적화)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* 추가기능&lt;br /&gt;
** [[@with_async_connection(db_name_func()) → 런타임에 동적으로 DB 선택]]&lt;br /&gt;
&lt;br /&gt;
[[category:python]]&lt;/div&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
</feed>