[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
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.