[FastAPI] 8. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ SQLAlchemy์˜ scoped_session์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ 

๋ฐ˜์‘ํ˜•

์•„๋ž˜์˜ ํฌ์ŠคํŠธ์—์„œ FastAPI๊ฐ€ SQLAlchemy์™€ ์—ฐ๋™ํ•˜์˜€์„ ๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ฏธํกํ•˜๋‹ค๋Š” ๋‹จ์ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์—ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

2020.12.27 - [Programming/Python] - [FastAPI] 2. SQLAlchemy๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ CRUD API ๋งŒ๋“ค๊ธฐ

 

[FastAPI] 2. SQLAlchemy๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ CRUD API ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ORM์— ๋Œ€ํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ORM์€ Object Relation Mapping์˜ ์•ฝ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Entity์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ

blog.neonkid.xyz

์ด ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃฌ 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์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์ฐธ๊ณ : https://github.com/tiangolo/fastapi/issues/726

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments