기능 추가

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 ์ƒˆ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•  ํ ๊ฒ€์‚ฌ ๊ฐ„๊ฒฉ
  • ๋ ˆ์ฝ”๋“œ ์ˆ˜ - ์‚ฌ์ดํด๋‹น ์ฒ˜๋ฆฌํ•  ์ตœ๋Œ€ ๋ ˆ์ฝ”๋“œ ์ˆ˜, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋ฐ ๋ฆฌ์†Œ์Šค ์†Œ๋น„ ์ œ์–ด

์ด๋Ÿฌํ•œ ์˜ต์…˜์€ ์‹œ์Šคํ…œ์„ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

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