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와 같이 κ΅¬μ„±λœ λ©”μ‹œμ§€ λ²„μŠ€λ₯Ό 톡해 이벀트λ₯Ό κ²Œμ‹œν•©λ‹ˆλ‹€.

  1. λͺ…령은 λ„λ©”μΈμ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜κ³  이 λ³€κ²½ 사항을 νŠΈλžœμž­μ…˜μ— μ €μž₯ν•©λ‹ˆλ‹€.
  2. ν•Έλ“€λŸ¬λŠ” Outbox에 톡합 이벀트(예: μ£Όλ¬Έ 생성과 κ΄€λ ¨λœ 이벀트)λ₯Ό λ“±λ‘ν•©λ‹ˆλ‹€.
  3. Hangfire μž‘μ—…μ€ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ λ©”μ‹œμ§€ 일괄 처리λ₯Ό μ°¨λ‹¨ν•˜κ³  μ΄λŸ¬ν•œ λ©”μ‹œμ§€λ₯Ό 처리 ​​쀑인 κ²ƒμœΌλ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
  4. 각 λ©”μ‹œμ§€λŠ” 이벀트 λ²„μŠ€μ— μ˜ν•΄ μ—­μ§λ ¬ν™”λ˜κ³  κ²Œμ‹œλ©λ‹ˆλ‹€.
  5. μ„±κ³΅ν•œ λ©”μ‹œμ§€λŠ” 처리된 κ²ƒμœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. μ‹€νŒ¨ν•œ λ©”μ‹œμ§€λŠ” λ‚˜μ€‘μ— λΆ„μ„ν•˜κ±°λ‚˜ μž¬μ‹œλ„ μ „λž΅μ„ μœ„ν•΄ 였λ₯˜ 정보λ₯Ό λ³΄μ‘΄ν•©λ‹ˆλ‹€.

κ·Έ κ²°κ³Ό λ°μ΄ν„°λ² μ΄μŠ€μ™€ 기둝된 이벀트 κ°„μ˜ μ›μžμ„±, 였λ₯˜ λ°œμƒ μ‹œ μ΄λ²€νŠΈκ°€ μ†μ‹€λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” μ•ˆμ •μ„±, μ—¬λŸ¬ μ†ŒλΉ„μžκ°€ κ²Œμ‹œλœ λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” ν™•μž₯성이 κ΅¬ν˜„λ©λ‹ˆλ‹€.

μƒμ„±λœ μž‘μ—…μ—λŠ” 이미 μ„±κ³΅μ μœΌλ‘œ 처리된 였래된 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, 이름, 슬러그, μƒνƒœ, 격리 λͺ¨λ“œ 및 μ—°κ²° λ¬Έμžμ—΄ μ°Έμ‘°λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
  • TenantBranding tenant별 νŠΉμ • μ‹œκ°μ  λ™μž‘μ— λŒ€ν•œ λΈŒλžœλ”© 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
  • TenantDomain 호슀트 λ˜λŠ” 도메인을 tenant에 λ§€ν•‘ν•©λ‹ˆλ‹€.
  • TenantStatus 그리고 IsolationMode tenant 수λͺ… μ£ΌκΈ° 및 데이터 격리 μ˜΅μ…˜μ„ μ •μ˜ν•©λ‹ˆλ‹€.
  • μƒμ„±λœ ꡬ성은 ν”„λ‘œμ νŠΈμ˜ 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λŠ” 인증된 μ‚¬μš©μžμ™€ ν˜Έν™˜λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
처리되지 않은 오류가 발생했습니다. 새로 고침 πŸ—™