기능 추가

API 핡심과 ν”„λ‘ νŠΈμ—”λ“œ 외에도, μ‹€μ œ ν”„λ‘œμ νŠΈμ—μ„œλŠ” λ³΄μ•ˆ, μ ‘κ·Ό μ œμ–΄ 및 λ°±κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€ 싀행을 μœ„ν•œ μΆ”κ°€ κΈ°λŠ₯이 자주 ν•„μš”ν•©λ‹ˆλ‹€.


LinoλŠ” μ΄λŸ¬ν•œ κΈ°λŠ₯을 ν‘œμ€€ν™”λœ λ°©μ‹μœΌλ‘œ μΆ”κ°€ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λ©°, λ°±μ—”λ“œ(μ—”λ“œν¬μΈνŠΈ)와 ν”„λ‘ νŠΈμ—”λ“œ(Blazor μ• ν”Œλ¦¬μΌ€μ΄μ…˜) λͺ¨λ‘μ— λ°˜μ˜λ©λ‹ˆλ‹€.

λ³΄μ•ˆ 및 인증

인증은 λͺ¨λ“  λ³΄μ•ˆ μ‹œμŠ€ν…œμ˜ κΈ°λ³Έμž…λ‹ˆλ‹€. LinoλŠ” APIμ—μ„œ Bearer 방식을 μ‚¬μš©ν•˜μ—¬ JWT(JSON Web Tokens) 기반 인증을 μ§€μ›ν•©λ‹ˆλ‹€.

일반적인 인증 흐름:

1. μ‚¬μš©μžκ°€ 둜그인 μˆ˜ν–‰(μ—”λ“œν¬μΈνŠΈ λ˜λŠ” μ „μš© νŽ˜μ΄μ§€λ₯Ό 톡해).
2. μ‚¬μš©μž 정보, μ—­ν•  및 κΆŒν•œμ„ λ‚˜νƒ€λ‚΄λŠ” claimsκ°€ ν¬ν•¨λœ JWT λ°œκΈ‰.
3. λͺ¨λ“  API μš”μ²­μ€ 헀더에 토큰 포함: Authorization: Bearer <token>
4. 인증 미듀웨어가 토큰을 κ²€μ¦ν•˜κ³  μ„œλͺ…κ³Ό 만료λ₯Ό 확인.

μ •μ±… 기반 κΆŒν•œ λΆ€μ—¬

LinoλŠ” μ„ΈλΆ„ν™”λœ κΆŒν•œ λΆ€μ—¬λ₯Ό μœ„ν•΄ μ •μ±…(Policies)을 μ‚¬μš©ν•©λ‹ˆλ‹€:

  • 각 μž‘μ—…μ€ νŠΉμ • 정책이 ν•„μš”ν•  수 있음(예: People.Read, People.Create).
  • 정책은 AddAuthorization을 톡해 ꡬ성.
  • μ—”λ“œν¬μΈνŠΈλŠ” λ‹€μŒμ„ μ„ μ–Έν•˜μ—¬ 보호 κ°€λŠ₯: .RequireAuthorization

Lino ν”„λ‘œμ νŠΈμ— λ³΄μ•ˆ μΆ”κ°€

ν”„λ‘œμ νŠΈμ— λ³΄μ•ˆμ„ μΆ”κ°€ν•˜λ €λ©΄ λ‹€μŒμ„ μ‹€ν–‰:

lino features auth add

CLI μΈν„°λž™ν‹°λΈŒ λ§ˆλ²•μ‚¬κ°€ λ‹€μŒ 섀정을 μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ – λ³΄μ•ˆ λ¦¬μ†ŒμŠ€κ°€ ꡬ성될 μ„œλΉ„μŠ€.
  • λͺ¨λ“ˆ – λ³΄μ•ˆμ΄ μ„€μΉ˜λ  νŠΉμ • λͺ¨λ“ˆ(λͺ¨λ“ˆν˜• μ„œλΉ„μŠ€μ—λ§Œ 적용).
  • Access Token 수λͺ… – μ•‘μ„ΈμŠ€ ν† ν°μ˜ 유효 κΈ°κ°„.
  • Refresh Token 수λͺ… – κ°±μ‹  ν† ν°μ˜ 유효 κΈ°κ°„.
  • μ‚¬μš©μž μ‹λ³„μž μœ ν˜• – UserId둜 μ‚¬μš©λ˜λŠ” 데이터 μœ ν˜• μ •μ˜(int, long λ˜λŠ” Guid).

μ΄λŸ¬ν•œ 섀정은 인증/κΆŒν•œ λΆ€μ—¬ νŒŒμ΄ν”„λΌμΈμ΄ μžλ™μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ APIμ—μ„œ λ°”λ‘œ μ‚¬μš©ν•  수 있으며 Blazor와 ν†΅ν•©λ©λ‹ˆλ‹€.

λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…

λ§Žμ€ μ‹œμŠ€ν…œμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 λ°±κ·ΈλΌμš΄λ“œ 비동기 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€:

  • 이메일 전솑
  • 리포트 생성
  • μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ 동기화

LinoλŠ” μž‘μ—… μ˜€μΌ€μŠ€νŠΈλ ˆμ΄ν„°λ‘œ Hangfireλ₯Ό 기본적으둜 μ§€μ›ν•©λ‹ˆλ‹€.

Hangfire의 μž₯점

  • 비동기 μž‘μ—…μ˜ μ•ˆμ •μ μΈ μ‹€ν–‰
  • λ‚΄μž₯ λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œ
  • 반볡 λ˜λŠ” μ˜ˆμ•½ μž‘μ—… 지원
  • λ°μ΄ν„°λ² μ΄μŠ€μ— μž‘μ—…μ˜ μ•ˆμ •μ μΈ μ˜μ†μ„±

Outbox λ©”μ‹œμ§€μ™€ 이벀트 톡합

비동기 ν†΅ν•©μ˜ 일관성을 보μž₯ν•˜κΈ° μœ„ν•΄ LinoλŠ” Outbox Message νŒ¨ν„΄μ„ μ±„νƒν•©λ‹ˆλ‹€.

λΉ„μ¦ˆλ‹ˆμŠ€ μž‘μ—…(예: μ£Όλ¬Έ 생성)을 μˆ˜ν–‰ν•˜λ©΄, ν•΄λ‹Ή 이벀트(OrderCreated)κ°€ 도메인 μƒνƒœλ₯Ό μ €μž₯ν•˜λŠ” λ™μΌν•œ νŠΈλžœμž­μ…˜μ—μ„œ Outbox ν…Œμ΄λΈ”μ— μ €μž₯λ©λ‹ˆλ‹€. λ°±κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„Έμ„œλŠ” Outbox ν…Œμ΄λΈ”μ„ 읽고 이벀트λ₯Ό λ©”μ‹œμ§€ μ‹œμŠ€ν…œ(RabbitMQ, Kafka λ“±)에 κ²Œμ‹œν•©λ‹ˆλ‹€.

Outbox의 μž₯점:

  • μ›μžμ„± β†’ λ°μ΄ν„°λ² μ΄μŠ€μ™€ κ²Œμ‹œλœ μ΄λ²€νŠΈκ°€ 동기화 μƒνƒœ μœ μ§€
  • μ‹ λ’°μ„± β†’ μ‹€νŒ¨ μ‹œμ—λ„ 이벀트 손싀 μ—†μŒ
  • ν™•μž₯μ„± β†’ μ—¬λŸ¬ μ†ŒλΉ„μžκ°€ 이벀트λ₯Ό 처리 κ°€λŠ₯

이 λͺ¨λΈμ€ λΆ„μ‚° μ•„ν‚€ν…μ²˜μ—μ„œ μ•ˆμ „ν•˜κ³  μ•ˆμ •μ μΈ 톡합을 보μž₯ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μΆ”κ°€ κΈ°λŠ₯을 톡해 LinoλŠ” κ°•λ ₯ν•œ λ³΄μ•ˆ, μ„Έλ°€ν•œ μ ‘κ·Ό μ œμ–΄, μ‹ λ’°ν•  수 μžˆλŠ” 비동기 처리λ₯Ό μ œκ³΅ν•˜λ©°, ν˜„λŒ€ ν”„λ‘œλ•μ…˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν•©λ‹ˆλ‹€.

Lino ν”„λ‘œμ νŠΈμ— λ°±κ·ΈλΌμš΄λ“œ μž‘μ—… κΈ°λŠ₯ μΆ”κ°€

비동기 μ²˜λ¦¬λŠ” μ•Œλ¦Ό 전솑, 리포트 생성, 이벀트 κ²Œμ‹œ λ“± μ£Ό μš”μ²­ 흐름을 μ°¨λ‹¨ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” μž‘μ—…μ— ν•„μˆ˜μ μž…λ‹ˆλ‹€.

LinoλŠ” 단일 λͺ…λ ΉμœΌλ‘œ λ°±κ·ΈλΌμš΄λ“œ μž‘μ—… 지원(라이브러리 μ‚¬μš©)을 ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

lino features background-job add

CLIλŠ” λ‹€μŒ ꡬ성 λ§€κ°œλ³€μˆ˜λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ – λ°±κ·ΈλΌμš΄λ“œ μž‘μ—… κΈ°λŠ₯이 좔가될 μ„œλΉ„μŠ€
  • 라이브러리 – μž‘μ—… μ‹€ν–‰ 및 μ˜ˆμ•½μ„ μœ„ν•œ μ„ νƒλœ 라이브러리
  • 체크 및 처리 간격 - Outbox μƒˆ λ©”μ‹œμ§€λ₯Ό 확인할 큐 검사 간격
  • λ ˆμ½”λ“œ 수 - 사이클당 μ²˜λ¦¬ν•  μ΅œλŒ€ λ ˆμ½”λ“œ 수, 병렬 처리 및 λ¦¬μ†ŒμŠ€ μ†ŒλΉ„ μ œμ–΄

μ΄λŸ¬ν•œ μ˜΅μ…˜μ€ μ‹œμŠ€ν…œμ„ ν™•μž₯ κ°€λŠ₯ν•˜κ³  μ•ˆμ •μ μœΌλ‘œ κ΅¬μ„±ν•˜μ—¬ λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ˜ μ‹ λ’°ν•  수 μžˆλŠ” 싀행을 보μž₯ν•©λ‹ˆλ‹€.

처리되지 않은 오류가 발생했습니다. 새로 고침 πŸ—™