<aside>

</aside>

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

์ง€๋‚œ 24๊ฐ•๊ณผ 25๊ฐ•์—์„œ๋Š” Alembic์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ , ์ฒซ ๋ฒˆ์งธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด tasks ํ…Œ์ด๋ธ”์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๊ฐ–์ถ”์—ˆ์ฃ !

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์—ฌ๊ธฐ์„œ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์‹ค์ œ๋กœ ์ง„ํ™”์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๊ฒฝํ—˜ํ•ด ๋ด…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ToDo ๋ฆฌ์ŠคํŠธ์— ์‚ฌ์šฉ์ž(User) ๊ฐœ๋…์„ ๋„์ž…ํ•˜์—ฌ, ์–ด๋–ค ํ•  ์ผ์ด ์–ด๋–ค ์‚ฌ์šฉ์ž์—๊ฒŒ ์†ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” **๊ด€๊ณ„(Relationship)**๋ฅผ ์„ค์ •ํ•ด ๋ณผ ๊ฑฐ์˜ˆ์š”.

์ด๋ฅผ ์œ„ํ•ด ์ƒˆ๋กœ์šด User SQLAlchemy ๋ชจ๋ธ์„ ์ •์˜ํ•˜๊ณ , ๊ธฐ์กด Task ๋ชจ๋ธ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋‘ ๋ชจ๋ธ ๊ฐ„์˜ 1:N (One-to-Many) ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ForeignKey ์ œ์•ฝ ์กฐ๊ฑด๊ณผ SQLAlchemy์˜ relationship ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋Š”์ง€ ๋ฐฐ์šฐ๊ณ , ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋œ ๋ชจ๋ธ ๊ตฌ์กฐ๋ฅผ Alembic์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ฐœ์ „์‹œํ‚ค๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ์‹ค์ œ ํ™œ์šฉ๋ฒ•์„ ์ตํ˜€๋ด…์‹œ๋‹ค! ๐Ÿ‘ฅ๐Ÿ”—๐Ÿ”„


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

์ด๋ฒˆ 26๊ฐ•์—์„œ๋Š” SQLAlchemy ORM ๋ชจ๋ธ ๊ฐ„์˜ **๊ด€๊ณ„(Relationship)**๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๋ชจ๋ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Alembic ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ด์ „ ๊ฐ•์˜์—์„œ ๋งŒ๋“  Task ๋ชจ๋ธ์— ๋”ํ•ด, ์ƒˆ๋กœ์šด User ๋ชจ๋ธ์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์ ์œผ๋กœ, 'ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•  ์ผ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค(One-to-Many)'๋Š” ๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Task ๋ชจ๋ธ์— ์‚ฌ์šฉ์ž๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ ํ‚ค(Foreign Key) ์ปฌ๋Ÿผ(owner_id)์„ ์ถ”๊ฐ€ํ•˜๊ณ , SQLAlchemy์˜ relationship ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ชจ๋ธ(User์™€ Task)์ด ORM ๋ ˆ๋ฒจ์—์„œ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„ ์„ค์ •์„ ์œ„ํ•œ back_populates ์ธ์ž์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ๋‹ค์‹œ Alembic์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑ(alembic revision --autogenerate)ํ•œ ํ›„, ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉ(alembic upgrade head)ํ•˜์—ฌ ์‹ค์ œ users ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  tasks ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง„ํ™”์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ Alembic์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์‹ค์งˆ์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ตํž™๋‹ˆ๋‹ค.


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

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

  1. ์ƒˆ๋กœ์šด User SQLAlchemy ORM ๋ชจ๋ธ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ForeignKey ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. SQLAlchemy์˜ relationship ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ„์˜ ๊ฐ์ฒด ๊ด€๊ณ„(์˜ˆ: 1:N)๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. relationship์˜ back_populates ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  5. ๋ณ€๊ฒฝ๋œ ๋ชจ๋ธ ๊ตฌ์กฐ(์ƒˆ ํ…Œ์ด๋ธ”, ์ƒˆ ์ปฌ๋Ÿผ, ๊ด€๊ณ„ ์ถ”๊ฐ€)๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ์ƒˆ๋กœ์šด Alembic ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ -autogenerate ์˜ต์…˜์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ์ƒ์„ฑ๋œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ alembic upgrade head ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.