feature 추가
νλ‘λμ νκ²½μ μ€μ μμ€ν μλ μμ±λ CRUD μλν¬μΈνΈ μ΄μμ κ²μ΄ νμν©λλ€. 보μ, κΆν, λΉλκΈ° μ²λ¦¬, μ΄μ μμ , μ΄λ²€νΈ κ²μκ° νμνλ©° SaaS μλ리μ€μμλ tenantλ³ κ²©λ¦¬κ° νμν©λλ€.
Linoλ μ΄λ¬ν featureμ νμ€ featureμΌλ‘ μΆκ°ν©λλ€. κ° featureμ νλ‘μ νΈ λ©νλ°μ΄ν°λ₯Ό μ λ°μ΄νΈνκ³ , μμ€ μ½λλ₯Ό μμ±νκ³ , ꡬμ±μ μΆκ°νκ³ , λ°±μλ, νλ°νΈμλ, λ©μμ§ λ° μ§μμ±μ λμΌν μν€ν μ²μ λ§μΆ° μ μ§ν©λλ€.
μΈμ¦ λ° μΉμΈ
μΈμ¦ featureμ Lino νλ‘μ νΈμμ μ¬μ©νλ 보μ κΈ°λ°μ μΆκ°νμ¬ APIλ₯Ό 보νΈνκ³ , μ¬μ©μλ₯Ό μλ³νκ³ , μμ μ λν μ‘μΈμ€λ₯Ό μ μ΄νκ³ , λμΌν κΆνμ Blazor μΉ μ±κ³Ό ν΅ν©ν©λλ€. λ€μ λͺ λ ΉμΌλ‘ μ€μΉλ©λλ€.
lino feature auth add --service <ServiceName> --module <ModuleName>
λͺ
λ Ήμ λ€μμ μ¬μ©νμ¬ λνμμΌλ‘ μ€νν μλ μμ΅λλ€. lino feature auth add.
μ μ λΆκΈ°λ λ€μκ³Ό κ°μ΅λλ€. feature auth; CLIλ λ€μκ³Ό κ°μ λ³μΉλ λ
ΈμΆν©λλ€. feature security κ·Έλ¦¬κ³ feature identity.
νμ¬ Lino μν€ν μ²μμλ μΈμ¦ λ° κΆν λΆμ¬κ° λΉλκΈ° λ©μμ§μ μμ‘΄ν©λλ€. κ·Έ μ΄μ λ μ΄μμμ μ΄μ μ λλ€. μλΉμ€ λ° λͺ¨λ κΆνμ ν΅ν© μ΄λ²€νΈμ μν΄ λκΈ°νλλ―λ‘ λ³΄μμ μΆκ°νκΈ° μ μ νλ‘μ νΈμμ λ©μμ§μ νμ±νν΄μΌ ν©λλ€.
λ§λ²μ¬κ° μꡬνλ κ²
CLIλ νμ¬ νλ‘μ νΈμ μ ν¨μ±μ κ²μ¬νκ³ , featureμ΄ μμ§ μ€μΉλμ§ μμλμ§ νμΈνκ³ , 보μ λͺ¨λμ μμ±ν΄μΌ νλ μμΉλ₯Ό λ¬»κ³ κΈ°λ³Έ ν ν° μ€μ μ μμ²ν©λλ€.
- μλΉμ€: 보μ 리μμ€λ₯Ό νΈμ€ν ν μλΉμ€μ λλ€.
- κΈ°μ€ μΉμ: μ νν μλΉμ€κ° λͺ¨λνμΈ κ²½μ° λμ λͺ¨λμ λλ€.
- μ‘μΈμ€ ν ν° μλͺ : λ°κΈλ μ‘μΈμ€ ν ν°μ μλͺ (λΆ)μ λλ€.
- ν ν° μλͺ μλ‘ κ³ μΉ¨: μΈμ μ κ°±μ νλ λ° μ¬μ©λλ ν ν°μ μλͺ μ λλ€.
-
μ¬μ©μ μλ³μ μ ν: μ¬μ©μ μλ³μλ‘ μ¬μ©λλ λ°μ΄ν° μ ν(μ:
int,longλλGuid.
μμ±λ 보μ λͺ¨λΈ
νμΈ ν Linoλ νλ‘μ νΈ λ©νλ°μ΄ν°λ₯Ό μ λ°μ΄νΈνκ³ , 보μ κ΅¬μ± κ°μ μμ±νκ³ , μμ€ μ½λ νμΌμ μμ±νκ³ , νμν λͺ λ Ήμ μ€νν©λλ€. μμ±λ λͺ¨λΈμλ μ€μ 보μ μν°ν°κ° ν¬ν¨λ©λλ€.
Userλ μ μ λ° νλ‘ν λ°μ΄ν°λ₯Ό μ μ₯ν©λλ€.Roleκ·Έλ£Ή μ‘μΈμ€ κ·μΉμ λν μν μ°κ²°.PermissionμΈλΆνλ κΆν λΆμ¬λ₯Ό μν μν κ³Ό κΆν κ°μ κ΄κ³.UserTokenμλ‘ κ³ μΉ¨ ν ν° λ° ν ν° μλͺ μ£ΌκΈ°λ₯Ό μ μ΄ν©λλ€.
μ΄ featureμ ν ν° μλͺ λΉλ°κ°κ³Ό access token λ° refresh token μλͺ λ± λ³΄μ ꡬμ±μ νμν μ 보λ μμ±ν©λλ€. λ―Όκ°ν κ°μ λ²μ μ΄ μ§μ λ νμΌμ μ§μ κΈ°λ‘λμ§ μκ³ AppHost μ¬μ©μ λΉλ°μ λν λͺ λ ΉμΌλ‘ μ€νλ©λλ€.
λ°νμ λμ
APIλ JWT Bearer μΈμ¦μ μ¬μ©ν©λλ€. μ¬μ©μλ λ‘κ·ΈμΈνμ¬ access tokenκ³Ό refresh tokenμ λ°κ³ , Authorization: Bearer <token> headerμ ν¨κ» APIμ μμ²μ 보λ
λλ€.
λ°±μλλ ν ν°μ μ ν¨μ±μ κ²μ¬νκ³ , μ¬μ©μ 컨ν
μ€νΈλ₯Ό λ‘λνκ³ , μλν¬μΈνΈμ κΆν λΆμ¬ κ·μΉμ μ μ©ν©λλ€.
μΌλ°μ μΈ νλ¦μ κ°λ¨ν©λλ€. μλν¬μΈνΈ λλ μ μ© νμ΄μ§λ₯Ό ν΅ν΄ λ‘κ·ΈμΈνκ³ , ID ν΄λ μ, μν λ° κΆνμ΄ ν¬ν¨λ JWTλ₯Ό λ°κΈνκ³ , κ° μμ²μ ν ν°μ 보λ΄κ³ , μΈμ¦ λ―Έλ€μ¨μ΄λ₯Ό ν΅ν΄ μλͺ λ° λ§λ£λ₯Ό νμΈν©λλ€.
Linoλ μ μ±
κ³Ό κΆνμ μ¬μ©νμ¬ μΈλΆνλ μΈμ¦μ ꡬνν©λλ€. κ° μμ
μλ λ€μκ³Ό κ°μ νΉμ κΆνμ΄ νμν μ μμ΅λλ€. People.Read λλ People.Create; μ μ±
μ λ€μμ ν΅ν΄ ꡬμ±ν μ μμ΅λλ€. AddAuthorization; μλν¬μΈνΈλ λ€μμ μ μΈνμ¬ λ³΄νΈν μ μμ΅λλ€. .RequireAuthorization.
μμ±λ μλν¬μΈνΈμ νμ΄μ§λ κΆνμ μΌκ΄λκ² μ¬μ©ν©λλ€. λ°±μλ μμ μλ κΆνμ΄ νμν μ μμ§λ§ μμ±λ Blazor UIλ κΆνμ λ‘λνκ³ , νμ΄μ§λ₯Ό 보νΈνκ³ , μ¬μ©ν μ μλ μμ μ μ¨κΈ°κ³ , νλ‘μ νΈμ μΉ μ±μ΄ μλ κ²½μ° μ¬μ©μ, μν , κΆν λ° κΆν λΆμ¬μ λν νλ©΄μ λ ΈμΆν μ μμ΅λλ€.
Background Jobμ΄ μ΄λ―Έ νμ±νλ κ²½μ° Linoλ λΉνμ±νλκ±°λ λ§λ£λ ν ν°μ λν μ μ§ κ΄λ¦¬ 루ν΄κ³Ό κ°μ μ¬μ©μ ν ν°κ³Ό κ΄λ ¨λ μμ λ μΆκ°ν©λλ€.
λ°±κ·ΈλΌμ΄λ μ²λ¦¬ λ° Outbox
λ°±κ·ΈλΌμ΄λ μ²λ¦¬λ ν΅ν© μ΄λ²€νΈ κ²μ, μ€λλ λ μ½λ μ 리, λ§λ£λ ν ν° μ κ±°, μλ¦Ό 보λ΄κΈ°, λ³΄κ³ μ μμ±, μΈλΆ μμ€ν κ³Ό λκΈ°ν λλ μμ½λ μμ μ€ν λ± κΈ°λ³Έ μμ² λ° μλ΅ νλ¦μ μ°¨λ¨ν΄μλ μ λλ μμ μ μ²λ¦¬ν©λλ€. Linoλ Background Job featureμ ν΅ν΄ μ΄ featureμ μΆκ°ν©λλ€.
lino feature background-job add --service <ServiceName>
λͺ
λ Ήμ λ€μκ³Ό κ°μ΄ μ€νλ μλ μμ΅λλ€. lino feature background-job add λνμμΌλ‘ μλ£λμμ΅λλ€.
CLIλ λ³μΉμ λ€μκ³Ό κ°μ΄ λ
ΈμΆν©λλ€. job-scheduler κ·Έλ¦¬κ³ worker.
μ΄ featureμ μ¬μ©νλ €λ©΄ νλ‘μ νΈμμ λ©μμ§μ νμ±νν΄μΌ ν©λλ€. μ£Όμ μ± μμ Transactional Outbox νμ€μ μν΄ λ±λ‘λ λ©μμ§λ₯Ό μμ νκ² κ²μνλ κ²μ΄κΈ° λλ¬Έμ λλ€.
λ§λ²μ¬κ° μꡬνλ κ²
- μλΉμ€: Background Job μΈνλΌκ° μ€μΉλλ μλΉμ€μ λλ€.
- Background Job λΌμ΄λΈλ¬λ¦¬: μμ μ€ν λ° μμ½μ μ¬μ©λλ ꡬνμ λλ€. νμ¬ μμ±λ μΈνλΌλ Hangfireλ₯Ό μ¬μ©ν©λλ€.
- Outbox μ²λ¦¬ μ€: μλΉμ€κ° μ€μΌμ€λ¬μμ μ²λ¦¬ν μ΄λ²€νΈλ₯Ό λ±λ‘ν μ§ μ¬λΆλ₯Ό μ μν©λλ€.
- CronOutboxλ©μμ§: μ λ©μμ§ Outboxλ₯Ό νμΈνλ λ° μ¬μ©λλ λ²μ λλ μΌμ ννμμ λλ€.
- λ°°μΉ ν¬κΈ°: λ‘λ, λ³λ ¬μ± λ° λ¦¬μμ€ μλΉλ₯Ό μ μ΄νλ©΄μ μ£ΌκΈ°λΉ κ²μ λ° μ²λ¦¬λλ Outbox λ μ½λ μμ λλ€.
Hangfire μΈνλΌ
Linoλ Hangfireλ₯Ό λ±λ‘νκ³ , μ§μμ±μ ꡬμ±νκ³ , λμ보λλ₯Ό λ ΈμΆνκ³ , μλΉμ€μμ μ¬μ©λλ μμ μ μμ½νλ λ° νμν μΈνλΌλ₯Ό μμ±ν©λλ€. μμ±λ ꡬμ±μλ job μμ½, Outbox λ©μμ§ μ²λ¦¬, μ€μΌμ€λ¬ λμ보λ μ κ·Ό 보νΈμ νμν μ λ³΄κ° ν¬ν¨λ©λλ€.
μμ±λ μ루μ μμ Hangfire μ€ν€λ§μ ν μ΄λΈμ μ ν리μΌμ΄μ λ°μ΄ν°λ² μ΄μ€ ꡬμ±μ μΌλΆμ λλ€. λμ보λλ κ°λ° λ° μ΄μ μ€μ μλ£, μ€ν¨, μμ½ λ° λ°λ³΅ μμ μ κ²μ¬νλ λ° λμμ΄ λ©λλ€.
μ€μ§μ μΈ μ΄μ μΌλ‘λ μμ μ μΈ λΉλκΈ° μμ μ€ν, λ΄μ₯λ λͺ¨λν°λ§ λμ보λ, λ°λ³΅ μμ λλ μμ½ μμ μ§μ, λ°μ΄ν°λ² μ΄μ€ λ΄ μμ μ§μμ± λ±μ΄ μμ΅λλ€.
νΈλμμ Outboxλ‘ μ²λ¦¬
λΉλκΈ° ν΅ν©μ μΌκ΄μ±μ 보μ₯νκΈ° μν΄ Linoλ νΈλμμ Outbox ν¨ν΄μ μ¬μ©ν©λλ€. λΉμ¦λμ€ μ¬μ© μ¬λ‘λ λλ©μΈ λ³κ²½ μ¬νμ μ μ§νκ³ λμΌν νΈλμμ λ΄μ Outbox ν μ΄λΈμ ν΅ν© μ΄λ²€νΈλ₯Ό κΈ°λ‘ν©λλ€. κ·Έλ° λ€μ Background Jobμ Outbox ν μ΄λΈμ μ½κ³ νλ‘μ νΈμ λν΄ μ΄λ¬ν μ΅μ μ΄ μ νλ κ²½μ° MassTransitμ΄ μλ RabbitMQμ κ°μ΄ ꡬμ±λ λ©μμ§ λ²μ€λ₯Ό ν΅ν΄ μ΄λ²€νΈλ₯Ό κ²μν©λλ€.
- λͺ λ Ήμ λλ©μΈμ μνλ₯Ό λ³κ²½νκ³ μ΄ λ³κ²½ μ¬νμ νΈλμμ μ μ μ₯ν©λλ€.
- νΈλ€λ¬λ Outboxμ ν΅ν© μ΄λ²€νΈ(μ: μ£Όλ¬Έ μμ±κ³Ό κ΄λ ¨λ μ΄λ²€νΈ)λ₯Ό λ±λ‘ν©λλ€.
- Hangfire μμ μ μ²λ¦¬λμ§ μμ λ©μμ§ μΌκ΄ μ²λ¦¬λ₯Ό μ°¨λ¨νκ³ μ΄λ¬ν λ©μμ§λ₯Ό μ²λ¦¬ ββμ€μΈ κ²μΌλ‘ νμν©λλ€.
- κ° λ©μμ§λ μ΄λ²€νΈ λ²μ€μ μν΄ μμ§λ ¬νλκ³ κ²μλ©λλ€.
- μ±κ³΅ν λ©μμ§λ μ²λ¦¬λ κ²μΌλ‘ νμλ©λλ€. μ€ν¨ν λ©μμ§λ λμ€μ λΆμνκ±°λ μ¬μλ μ λ΅μ μν΄ μ€λ₯ μ 보λ₯Ό 보쑴ν©λλ€.
κ·Έ κ²°κ³Ό λ°μ΄ν°λ² μ΄μ€μ κΈ°λ‘λ μ΄λ²€νΈ κ°μ μμμ±, μ€λ₯ λ°μ μ μ΄λ²€νΈκ° μμ€λμ§ μλλ‘ νλ μμ μ±, μ¬λ¬ μλΉμκ° κ²μλ λ©μμ§λ₯Ό μ²λ¦¬ν μ μλ νμ₯μ±μ΄ ꡬνλ©λλ€.
μμ±λ μμ μλ μ΄λ―Έ μ±κ³΅μ μΌλ‘ μ²λ¦¬λ μ€λλ Outbox λ©μμ§λ₯Ό μ κ±°νκ³ μ²λ¦¬μ λ©μΆ λ©μμ§λ₯Ό ν΄μ νλ 루ν΄λ ν¬ν¨λμ΄ μμ΄ μ ν리μΌμ΄μ μ€ν¨ ν μꡬ μ κΈ μνμ μ€μ λλ€.
μΈμ¦μ΄ μ€μΉλλ©΄ Background Job featureμ΄ ν ν° μ μ§ κ΄λ¦¬ μμ μ νΈμ€ν νμ¬ μκ°μ΄ μ§λλ 보μ λ°μ΄ν°λ₯Ό κΉλνκ² μ μ§ν μ μμ΅λλ€.
μ΄λ¬ν μΆκ° featureμ ν΅ν΄ Linoλ μ΅μ μμ° μ ν리μΌμ΄μ μ μ€μν μꡬ μ¬νμ λ§λ κ°λ ₯ν 보μ, μΈλΆνλ μ‘μΈμ€ μ μ΄ λ° μμ μ μΈ λΉλκΈ° μ²λ¦¬λ₯Ό μ 곡ν©λλ€.
multi-tenancy
λ©ν° ν λμλ λμΌν μ ν리μΌμ΄μ μ΄ κ° tenantμ λν΄ κ²©λ¦¬λ λ°μ΄ν°, κΆν λ° κ΅¬μ±μ μ μ§νλ©΄μ μ¬λ¬ ν΄λΌμ΄μΈνΈ, μ‘°μ§ λλ νκ²½μ μλΉμ€λ₯Ό μ 곡ν΄μΌ ν λ μ¬μ©λλ featureμ λλ€. Linoμμλ λ€μκ³Ό κ°μ΄ tenant μ§μμ΄ μΆκ°λ©λλ€.
lino feature tenant add --service <ServiceName> --module <ModuleName>
λͺ
λ Ήμ λ€μμ μ¬μ©νμ¬ λνμμΌλ‘ μ€νν μλ μμ΅λλ€. lino feature tenant add.
CLI λΆκΈ°λ λ€μκ³Ό κ°μ λ³μΉλ λ
ΈμΆν©λλ€. tenancy.
μ μ 쑰건
tenant μ§μμ λ κ°μ§ μν€ν μ² featureμ λ°λΌ λ¬λΌμ§λλ€.
- μΈμ¦ λ° μΉμΈ, μ¬μ©μ μ‘μΈμ€, μν , κΆν λ° ν ν°μ tenantλ₯Ό μΈμν΄μΌ νκΈ° λλ¬Έμ λλ€.
- λ©μμ§, ν΅ν© μ΄λ²€νΈλ₯Ό ν΅ν΄ tenant λ° μ¬μ©μ μ λ³΄κ° λ€λ₯Έ λͺ¨λλ‘ μ νλ μ μκΈ° λλ¬Έμ λλ€.
μ΄λ¬ν μ μ μ‘°κ±΄μ΄ λλ½λλ©΄ λͺ λ Ήμ΄ κ±°λΆλ©λλ€. μ΄ featureμ νλ‘μ νΈλΉ ν λ²λ§ μ€μΉν μλ μμ΅λλ€.
무μμ΄ μμ±λλμ?
Linoλ tenantλ₯Ό μΌκ΄λκ² κ΄λ¦¬νλ λ° νμν ν λμ λͺ¨λΈ, ꡬμ±, μ΄λ²€νΈ, API ν΅ν© λ° νλ°νΈμλ 리μμ€λ₯Ό μμ±ν©λλ€.
Tenantλ tenant ID, μ΄λ¦, μ¬λ¬κ·Έ, μν, 격리 λͺ¨λ λ° μ°κ²° λ¬Έμμ΄ μ°Έμ‘°λ₯Ό μ μ₯ν©λλ€.TenantBrandingtenantλ³ νΉμ μκ°μ λμμ λν λΈλλ© λ°μ΄ν°λ₯Ό μ μ₯ν©λλ€.TenantDomainνΈμ€νΈ λλ λλ©μΈμ tenantμ λ§€νν©λλ€.TenantStatus그리κ³IsolationModetenant μλͺ μ£ΌκΈ° λ° λ°μ΄ν° 격리 μ΅μ μ μ μν©λλ€.- μμ±λ ꡬμ±μ νλ‘μ νΈμ tenant νμΈκ³Ό λ°μ΄ν° 격리λ₯Ό μ§μν©λλ€.
tenant μΈμ 보μ
ν λμλ μΈμ¦ λ° κΆν λΆμ¬κ° ν΄μλλ λ°©μμ λ³κ²½ν©λλ€. μ ν¨ν ν ν°κ³Ό κΆνμ νμ¬ tenantμ 컨ν μ€νΈ λ΄μμ νκ°λ©λλ€. ν tenantμ μ‘μΈμ€ κΆνμ΄ μλ μ¬μ©μλ μλμΌλ‘ λ€λ₯Έ tenantμ λν μ‘μΈμ€ κΆνμ λ°μ§ μμ΅λλ€. λ°λΌμ tenant μ§μμ μΈμ¦ νλ¦, μλ‘ κ³ μΉ¨ ν ν° λμ, UIμ λν΄ μμ±λ κΆν λ° μ°Έμ‘°λ₯Ό μ λ°μ΄νΈν©λλ€.
μμ±λ Blazor μ ν리μΌμ΄μ μμλ tenant λ° μΈμ¦ νλ¦μ κ΄λ¦¬νκΈ° μν΄ tenant μΈμ νλ©΄μ μΆκ°ν μ μμ΅λλ€. λ°±μλμμ μμ±λ μλν¬μΈνΈλ ꡬμ±λ νΈμ€νΈ, μ¬λ¬κ·Έ λλ κ²½λ‘ λμμμ tenant 컨ν μ€νΈλ₯Ό νμΈν λ€μ λ°μ΄ν° λ° κΆν λΆμ¬ κ²°μ μ tenant μλ³μλ₯Ό μ μ©ν μ μμ΅λλ€.
λ°μ΄ν° 격리 λ° μ ν
Linoλ μν°ν°κ° tenantλ³λ‘ μμ κΆμ μ μΈν μ μλλ‘ νμ¬ tenant μΈμ λλ©μΈ λͺ¨λΈλ§μ μ§μν©λλ€. SaaS μλ리μ€μμλ μ΄λ₯Ό ν΅ν΄ λΉμ¦λμ€ ν μ΄λΈμ΄ tenantλ³ λ°μ΄ν°λ₯Ό μ μ₯νλ λμμ 곡μ λͺ¨λμ΄ νμν tenant λ° μ¬μ©μ μ 보λ₯Ό κ³μ μμ ν μ μμ΅λλ€.
μμ±λ μν€ν μ²λ μ΄λ²€νΈμ Outbox ν¨ν΄μ μ¬μ©νμ¬ λͺ¨λ λͺ¨λμ μλ ID λλ ν λμ ν μ΄λΈμ μ§μ μ°κ²°νμ§ μκ³ λͺ¨λ κ°μ μ νν tenant λλ μ¬μ©μ λ°μ΄ν°λ₯Ό μ νν©λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λ κ²½κ³λ₯Ό λͺ ννκ² μ μ§νλ λμμ νλ©΄, API, κΆν λ° μΏΌλ¦¬κ° tenant 컨ν μ€νΈμ λ°λΌ κ³μ μλν©λλ€.
ν λμλ₯Ό μΆκ°ν ν μν₯μ λ°λ μλΉμ€μ λν λ§μ΄κ·Έλ μ΄μ μ μμ± λ° μ μ©νκ³ μμ±λ λΉλ° λ° API ν€λ₯Ό κ²ν νκ³ AppHostλ₯Ό μ€ννκ³ λ κ° μ΄μμ tenantλ₯Ό μ¬μ©νμ¬ μ ν¨μ±μ κ²μ¬νμ¬ λ°μ΄ν°, μ¬μ©μ, μν , κΆν λ° λΉμ¦λμ€ κΈ°λ‘μ΄ κ²©λ¦¬λ μνλ‘ μ μ§λλμ§ νμΈνμΈμ.
- 격리 κ²μ¦: λ€λ₯Έ tenantμ λ°μ΄ν°μ μ‘μΈμ€νλ €κ³ μλνλ ν μ€νΈλ₯Ό λ§λλλ€.
- κΆν κ²ν : μ¬μ©μλ μλ‘ λ€λ₯Έ tenantμμ μλ‘ λ€λ₯Έ μν μ κ°μ§ μ μμ΅λλ€.
- κ³ κ°μ μ λ’°νμ§ λ§μμμ€. κ²½λ‘, νΈμ€νΈ, μ¬λ¬κ·Έ λλ ν€λλ‘ μ 보λ₯Ό λ°λ tenantλ μΈμ¦λ μ¬μ©μμ νΈνλμ΄μΌ ν©λλ€.
