<aside>

</aside>

์•ˆ๋…•ํ•˜์„ธ์š”! ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 5๋ถ€์˜ ๋„ค ๋ฒˆ์งธ ์‹œ๊ฐ„, 25๊ฐ•์ž…๋‹ˆ๋‹ค! ๐Ÿ”ง

์ง€๋‚œ 24๊ฐ•์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ์„ ๋А๋ผ๊ณ , SQLAlchemy๋ฅผ ์œ„ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„๊ตฌ์ธ Alembic์„ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์†Œ๊ฐœํ•˜๋ฉฐ ์ดˆ๊ธฐ ํ™˜๊ฒฝ ์„ค์ •(alembic init)๊นŒ์ง€ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ”„๋กœ์ ํŠธ ํด๋”์—๋Š” alembic.ini ํŒŒ์ผ๊ณผ alembic/ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ๊ฒผ์ฃ !

ํ•˜์ง€๋งŒ ์•„์ง Alembic์ด ์šฐ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ SQLAlchemy ๋ชจ๋ธ(Task)์„ ์ธ์‹ํ•˜๋„๋ก ์„ค์ •์„ ์™„๋ฃŒํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Alembic ์„ค์ • ํŒŒ์ผ๋“ค(alembic.ini, env.py)์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋“œ๋””์–ด! ์„ค์ •๋œ Alembic ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์šฐ๋ฆฌ๊ฐ€ 21๊ฐ•์—์„œ ์ •์˜ํ–ˆ๋˜ Task ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜์—ฌ tasks ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ณผ์ •์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด ๋ณผ ๊ฑฐ์˜ˆ์š”! โœจ

์ž, ์ด์ œ Alembic ์„ค์ •์„ ์™„๋ฃŒํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฒซ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค!


๐Ÿ“š ์ฑ•ํ„ฐ ์†Œ๊ฐœ

์ด๋ฒˆ 25๊ฐ•์—์„œ๋Š” 24๊ฐ•์—์„œ ์ดˆ๊ธฐํ™”ํ•œ Alembic ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์„ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋จผ์ €, alembic.ini ์„ค์ • ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ URL์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ, ํ•ต์‹ฌ ์„ค์ • ํŒŒ์ผ์ธ alembic/env.py๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ Alembic์ด ์šฐ๋ฆฌ์˜ **SQLAlchemy ๋ชจ๋ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(Base.metadata)**๋ฅผ ์ธ์‹ํ•˜๊ณ , FastAPI์˜ ๋น„๋™๊ธฐ(async) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™˜๊ฒฝ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด, alembic revision --autogenerate ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ •์˜๋œ SQLAlchemy ๋ชจ๋ธ(Task) ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ (์ฆ‰, tasks ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ)๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ์˜ ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ alembic upgrade head ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•จ์œผ๋กœ์จ tasks ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽฏ ์ฑ•ํ„ฐ ๋ชฉํ‘œ

์ด ๊ฐ•์˜๋ฅผ ๋งˆ์น˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

  1. alembic.ini ํŒŒ์ผ์— **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ URL(sqlalchemy.url)**์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. alembic/env.py ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ SQLAlchemy **๋ชจ๋ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(Base.metadata)**๋ฅผ Alembic์— ์ธ์‹์‹œํ‚ค๊ณ , ๋น„๋™๊ธฐ(async) ํ™˜๊ฒฝ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. alembic revision --autogenerate ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ƒ์„ฑ๋œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ(upgrade, downgrade ํ•จ์ˆ˜)๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  5. alembic upgrade head ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜๊ณ  ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—๏ธ ์ด๋ฒˆ ๊ฐ•์˜์˜ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ์ฃผ์š” ๋ณ€๊ฒฝ ํŒŒ์ผ