jrchs
1
ASP.NET Core๋ก ์์ฑํ ์ฑ์์ DB์ ๊ด๋ จํ์ฌ ์ด์๊ฐ ๋ฐ์ํ๊ณ ์์ต๋๋ค.
ํ์ฌ๋ AddDbContext๋ก ๋ฑ๋กํ๊ณ DI๋ก DbContext๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋๋ฐ, ์ด๊ฒ Multi Thread์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒ์ํด๋ณด๋ Entity Framework์ Multi Thread์ ๊ด๋ จํ์ฌ ๋ช๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋์ค๋๋ฐ์.
์ด๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์์ ํ๊ณ ์ข์์ง ๊ฐ์ด ์์์ ๋ฌธ์ ๋๋ฆฝ๋๋ค.
์ ๊ฐ ์ฐพ์๋ณธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- DI๋ก IServiceProvider๋ฅผ ๊ฐ์ ธ์์ serviceProvider.GetRequiredService() ๋ก DbContext๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- DI๋ก IServiceScopeFactory๋ฅผ ๊ฐ์ ธ์์ serviceScoperFactory.CreateScope().ServiceProvider.GetRequiredService() ๋ก DbContext๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- DI๋ก DbContextOptions๋ฅผ ๊ฐ์ ธ์์ new MyContext(dbContextOptions) ์ผ๋ก DbContext๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- AddDbContext๋ฅผ AddDbContextPool๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ด ์ค ์ด๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์์ ํ๊ณ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๊น์? ์ด ์ธ์ ๋ค๋ฅธ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์๊น์?
4๊ฐ์ ์ข์์
code
2
์ EF๋ฅผ ์์จ๋ด์ ๋ต๋ณ์ด ๋ ์ง ๋ชจ๋ฅด๊ฒ ๋๋ฐ
DB ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์ธ๋๋ Half-Sync / Half-ASync ํจํด์ผ๋ก ๊ตฌํ ํ์ต๋๋ค.
POSA์ ๋์ค๋ ํจํด์ด๊ณ
๊ฐ๋ตํ ์ค๋ช
๋๋ฆฌ๋ฉด
Job์ Queue์ ๋ฃ์ด ๋๊ณ
Work Thread์์ ๋นผ์ ์ฒ๋ฆฌ ํ๋ ๋ฐฉ์์
๋๋ค.
3๊ฐ์ ์ข์์
suwoo
3
ํน์ ASP.NET์ ์ด๋ค ์ํฌ๋ก๋๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ์ค๊น์?
MVC์ Blazor๊ฐ DBContext๋ฅผ ์๋นํ๋ ๊ตฌ์ฑ์ด ์กฐ๊ธ ๋ฌ๋ผ์์.
2๊ฐ์ ์ข์์
jrchs
4
๊ฐ์ฌํฉ๋๋ค.
์ฐธ๊ณ ํด๋ณด๊ฒ ์ต๋๋ค.
2๊ฐ์ ์ข์์
jrchs
5
MVC๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
3๊ฐ์ ์ข์์
์ฝ๋๊ฐ ๋จ์ํ CRUD ๋ผ๋ฉด MVC ์์๋ ํฌ๊ฒ ๋ฌธ์ ๋ ๋ถ๋ถ์ด ์์ํ
๋ฐ์.
ํน์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ฝ๋์ ๋ฉ์์ง ์ ์ ์์๊น์?
4๊ฐ์ ์ข์์
jrchs
7
์ฌ๋ฌ๊ฐ์ 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๊ฐ์ ์ข์์
dimohy
8
์ ์์ ์ธ ์ํฉ์ด๋ผ๋ฉด ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ด์ผ ํ๋๋ฐ์, ์๋ํ๋ฉด ๋จ์ผ 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๊ฐ์ ์ข์์
jrchs
10
๋ง์ํด์ฃผ์ ๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค๋ ๋ฉ์๋ ๋จ์์์ DBContext๋ฅผ ์์ฑํด์ ์ฒ๋ฆฌํด๋ด์ผ ๊ฒ ์ต๋๋ค.
์ด๊ฒ ์๋ ๊ฐ๋ ๋ถ๊ท์น์ ์ผ๋ก ์ค๋ฅ๊ฐ ๋์ค๋๊ฑฐ๋ผ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ค๋ฉด ์ค๋ ๊ฑธ๋ฆด๊ฒ ๊ฐ์ง๋ง ์๋ํด๋ณผ ๋ง ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋์ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํน์ AddDbContext๋ฅผ AddDbContextPool๋ก ๋ณ๊ฒฝํ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค์ ๋ฉ์๋ ๋จ์์์ GetRequiredService๋ก DbContext๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋๊ฑด ์ด๋จ๊น์??
2๊ฐ์ ์ข์์
dbContext ํ๋ง์ ์ฑ๋ฅ์ ์กฐ๊ธ์ด๋ผ๋ ์ฌ๋ฆฌ๊ณ ์ ํ ๋๊ฐ ์ฌ์ฉํ๋ ๊ฒ์ด ์ 1๋ชฉ์ ์
๋๋ค. ์ง๊ธ๊ณผ ๊ฐ์ด ๋ญ๊ฐ ์ ๋ชป๋์๋์ง ๋ชจ๋ฅด๋ ์ํ์์๋ ๋ฌธ์ ๋ฅผ ์
ํ์ํค๊ฑฐ๋ ์คํ๋ ค ํด๊ฒฐ์ ์ด๋ฝ๊ฒ ๋ง๋ค ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , DbContext ํ๋ง์ Db ๊ณต๊ธ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
ํ๋ง์ผ๋ก ์ฐ๊ฒฐ๋๊ธฐ๋ ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ค์ ์ค์ ์ด ๋ช
์์ ์ผ๋ก ๋๋ฌ๋์ง ์๊ณ , ์๋น์ค ์ปจํ
์ด๋ ํ์ฅ ๋ฉ์๋๋ก ์จ์ด ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ด ๋ช
ํํด์ง๊ณ ๋๋ฉด ๊ทธ ๋ ์๋ํด๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
2๊ฐ์ ์ข์์
jrchs
12
๊ฐ์ฌํฉ๋๋ค.
๋์ค์ ์์ ๋๋ฉด ์๋ํด๋ด์ผ ๊ฒ ์ต๋๋ค.
2๊ฐ์ ์ข์์
๋ฉํฐ ์ค๋ ๋ ๋ฌธ์ ๋ผ๊ณ ํ์ธํ๋ ๊ฒ ์กฐ์ฐจ๋ ์ฝ์ง๋ ์์์ ๊ฑฐ ๊ฐ์๋ฐ
์ด๋ป๊ฒ ํ์ธํ์
จ์ด์ฉ ใ
ใ
ใ
?
๋ณดํต์โฆ
EF๋ก ๋ง ์์ฒญ์ ๋๋ ค๋ฐ์ผ๋ฉด EF ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ๋ณด๋ค๋ DB ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ณ
๊ทธ๊ฑธ EF ์์ ํ์ํด์ฃผ๋ ๊ฑธํ
๋ฐ์ค.
(์โฆ DB์์ ๋ฐ๋๋ฝ ๊ฑธ๋ ธ๊ตฌ๋โฆ ์ ๋ ์๊ฒ ๋๋ ์ ๋?)
๊ทธ๋ฌ๋ฉด DB ์์ ๋ฐ๋๋ฝ์ด ๋ ๋งํ ์์๋ฅผ ์ฐพ์ผ๋ ค๊ณ ํค๋ฉ์ ์์ํ์ฃ โฆ ;ใ
;
(์ง๊ธ์ ํ์ฌ DBA ๊ป์ ํค๋ฉํด์ฃผ๊ณ ๊ณ์
์ ์ ๋ ์ฝ๊ฐ ๋ณํ ์น๋ ๋ถ์๊ธฐ?)
EF ๋ง์ผ๋ก๋ ์ฌ๋งํด์๋ ๋ฉํฐ์ค๋ ๋ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ค์ ๋ ๊ฑธ๋ฃจ ๊ธฐ์ต์ด ๋์์โฆ =ใ
=;;
1๊ฐ์ ์ข์์
jrchs
14
์ถ์ธก์
๋๋ค. ๋ฌธ์ ๊ฐ ์๊ธธ๋งํ ๋ถ๋ถ์ด ๋ฑํ ์์ด์์. dbcontext๊ฐ ๋ฉํฐ ์ฐ๋ ๋ฉ์ ์ง์ํ์ง ์๋๋ค๋๊ฑธ ์ด๋๊ฐ์์ ๋ด์ ์ด๊ฒ ๋ฌธ์ ๊ฐ ์๋๊น ์ถ์ธกํด๋ดค์ต๋๋ค.
1๊ฐ์ ์ข์์
๋ธ๋ ์ด์ ์๋ฒ ํ๋ก์ ํธ์์ Identity ์ต์
์ ํํ๋ฉด ์ค๋ ๋ฉ ๋ฌธ์ ์ฝ๊ฒ ์ ๋ฐ๊ฐ๋ฅํฉ๋๋ค.
์ฌ์ค ๊ทธ๊ฒ๋๋ฌธ์ ์ข ๋ ๊น๊ฒ ๋ค์ฌ๋ค ๋ณธ ๊ณ๊ธฐ๊ฐ ๋์์ง๋ง์. ^^
1๊ฐ์ ์ข์์
์๋์ ๊ฐ์ด ์๋ํด ๋ณด์ธ์.
๋ฐฉ๋ฒ1. Interlocked.Decrement ์ฌ์ฉํด ๋ณด์ธ์.
๋ฐฉ๋ฒ2. ๋ณ๋์ Thread ์ ์ฉ DbContext๋ฅผ ์์ฑํ์ฌ Transient ๋ก ์ ์ธํฉ๋๋ค.
๋ฐฉ๋ฒ3. SqlConnection ๊ฐ์ฒด๋ฅผ Wrapํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๋ง๋ฃ๋ ์ฐ๊ฒฐ์ ๋ํ์ฌ ์๋์ผ๋ก Wrap ํด๋์ค์์ ์ ๊ท๋ก ์์ฑํฉ๋๋ค. ์ด๋ Scope, Transient ๋๋ค ์ ์ฉ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
1๊ฐ์ ์ข์์