ViennaNET: ๋ฐฑ์—”๋“œ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. 2 ๋ถ€

Raiffeisenbank .NET ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ViennaNET์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๊ณ„์†ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ๊ฒ€ํ† ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜จ ๋ฐฉ๋ฒ•๊ณผ ์ด์œ ์— ๋Œ€ํ•ด, ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” GitHub ์ €์žฅ์†Œ(์ถœ์ฒ˜๋Š” ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค), ๋„ˆ๊ฒŸ ํŒจํ‚ค์ง€๋Š” ์—ฌ๊ธฐ.

ViennaNET: ๋ฐฑ์—”๋“œ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. 2 ๋ถ€

๋น„์—”๋‚˜NET.์‚ฌ๊ฐ€

ํ”„๋กœ์ ํŠธ๊ฐ€ DDD ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ ์ „ํ™˜๋˜๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ๋ถ„์‚ฐ๋˜๋ฉด ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Chris Richardson์€ "๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํŒจํ„ด"์ด๋ผ๋Š” ์ฑ…์—์„œ.

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

์šฐ๋ฆฌ์˜ ๊ตฌํ˜„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ธฐ๋ณธ ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ๋‹ค๋ฅธ ์„œ๋น„์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋ฐฉ๋ฒ• ์‚ฌ์šฉ๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ถ”์ƒ ํด๋ž˜์Šค SagaBase<T>์˜ ์ž์†์„ ๋งŒ๋“œ์„ธ์š”. ์—ฌ๊ธฐ์„œ T๋Š” ์‚ฌ๊ฐ€๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ์™€ ์ผ๋ถ€ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ŠคํŠธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ์ธ์Šคํ„ด์Šค๋Š” ์‹คํ–‰ ์ค‘์— ๋ชจ๋“  ๋‹จ๊ณ„์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. Saga ์ž์ฒด๋Š” ์ƒํƒœ ๋น„์ €์žฅ ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ DI์— ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด‘๊ณ  ์˜ˆ์‹œ:

public class ExampleSaga : SagaBase<ExampleContext>
{
  public ExampleSaga()
  {
    Step("Step 1")
      .WithAction(c => ...)
      .WithCompensation(c => ...);
	
    AsyncStep("Step 2")
      .WithAction(async c => ...);
  }
}

ํ˜ธ์ถœ ์˜ˆ์‹œ:

var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);

๋‹ค์–‘ํ•œ ๊ตฌํ˜„์˜ ์ „์ฒด ์˜ˆ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ทธ๋ฆฌ๊ณ  ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ํ…Œ์ŠคํŠธ.

ViennaNET.Orm.*

Nhibernate๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Liquibase๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB-First ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ธฐ์„ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

ViennaNET.Orm.Seedwork ะธ ViennaNET.Orm โ€“ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ทธ ๊ตฌํ˜„์„ ๊ฐ๊ฐ ํฌํ•จํ•˜๋Š” ์ฃผ์š” ์–ด์…ˆ๋ธ”๋ฆฌ. ๊ทธ ๋‚ด์šฉ์„ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

์ธํ„ฐํŽ˜์ด์Šค IEntityFactoryService ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ตฌํ˜„ EntityFactoryService ์ž‘์—… ๋‹จ์œ„, ํŠน์ • ์—”ํ„ฐํ‹ฐ ์ž‘์—…์„ ์œ„ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ๋ช…๋ น ์‹คํ–‰์ž ๋ฐ ์ง์ ‘ SQL ์ฟผ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์˜ ์ฃผ์š” ์‹œ์ž‘์ ์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋Š” ๋“ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์œ„ํ•ด ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ IEntityFactoryService ์กฐ์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค - ์ธํ„ฐํŽ˜์ด์Šค IEntityRepositoryFactory, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐฉ๋ฒ•๋งŒ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๊ธ‰์ž ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ DBMS์—๋Š” ์ž์ฒด ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ณต๊ธ‰์ž๋ฅผ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋™์‹œ์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ์ธํ”„๋ผ ์ˆ˜์ • ๋น„์šฉ ์—†์ด ๋‹จ๊ณ„๋ณ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ DBMS์—์„œ ๋‹ค๋ฅธ DBMS๋กœ. ํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ์„ ํƒํ•˜๊ณ  ๋”ฐ๋ผ์„œ ํŠน์ • ์—”ํ„ฐํ‹ฐ ํด๋ž˜์Šค(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋งคํ•‘์ด ์ž‘์„ฑ๋จ)์— ๋Œ€ํ•œ ๊ณต๊ธ‰์ž๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ BoundedContext ํด๋ž˜์Šค(๋„๋ฉ”์ธ ์—”ํ„ฐํ‹ฐ ๋“ฑ๋ก์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ ํฌํ•จ) ๋˜๋Š” ๊ทธ ํ›„์† ํ•ญ๋ชฉ์— ์—”ํ„ฐํ‹ฐ๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ApplicationContext(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”ํ„ฐํ‹ฐ, ์ง์ ‘ ์š”์ฒญ ๋ฐ ๋ช…๋ น์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ ํฌํ•จ), ๊ตฌ์„ฑ์˜ ์—ฐ๊ฒฐ ์‹๋ณ„์ž๊ฐ€ ์ธ์ˆ˜๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

"db": [
  {
    "nick": "mssql_connection",
    "dbServerType": "MSSQL",
    "ConnectionString": "...",
    "useCallContext": true
  },
  {
    "nick": "oracle_connection",
    "dbServerType": "Oracle",
    "ConnectionString": "..."
  }
],

์˜ˆ์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ปจํ…์ŠคํŠธ:

internal sealed class DbContext : ApplicationContext
{
  public DbContext()
  {
    AddEntity<SomeEntity>("mssql_connection");
    AddEntity<MigratedSomeEntity>("oracle_connection");
    AddEntity<AnotherEntity>("oracle_connection");
  }
}

์—ฐ๊ฒฐ ID๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด "default"๋ผ๋Š” ์—ฐ๊ฒฐ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์—”ํ„ฐํ‹ฐ์˜ ์ง์ ‘ ๋งคํ•‘์€ ํ‘œ์ค€ NHibernate ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. XML ํŒŒ์ผ๊ณผ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์„ค๋ช…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ์Šคํ… ์ €์žฅ์†Œ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ViennaNET.TestUtils.Orm.

ViennaNET.Orm.* ์‚ฌ์šฉ์˜ ์ „์ฒด ์˜ˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

ViennaNET.Messaging.*

๋Œ€๊ธฐ์—ด ์ž‘์—…์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŠธ์ž…๋‹ˆ๋‹ค.

ํ ์ž‘์—…์„ ์œ„ํ•ด ๋‹ค์–‘ํ•œ DBMS์™€ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹, ์ฆ‰ ์‚ฌ์šฉ๋œ ํ ๊ด€๋ฆฌ์ž์— ๊ด€๊ณ„์—†์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์—… ์ธก๋ฉด์—์„œ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํ†ตํ•ฉ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋„์„œ๊ด€ ViennaNET.Messaging ์ด๋ฒˆ ํ†ต์ผ์˜ ์ฑ…์ž„์€ ๋ฐ”๋กœ ๊ทธ๋ถ„์—๊ฒŒ ์žˆ์œผ๋ฉฐ, ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue ะธ ViennaNET.Messaging.KafkaQueue ๊ฐ๊ฐ IBM MQ, RabbitMQ ๋ฐ Kafka์— ๋Œ€ํ•œ ์–ด๋Œ‘ํ„ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ์ž‘์—…์—๋Š” ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ๊ณผ ์ „์†ก์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ›๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. ์—ฌ๊ธฐ์—๋Š” ์—ฐ์† ์ฒญ์ทจ์™€ ๋‹จ์ผ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด ๋จผ์ € ๋‹ค์Œ์—์„œ ์ƒ์†๋œ ํ”„๋กœ์„ธ์„œ ํด๋ž˜์Šค๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IMessageProcessor, ์ˆ˜์‹  ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํŠน์ • ๋Œ€๊ธฐ์—ด์— "์—ฐ๊ฒฐ"๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋“ฑ๋ก์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. IQueueReactorFactory ๊ตฌ์„ฑ์—์„œ ๋Œ€๊ธฐ์—ด ์‹๋ณ„์ž๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

"messaging": {
    "ApplicationName": "MyApplication"
},
"rabbitmq": {
    "queues": [
      {
        "id": "myQueue",
        "queuename": "lalala",
        ...
      }
    ]
},

๋“ฃ๊ธฐ ์‹œ์ž‘์˜ ์˜ˆ:

_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();

๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์ˆ˜์‹  ๋Œ€๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ง€์ •๋œ ๋Œ€๊ธฐ์—ด์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์„ธ์„œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋‹จ์ผ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด IMessagingComponentFactory ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค CreateMessageReceiver๊ทธ๋Ÿฌ๋ฉด ์ง€์ •๋œ ๋Œ€๊ธฐ์—ด์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ˆ˜์‹ ์ž๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
    var message = receiver.Receive();
}

๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด ๋‹น์‹ ์€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค IMessagingComponentFactory ๋ฉ”์‹œ์ง€ ๋ฐœ์‹ ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
    sender.SendMessage(new MyMessage { Value = ...});
}

๋ฉ”์‹œ์ง€ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ๊ธฐ์„ฑ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ, XML, JSON๋ฟ์ด์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ณ ์œ ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IMessageSerializer ะธ IMessageDeserializer.

์šฐ๋ฆฌ๋Š” ๊ฐ ํ ๊ด€๋ฆฌ์ž์˜ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ์„ ๋ณด์กดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ViennaNET.Messaging.MQSeriesQueue ํ…์ŠคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ”์ดํŠธ ๋ฉ”์‹œ์ง€๋„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ViennaNET.Messaging.RabbitMQQueue ๋ผ์šฐํŒ… ๋ฐ ์ฆ‰์„ ๋Œ€๊ธฐ์—ด์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. RabbitMQ์šฉ ์–ด๋Œ‘ํ„ฐ ๋ž˜ํผ๋„ RPC์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ํ•˜๋‚˜์˜ ์‘๋‹ต ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ์ƒ์„ฑ๋˜๋Š” ํŠน์ˆ˜ ์ž„์‹œ ๋Œ€๊ธฐ์—ด์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ธฐ๋ณธ์ ์ธ ์—ฐ๊ฒฐ ๋‰˜์•™์Šค๊ฐ€ ์žˆ๋Š” ๋Œ€๊ธฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ.

ViennaNET.CallContext

์šฐ๋ฆฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ๊ฐ„์˜ ํ†ตํ•ฉ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ (์˜ˆ: ์‚ฌ๊ฐ€ ๋‚ด)์—๋„ ๋Œ€๊ธฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ, ์ข…๋‹จ ๊ฐ„ ๋กœ๊น…์„ ์œ„ํ•œ ์š”์ฒญ ์‹๋ณ„์ž, ์†Œ์Šค IP ์ฃผ์†Œ ๋ฐ ์ธ์ฆ ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ๋ณด์กฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ „์†กํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ViennaNET.CallContext, ์„œ๋น„์Šค์— ์ž…๋ ฅ๋˜๋Š” ์š”์ฒญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋Œ€๊ธฐ์—ด์ด๋‚˜ Http๋ฅผ ํ†ตํ•ด ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง„ ๋ฐฉ์‹์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๊ฐ€๋Š” ์š”์ฒญ์ด๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ์ปจํ…์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ—ค๋”์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์„œ๋น„์Šค์—์„œ๋„ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด์กฐ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ๊ณผ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€