Entity Framework Core Thread Safe ๊ด€๋ จ ๋ฌธ์˜

ASP.NET Core๋กœ ์ž‘์„ฑํ•œ ์•ฑ์—์„œ DB์™€ ๊ด€๋ จํ•˜์—ฌ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ๋Š” AddDbContext๋กœ ๋“ฑ๋กํ•˜๊ณ  DI๋กœ DbContext๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฒŒ Multi Thread์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ Entity Framework์˜ Multi Thread์™€ ๊ด€๋ จํ•˜์—ฌ ๋ช‡๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋‚˜์˜ค๋˜๋ฐ์š”.
์–ด๋А ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ์ข‹์„์ง€ ๊ฐ์ด ์•ˆ์™€์„œ ๋ฌธ์˜ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ฐพ์•„๋ณธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. DI๋กœ IServiceProvider๋ฅผ ๊ฐ€์ ธ์™€์„œ serviceProvider.GetRequiredService() ๋กœ DbContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. DI๋กœ IServiceScopeFactory๋ฅผ ๊ฐ€์ ธ์™€์„œ serviceScoperFactory.CreateScope().ServiceProvider.GetRequiredService() ๋กœ DbContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  3. DI๋กœ DbContextOptions๋ฅผ ๊ฐ€์ ธ์™€์„œ new MyContext(dbContextOptions) ์œผ๋กœ DbContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  4. AddDbContext๋ฅผ AddDbContextPool๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด ์ค‘ ์–ด๋А ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ์‰ฌ์šด ๋ฐฉ๋ฒ•์ผ๊นŒ์š”? ์ด ์™ธ์— ๋‹ค๋ฅธ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ์š”?

4๊ฐœ์˜ ์ข‹์•„์š”

์ „ EF๋ฅผ ์•ˆ์จ๋ด์„œ ๋‹ต๋ณ€์ด ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ

DB ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์“ธ๋•Œ๋Š” Half-Sync / Half-ASync ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

POSA์— ๋‚˜์˜ค๋Š” ํŒจํ„ด์ด๊ณ 

๊ฐ„๋žตํžˆ ์„ค๋ช… ๋“œ๋ฆฌ๋ฉด

Job์„ Queue์— ๋„ฃ์–ด ๋‘๊ณ 
Work Thread์—์„œ ๋นผ์„œ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

ํ˜น์‹œ ASP.NET์˜ ์–ด๋–ค ์›Œํฌ๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ค๊นŒ์š”?
MVC์™€ Blazor๊ฐ€ DBContext๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๊ตฌ์„ฑ์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ์„œ์š”.

2๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

MVC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•œ CRUD ๋ผ๋ฉด MVC ์—์„œ๋Š” ํฌ๊ฒŒ ๋ฌธ์ œ๋  ๋ถ€๋ถ„์ด ์—†์„ํ…๋ฐ์š”.

ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฝ”๋“œ์™€ ๋ฉ”์‹œ์ง€ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”?

4๊ฐœ์˜ ์ข‹์•„์š”

์—ฌ๋Ÿฌ๊ฐœ์˜ BackgroundService์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ Update ๋ฐ Insert๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Web API๋กœ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ Update ๋ฐ Insert๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
DB๋Š” Startup์—์„œ AddDbContext๋กœ ๋“ฑ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐ BackgroundService ๋ฐ Web API์šฉ Controller์˜ ์ƒ์„ฑ์ž์—์„œ DI๋กœ DbContext๋ฅผ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Update๋Š” Updateํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ Update๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ SaveChangesAsync๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
Insert๋„ Insertํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ AddAsync๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ SaveChangesAsync๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒŒ ํ‰์†Œ์—๋Š” ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ•˜๋Š”๋ฐ ํ•œ๋‹ฌ์— 1~2๋ฒˆ ๋นˆ๋„๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ข…๋ฅ˜๋„ ๋‹ค์–‘ํ•œ๋ฐ ์ฃผ๋กœ InvalidOperationException์ด ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ฅ˜๋Š” ์–ด๋–ป๊ฒŒ๋“  ๋Œ๋ ค ๋ง‰๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ์š”โ€ฆ ํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ DbContext๋ฅผ Multi Thread์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ•ด์ ธ์„œ ์ฐพ๋‹ค๊ฐ€ ๊ถ๊ธˆ์ฆ์ด ํ•ด์†Œ๋˜์ง€ ์•Š์•„ ์งˆ๋ฌธ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด๋ผ๋ฉด ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•˜๋Š”๋ฐ์š”, ์™œ๋ƒํ•˜๋ฉด ๋‹จ์ผ DbContext ์ธ์Šคํ„ด์Šค๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ์ ‘๊ทผํ•ด์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

AddDbContext๋กœ DI๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์Šค๋ ˆ๋“œ๋ณ„ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณด์žฅ ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”?

4๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ ์‹œ์ ์— DbContext ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ด๋Š” MS์—์„œ๋„ (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด) ๊ถŒ๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์— ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ฆ‰,

public IActionResult Add(Model model)
{
   var context = new DbContext();
   ...
}

DbContext ์˜ ์ˆ˜๋ช…์„ ์กฐ๊ธˆ์ด๋ผ๋„ ํ™•์žฅํ•˜์ž๋ฉด,

private DbContext _dbContext;

public MyController()
{
    _dbContext = new();
}

๋ฌผ๋ก  ์œ„์™€ ๊ฐ™์ด ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ผ์ดํ”„ ํƒ€์ž„์— ๋งž์ถ”๋ ค๋ฉด, AddTransient ๋กœ ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ DbContext ์ธ์ง€ ์•„๋‹Œ ์ง€ ๋ถˆํ™•์‹คํ•˜๋‹ค๋ฉด, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค๋Š” DI ๋ฐ›์ง€ ๋ง๊ณ  ๋ฉ”์„œ๋“œ ๋‹จ์œ„์—์„œ ์ƒ์„ฑํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ๋‹จ์œ„์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ DBContext ์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ๋ฌธ์ œ๋ฅผ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ˆ˜์ •์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ์ด๋Š” ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

๋ง์”€ํ•ด์ฃผ์‹ ๋Œ€๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค๋Š” ๋ฉ”์„œ๋“œ ๋‹จ์œ„์—์„œ DBContext๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ฒ˜๋ฆฌํ•ด๋ด์•ผ ๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๊ฒŒ ์›Œ๋‚™ ๊ฐ€๋” ๋ถˆ๊ทœ์น™์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ค๋Š”๊ฑฐ๋ผ์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์˜ค๋ž˜ ๊ฑธ๋ฆด๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹œ๋„ํ•ด๋ณผ ๋งŒ ํ• ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋„์›€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ˜น์‹œ AddDbContext๋ฅผ AddDbContextPool๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค์˜ ๋ฉ”์„œ๋“œ ๋‹จ์œ„์—์„œ GetRequiredService๋กœ DbContext๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฑด ์–ด๋–จ๊นŒ์š”??

2๊ฐœ์˜ ์ข‹์•„์š”

dbContext ํ’€๋ง์€ ์„ฑ๋Šฅ์„ ์กฐ๊ธˆ์ด๋ผ๋„ ์˜ฌ๋ฆฌ๊ณ ์ž ํ•  ๋•Œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ 1๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊ณผ ๊ฐ™์ด ๋ญ๊ฐ€ ์ž˜ ๋ชป๋˜์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ๋Š” ๋ฌธ์ œ๋ฅผ ์•…ํ™”์‹œํ‚ค๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ํ•ด๊ฒฐ์„ ์–ด๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , DbContext ํ’€๋ง์€ Db ๊ณต๊ธ‰์ž์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ํ’€๋ง์œผ๋กœ ์—ฐ๊ฒฐ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์ค‘์š” ์„ค์ •์ด ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๊ณ , ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ ํ™•์žฅ ๋ฉ”์„œ๋“œ๋กœ ์ˆจ์–ด ๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ  ๋‚˜๋ฉด ๊ทธ ๋•Œ ์‹œ๋„ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‚˜์ค‘์— ์•ˆ์ •๋˜๋ฉด ์‹œ๋„ํ•ด๋ด์•ผ ๊ฒ ์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฌธ์ œ๋ผ๊ณ  ํ™•์ธํ•˜๋Š” ๊ฒƒ ์กฐ์ฐจ๋„ ์‰ฝ์ง€๋Š” ์•Š์•˜์„ ๊ฑฐ ๊ฐ™์€๋ฐ
์–ด๋–ป๊ฒŒ ํ™•์ธํ•˜์…จ์–ด์šฉ ใ…‡ใ……ใ…‡?

๋ณดํ†ต์€โ€ฆ
EF๋กœ ๋ง‰ ์š”์ฒญ์„ ๋•Œ๋ ค๋ฐ•์œผ๋ฉด EF ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋ณด๋‹ค๋Š” DB ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ณ 
๊ทธ๊ฑธ EF ์—์„œ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ฑธํ…๋ฐ์šค.
(์•„โ€ฆ DB์—์„œ ๋ฐ๋“œ๋ฝ ๊ฑธ๋ ธ๊ตฌ๋‚˜โ€ฆ ์ •๋„ ์•Œ๊ฒŒ ๋˜๋Š” ์ •๋„?)

๊ทธ๋Ÿฌ๋ฉด DB ์—์„œ ๋ฐ๋“œ๋ฝ์ด ๋‚ ๋งŒํ•œ ์š”์†Œ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ—ค๋”ฉ์„ ์‹œ์ž‘ํ•˜์ฃ โ€ฆ ;ใ…;
(์ง€๊ธˆ์€ ํšŒ์‚ฌ DBA ๊ป˜์„œ ํ—ค๋”ฉํ•ด์ฃผ๊ณ  ๊ณ„์…”์„œ ์ €๋Š” ์•ฝ๊ฐ„ ๋ณ‘ํ’ ์น˜๋Š” ๋ถ„์œ„๊ธฐ?)

EF ๋งŒ์œผ๋กœ๋Š” ์›ฌ๋งŒํ•ด์„œ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ค์› ๋˜ ๊ฑธ๋ฃจ ๊ธฐ์–ต์ด ๋‚˜์„œ์šœโ€ฆ =ใ……=;;

1๊ฐœ์˜ ์ข‹์•„์š”

์ถ”์ธก์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ๋งŒํ•œ ๋ถ€๋ถ„์ด ๋”ฑํžˆ ์—†์–ด์„œ์š”. dbcontext๊ฐ€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š”๊ฑธ ์–ด๋”˜๊ฐ€์—์„œ ๋ด์„œ ์ด๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์•„๋‹๊นŒ ์ถ”์ธกํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

๋ธ”๋ ˆ์ด์ € ์„œ๋ฒ„ ํ”„๋กœ์ ํŠธ์—์„œ Identity ์˜ต์…˜ ์„ ํƒํ•˜๋ฉด ์Šค๋ ˆ๋”ฉ ๋ฌธ์ œ ์‰ฝ๊ฒŒ ์œ ๋ฐœ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๊ทธ๊ฒƒ๋•Œ๋ฌธ์— ์ข€ ๋” ๊นŠ๊ฒŒ ๋“ค์—ฌ๋‹ค ๋ณธ ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์ง€๋งŒ์š”. ^^

1๊ฐœ์˜ ์ข‹์•„์š”

@BigSquare ๋‹˜๊ป˜์„œ ๋ง์”€ํ•˜์‹œ๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•œ MS ๋ฌธ์„œ ์ถ”๊ฐ€ํ•ด์„œ ๋‚จ๊ฒจ ๋†“์Šต๋‹ˆ๋‹ค~

DbContext Lifetime, Configuration, and Initialization - EF Core | Microsoft Learn

1๊ฐœ์˜ ์ข‹์•„์š”

์•„๋ž˜์™€ ๊ฐ™์ด ์‹œ๋„ํ•ด ๋ณด์„ธ์š”.
๋ฐฉ๋ฒ•1. Interlocked.Decrement ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
๋ฐฉ๋ฒ•2. ๋ณ„๋„์˜ Thread ์ „์šฉ DbContext๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Transient ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
๋ฐฉ๋ฒ•3. SqlConnection ๊ฐ์ฒด๋ฅผ Wrapํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งŒ๋ฃŒ๋œ ์—ฐ๊ฒฐ์— ๋Œ€ํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ Wrap ํด๋ž˜์Šค์—์„œ ์‹ ๊ทœ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ Scope, Transient ๋‘˜๋‹ค ์ ์šฉ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”