[ASP.NET] Core Worker Serviceλ‘ λ λλ§μΈ μΌκ°μ μλλ‘μ§ μ± λ©μμ§λ‘ μλ¦Ό 보λ΄κΈ°
κ°λ° λ°°κ²½
μ λ νμ¬μμ μ
무 κ΄λ¦¬λ₯Ό μν΄ μλλ‘μ§ λ컀μμ λ λλ§μΈμ μ¬μ©νκ³ μμ΅λλ€. κ·Έλ¦¬κ³ λ λλ§μΈμ λ©μΌ μ€μ μ ν΅ν΄ μΌκ° μμ±, νΈμ§ μ λ©μΌλ‘ μλ¦Όμ λ°κ³ μμ΅λλ€. λ©μΌμ κ²½μ° μμ룩μΌλ‘ νμΈνκ³ μμ΅λλ€. κ·Έλ°λ° μ§κΈκΉμ§ λ λλ§μΈμ μ¬μ©νλ©΄μ λ무λ μμ¬μ΄ μ μ΄ μμμ΅λλ€. λ°λ‘ μλ¦Όμ μ¦μ νμΈν μ μλ€λ κ²μ΄μ£
λ λλ§μΈ μλ¦Όμ΄ μλμ§ νμΈνκΈ° μν΄ μμ룩μμ μ§μ 보λ΄κΈ°/λ°κΈ° λ²νΌμ ν΄λ¦νκ±°λ μκ° κ°κ²©μ μ§§κ² μ€μ ν΄μΌ νμ΅λλ€. νμ§λ§ PCμμλ μ΄λ κ² νμΈνλ©΄ λμ§λ§ μ€λ§νΈν°μμλ μλ¦Ό λ°κΈ°κ° μ½μ§ μμ΅λλ€. μλ¦Όμ μΌμλ μμ λλ λͺ¨λ λ©μΌμ λν΄ μλ¦Όμ΄ μ€λ μ λΆνΈνμ΅λλ€
κ·Έλμ μκ°ν κ²μ΄, 'λ λλ§μΈ μΌκ°μ΄ μμ±λλ©΄ λ©μ μ λ‘ μλ¦Όμ μ€ μ μμ§ μμκΉ'μ
λλ€. κ²λ€κ° μ λ μ¬λ΄ λ©μ μ λ‘ μλλ‘μ§ μ±(Chat)μ μ¬μ©νκ³ μκΈ° λλ¬Έμ, μ±μΌλ‘ μλ¦Ό λ©μμ§λ₯Ό λ°κΈΈ μνμ΅λλ€
κ·Έλ°λ° μμλ μ λλ 건 μλκ΅°μ. λ λλ§μΈμ REST APIλ₯Ό, μ±μ Incoming Webhookμ μ 곡νκ³ μμμ΅λλ€. μ¦, μ€μκ°μΌλ‘ λ λλ§μΈ REST APIλ₯Ό νΈμΆνμ¬ μ κ· μΌκ°μ μ‘°ννκ³ , μΌκ°μ΄ μλ€λ©΄ μ±μΌλ‘ λ©μμ§λ₯Ό 보λ΄λ©΄ λλ κ²μ΄μ£ !
ASP.NET Core Worker Service
κ·Έλ°λ° λ¬Έμ κ° μμμ΅λλ€. 'μ΄λ'μμ νλ‘κ·Έλ¨μ λ리λλμ
λλ€. μ²μμλ νΉμ μ»΄ν¨ν°μ νλ‘κ·Έλ¨μ μ€νν΄ λ¬΄ν 루νλ‘ κ³μ λ릴μ§, μλλ©΄ μλμ° μλΉμ€λ‘ κ°λ°νμ¬ μ»΄ν¨ν°κ° μΌμ§λ©΄ κ³μ λμκ°κ² ν μ§ κ³ λ―Όμ νμμ΅λλ€. κ·Έλ°λ° μκ°ν΄λ³΄λ μ λ μλλ‘μ§ μλ²λ₯Ό μ¬μ©νκ³ μμμ΅λλ€. μ¦, μλ²μ κ°λ°ν νλ‘κ·Έλ¨μ λ리면 λμ§ μμκΉ μΆμμ£ . κ·Έλμ μκ² λ κ²μ΄ ASP.NET Core
μμ΅λλ€.
ASP.NET Core
λ Windows, macOS λ° Linuxμμ μΈν°λ· μ°κ²° μ±μ λμν μ μλ νλ μ μν¬μ
λλ€. κ·Έλ¦¬κ³ C#μ μ§μν©λλ€. μ¦, κ°λ¨ν μ€λͺ
νλ©΄ μ κ° μνλ λμμ μννλ μ½λλ₯Ό λΉλνκ³ κ·Έ κ²°κ³Όλ¬Όμ ASP.NET Coreλ₯Ό ν΅ν΄ μλΉμ€λ₯Ό λμν μ μλ€λ κ²μ
λλ€.
κ²λ€κ° Visual Studioμμ μ μ κ°λ₯ν ASP.NET Core Worker Service(μμ μ μλΉμ€) ν νλ¦Ώμ μ₯κΈ°κ° μ€νλλ μλΉμ€ μ±μ κ°λ°νκΈ° μν΄ μ 곡λ©λλ€. μ¦, μ΄λ² ꡬμκ³Ό κ°μ΄ λ©μΆμ§ μκ³ κ³μν΄μ λ릴 μλΉμ€λ₯Ό μ μνκΈ° μν νλ‘μ νΈλΌλ κ²μ΄μ£ .
κ°λ° μμ
μ΄μ 본격μ μΌλ‘ κ°λ°μ λμ νκΈ°μ μμ, 'μ΄λ»κ²' κ°λ°ν΄ λκ° κ²μΈμ§ μ€λͺ νκ² μ΅λλ€. μ€κ° μ€κ° λ΄μ©μ΄ κ½€ λ§μμ νμ ν¬μ€ν μ 첨λΆνμ΅λλ€.
1. ν μ€νΈ νλ‘κ·Έλ¨
μ°μ λ λλ§μΈ REST API
μ μλλ‘μ§ μ± Incoming Webhook
μ μ°λν μ€ μμμΌκ² μ£ ? λ λλ§μΈ REST APIμ Incoming Webhookμ λ€λ£¨λ λ°©λ²μ μλ λ§ν¬λ₯Ό μ°Έκ³ νμΈμ.
[.Net] C# λ λλ§μΈ REST API μ¬μ©νλ λ°©λ²(μμ ν¬ν¨)
[μ±λ΄/.NET] C#μμ μλλ‘μ§ Chatμ μ±λ΄ λ©μμ§ λ³΄λ΄κΈ°(μμ ν¬ν¨)
2. Windows Docker with Worker Service
λ컀λ Windowsμ Linux μ΄μ체μ λͺ¨λ μ§μνλλ°μ. μ΅μ’
λͺ©νλ 리λ
μ€ κΈ°λ°μ μλλ‘μ§ λ컀μ΄μ§λ§, μ€κ° κ²μ¦μ μν΄ μλμ°μ© λ컀μμ λ¨Όμ ν
μ€νΈλ₯Ό μ§ννλ €κ³ ν©λλ€. κ·Έλ¦¬κ³ λ컀μμ μλΉμ€λ₯Ό ꡬλνκΈ° μν΄μλ Visual Studioμμ μ 곡νλ μμ
μ μλΉμ€(Worker Service) ν
νλ¦Ώμ μ¬μ©νλ©΄ λ©λλ€.
μ΄μ κ΄λ ¨λ λ΄μ©μ μλ λ§ν¬λ₯Ό μ°Έκ³ νμΈμ.
[ASP.NET] C# Windows Docker μ© μμ μ μλΉμ€ λ§λλ λ°©λ²
3. Synology Docker with Worker Service
μλμ° λ컀μμ κ²μ¦μ΄ λλ€λ©΄, μλλ‘μ§ λ컀μ μ΄λ―Έμ§λ₯Ό μ¬λ¦¬κ³ 컨ν μ΄λλ₯Ό μ€ννλ©΄ λμ λλ€. μ¬κΈ°μ Puttyλ₯Ό μ¬μ©νμ¬ μλλ‘μ§μ μ μνλ κ³Όμ μ΄ μκΈ° λλ¬Έμ PuTTY μ¬μ© λ°©λ²λ μμ§νμκΈ° λ°λλλ€.
[Synology NAS] νΈν°(PuTTY)λ‘ μλλ‘μ§ μ μνλ λ°©λ²
PuTTY μ¬μ©λ²λ μ΅νλ€λ©΄ 리λ μ€ λμ»€μ© μμ μ μλΉμ€ λ§λλ λ°©λ²μ μ°Έκ³ νμΈμ.
[ASP.NET] C# μλλ‘μ§ Linux Docker μ© μμ μ μλΉμ€ λ§λλ λ°©λ²β
λμ μ€κ³
νμ¬ μ κ° μ¬μ©νλ λ λλ§μΈμλ ν λΆμμμ μ
무λ₯Ό μμ²ν μ μλ 'μ
무 μμ²' νλ‘μ νΈκ° λ°λ‘ μμ΅λλ€. ν λΆμ λ΄λΉμλ€μ λͺ¨λ μ΄κ³³μμ μΌκ°μ μμ±νμ¬ μ
무λ₯Ό μμ²νκ² λ©λλ€. κ·Έλ¦¬κ³ μ²λ¦¬λ μΌκ°μ ν΄λΉ νλ‘μ νΈμμ μ¬λΌμ§κ² λ©λλ€.
μ΄λ₯Ό κΈ°λ°μΌλ‘, μ κ° μκ°ν μλΉμ€μ λμμ λ€μκ³Ό κ°μ΅λλ€.
β μ
무 μμ² νλ‘μ νΈμ μ‘΄μ¬νλ 'μ²λ¦¬λμ§ μμ μΌκ°'μ μ‘°ννλ€.
β‘ μΌκ° λ²νΈλ₯Ό κΈ°μ΅νμ¬ μ€λ³΅μΌλ‘ λ©μμ§λ₯Ό μ λ¬νμ§ μλλ‘ νλ€.
β’ λ©μ μ λ‘ μΌκ° μΉ μ¬μ΄νΈ μ£Όμμ μ λͺ©μ λ©μμ§λ‘ μ μ‘νλ€.
μμ£Ό κ°λ¨νμ£ ? μ΄λ₯Ό κΈ°λ°μΌλ‘ μ½λ ꡬνμ ν΄λ³΄κ² μ΅λλ€.
μ½λ ꡬν
μ€κ°μ€κ° νμΈν΄μΌ ν κ²λ€μ΄ κ½€ λ§μμ΅λλ€. κ·ΈλΌ λ³Έκ²©μ μΌλ‘ νλ‘μ νΈμ λͺ©νλ₯Ό μν ν΅μ¬ μ½λ ꡬνμ μ΄λ»κ² λλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
public class Worker : BackgroundService
{
//μ κ· μΌκ° μλ¦Ό λ©μμ§ μ€λ³΅ λ°©μ§λ₯Ό μν κ°μ²΄
private Dictionary<int, string> _list = new Dictionary<int, string>();
//... μλ΅...
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
//1μ΄ λ§λ€ μ§μ°
await Task.Delay(1000, stoppingToken);
//νμ¬ μ‘΄μ¬νλ μΌκ° μ‘°ν
var issues = searchIssues();
//μ‘΄μ¬νλ μΌκ°μ΄ μλ€λ©΄
if (issues != null)
{
foreach (var issue in issues)
{
try
{
//μΌκ° λ²νΈμ μ λͺ©μ _listμ μΆκ°
_list.Add(issue.Id, issue.Subject);
//μλλ‘μ§ Chatμ λ©μμ§ μ μ‘
notifyChatMessage(issue);
}
catch (Exception exc)
{
//μ΄λ―Έ _listμ μΌκ° μ λͺ©μ΄ μ‘΄μ¬νλ©΄ μμΈλ‘ μ²λ¦¬
continue;
}
}
}
//νμ¬ μ‘΄μ¬νλ μΌκ°μ΄ μλ€λ©΄
else
{
//λͺ¨λ μ κ· μΌκ°μ Chatμ λ©μμ§λ₯Ό 보λμΌλ―λ‘,
//νμ¬ μ‘΄μ¬νλ λͺ©λ‘μ μ§μ΄λ€(μ€λ³΅ λ°©μ§)
if (_list.Count != 0)
{
_list.Clear();
}
}
}
catch(Exception exc)
{
_logger.LogInformation(exc.Message);
}
}
}
}
μ½λλ μκ°λ³΄λ€ μμ£Ό κ°λ¨νκ³ , μ£ΌμμΌλ‘λ μΆ©λΆν μ€λͺ
μ΄ λ κ² κ°μ΅λλ€. μ€κ°μ νΈμΆνλ searchIssues()
λ λ λλ§μΈ REST API ν¬μ€ν
μ, notifyChatMessage()
λ Chatμ μ±λ΄ λ©μμ§ λ³΄λ΄κΈ° ν¬μ€ν
μ μ°Έκ³ νμΈμ.
νκΈ°
ν΄λΉ μλΉμ€λ₯Ό μ μν ν λΉ λ₯΄κ² μ 무 μμ² μΌκ°μ κ΄λ¦¬νκ³ μμ΅λλ€. μ΄μ μλ λ€λ₯Έ μΌμ νλλΌ λ°μλ©΄ λ©μΌ νμΈμ΄ λ¦μ΄ μ 무 νμΈμ΄ λ¦μ΄μ‘λλ°, νμ¬λ PC λλ μ€λ§νΈν°μΌλ‘ μλ¦Όμ΄ μ¦μ μ€λ λ°μλλΌλ 빨리 νμΈνκ² λμ΄ μ 무 μ§μ°μ΄ μ΅μνλμμ΅λλ€. μμ λΆνΈνλ©΄ μ§μ λ§λ€μ΄μ ν΄κ²°νλ κ²μ΄ μ λ΅μΈ κ² κ°μ΅λλ€.
'Programming > .Net' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λκΈ
μ΄ κΈ κ³΅μ νκΈ°
-
ꡬλ
νκΈ°
ꡬλ νκΈ°
-
μΉ΄μΉ΄μ€ν‘
μΉ΄μΉ΄μ€ν‘
-
λΌμΈ
λΌμΈ
-
νΈμν°
νΈμν°
-
Facebook
Facebook
-
μΉ΄μΉ΄μ€μ€ν 리
μΉ΄μΉ΄μ€μ€ν 리
-
λ°΄λ
λ°΄λ
-
λ€μ΄λ² λΈλ‘κ·Έ
λ€μ΄λ² λΈλ‘κ·Έ
-
Pocket
Pocket
-
Evernote
Evernote
λ€λ₯Έ κΈ
-
[.Net] λ€νΈμν¬ μ΄λν° IPμ£Όμμ κ³ κΈ μμ± λ³κ²½νκΈ°(μμ ν¬ν¨)
[.Net] λ€νΈμν¬ μ΄λν° IPμ£Όμμ κ³ κΈ μμ± λ³κ²½νκΈ°(μμ ν¬ν¨)
2022.07.16 -
[ASP.NET] μλλ‘μ§ λ컀(Docker)μμ μ λ λμ(Selenium) μλΉμ€ λ§λλ λ°©λ²
[ASP.NET] μλλ‘μ§ λ컀(Docker)μμ μ λ λμ(Selenium) μλΉμ€ λ§λλ λ°©λ²
2022.05.28 -
[ASP.NET] C# μλλ‘μ§ Linux Docker μ© μμ μ μλΉμ€ λ§λλ λ°©λ²
[ASP.NET] C# μλλ‘μ§ Linux Docker μ© μμ μ μλΉμ€ λ§λλ λ°©λ²
2022.02.28 -
[ASP.NET] C# Windows Docker μ© μμ μ μλΉμ€ λ§λλ λ°©λ²
[ASP.NET] C# Windows Docker μ© μμ μ μλΉμ€ λ§λλ λ°©λ²
2022.02.15