Lino 시작하기

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

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

Lino๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ํ™˜๊ฒฝ์ด ์ œ๋Œ€๋กœ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”:

  • โœ… .NET 10.0 SDK ์ด์ƒ ์„ค์น˜. .NET ๋‹ค์šด๋กœ๋“œ
  • โœ… ํ„ฐ๋ฏธ๋„์—์„œ .NET CLI ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ๋‹ค์Œ์œผ๋กœ ํ™•์ธ: dotnet --version
  • โœ… ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Git ์„ค์น˜. Git ๋‹ค์šด๋กœ๋“œ
  • โœ… migrations ์ง€์›์„ ์œ„ํ•œ Entity Framework Core CLI ์„ค์น˜: dotnet tool install --global dotnet-ef
  • โœ… Docker Desktop ๋˜๋Š” Podman๊ณผ ๊ฐ™์€ OCI ํ˜ธํ™˜ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ.

ํ”Œ๋žซํผ ํ˜ธํ™˜์„ฑ

Lino๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด๋ฉฐ ์ฃผ์š” ์šด์˜ ์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • โœ… Windows
  • โœ… macOS
  • โœ… Linux

์„ค์น˜

Lino๋Š” ์ „์—ญ .NET ๋„๊ตฌ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜๊ธฐ ์ „์— .NET 10 SDK ์ด์ƒ์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

์ตœ์‹  ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

dotnet tool install --global Tolitech.Lino

์„ค์น˜ ํ›„ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ Lino๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”:

lino --version

์„ค์น˜๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์„ค์น˜๋œ ๋ฒ„์ „์ด ํ„ฐ๋ฏธ๋„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ธ์ฆ

Lino๋ฅผ ์„ค์น˜ํ•œ ํ›„ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋กœ๊ทธ์ธํ•˜์„ธ์š”:

lino auth login

๋‹ค์Œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:

  • ์‚ฌ์šฉ์ž: ์ด์ „์— ๋“ฑ๋กํ•œ ์ด๋ฉ”์ผ ์ฃผ์†Œ.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ: ๊ณ„์ •์— ์—ฐ๊ฒฐ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ.

์•„์ง ๊ณ„์ •์ด ์—†๋‹ค๋ฉด CLI์—์„œ ์ง์ ‘ ๋“ฑ๋กํ•˜์„ธ์š”:

lino user register

๋“ฑ๋ก ์ค‘์—๋Š” ๋‹ค์Œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค:

  • ์ด๋ฆ„: ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„.
  • ์„ฑ: ์‚ฌ์šฉ์ž์˜ ์„ฑ.
  • ์ด๋ฉ”์ผ: ๋กœ๊ทธ์ธ์œผ๋กœ๋„ ์‚ฌ์šฉ๋  ์ด๋ฉ”์ผ ์ฃผ์†Œ.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ: ์ตœ์†Œ 6์ž ์ด์ƒ์˜ ์•ˆ์ „ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ: ๊ฒ€์ฆ์„ ์œ„ํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ž๋™์œผ๋กœ ์ธ์ฆ๋ฉ๋‹ˆ๋‹ค.

์–ธ์–ด ๊ธฐ๋ณธ ์„ค์ •

๊ธฐ๋ณธ์ ์œผ๋กœ Lino CLI๋Š” ์˜์–ด en์œผ๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜ ์ค‘ ์›ํ•˜๋Š” ์–ธ์–ด๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

en | pt | es | de | fr | it | ja | ko | ru | zh

์ƒˆ ์–ธ์–ด๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”:

lino preferences culture set --name <culture>

<culture>๋ฅผ ์ง€์›๋˜๋Š” culture ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐ”๊พธ์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ํฌ๋ฅดํˆฌ๊ฐˆ์–ด๋Š” pt, ์˜์–ด๋Š” en, ์ŠคํŽ˜์ธ์–ด๋Š” es๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋Œ€ํ™”ํ˜• ๋ชฉ๋ก์—์„œ ์–ธ์–ด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

lino preferences culture set

UTF-8 ์ธ์ฝ”๋”ฉ ์กฐ์ •(์„ ํƒ ์‚ฌํ•ญ)

์ผ๋ณธ์–ด, ํ•œ๊ตญ์–ด, ๋Ÿฌ์‹œ์•„์–ด ๋˜๋Š” ์ค‘๊ตญ์–ด์ฒ˜๋Ÿผ ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ์žˆ๋Š” ์–ธ์–ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œํ•˜๋ ค๋ฉด ํ„ฐ๋ฏธ๋„์ด UTF-8 ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

Windows PowerShell์—์„œ๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ธ์ฝ”๋”ฉ์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

[console]::InputEncoding = [System.Text.Encoding]::UTF8
[console]::OutputEncoding = [System.Text.Encoding]::UTF8

์ฐธ๊ณ : Linux, macOS ๋ฐ Windows Terminal์—์„œ๋Š” UTF-8 ์ง€์›์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋ณธ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ฌธ์ž ํ‘œ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ตฌ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น

Lino๋Š” ์ž๋™ํ™”๋ฅผ ๋ช…๋ น ๊ทธ๋ฃน์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ทธ๋ฃน์€ solution ์ƒ์„ฑ, ์„œ๋น„์Šค ์ถ”๊ฐ€, ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง, APIs ๊ณต๊ฐœ, ํŽ˜์ด์ง€ ์ƒ์„ฑ, ํ†ตํ•ฉ ๊ตฌ์„ฑ, migrations ์ œ์–ด, ์•„ํ‹ฐํŒฉํŠธ ๋ฒ„์ „ ๊ด€๋ฆฌ, builds ์ค€๋น„์™€ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜ ์˜๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋จธ์‹ ์—์„œ ๊ฐ€์žฅ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฐธ์กฐ๋Š” ์„ค์น˜๋œ CLI ์ž์ฒด์˜ ๋„์›€๋ง์ž…๋‹ˆ๋‹ค. lino --help๋ฅผ ์‚ฌ์šฉํ•ด ์ „์ฒด ๋ช…๋ น ํŠธ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ , ์–ด๋–ค ๊ทธ๋ฃน์—์„œ๋“  --help๋ฅผ ์‚ฌ์šฉํ•ด ์˜ต์…˜, aliases, ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

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

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋ฃจํŠธ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ ๋„์›€๋ง์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

lino
lino --help
lino --help
lino project --help
lino database migrations --help
lino integration operation --help

์–ด๋–ค ๊ทธ๋ฃน์˜ ํ•˜์œ„ ๋ช…๋ น๊ณผ ์˜ต์…˜์ด๋“  ํ™•์ธํ•˜๋ ค๋ฉด ๋ช…๋ น ์ด๋ฆ„๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ --help์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์„ธ์š”.

lino <command>
lino <command> --help

์˜ˆ๋ฅผ ๋“ค์–ด project ๊ทธ๋ฃน์„ ์กฐํšŒํ•˜๋ฉด CLI๋Š” ๊ทธ๋ฃน ์„ค๋ช…, ์ผ๋ฐ˜์ ์ธ ์˜ˆ์ œ ๋ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•˜์œ„ ๋ช…๋ น์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

lino project --help
์„ค๋ช…:
    Lino ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ:
    lino project new --name MyProject
    lino project list

๋ช…๋ น:
    new     ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    list    ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
    delete  ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ์ฝ์„ ๋•Œ <...> ์•ˆ์˜ ๊ฐ’์€ ํ”„๋กœ์ ํŠธ์˜ ์‹ค์ œ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” ์ธ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด <ProjectName>์€ solution ์ด๋ฆ„์œผ๋กœ, <ServiceName>์€ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ, <culture>๋Š” pt ๋˜๋Š” en ๊ฐ™์€ ์ง€์› culture๋กœ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋ช…๋ น ๊ทธ๋ฃน:

๊ทธ๋ฃน์ฃผ์š” ๋ช…๋ น์šฉ๋„
project new, list, delete Lino ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋‚˜์—ดํ•˜๊ณ , ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
service new, list, delete backend ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋‚˜์—ดํ•˜๊ณ , ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
module new, list, delete ๋ชจ๋“ˆ์‹ ์„œ๋น„์Šค ์•ˆ์˜ ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋‚˜์—ดํ•˜๊ณ , ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
entity new, edit, list, delete ๋„๋ฉ”์ธ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํŽธ์ง‘ํ•˜๊ณ , ๋‚˜์—ดํ•˜๊ณ , ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
shadow-entity (shadow) new ๋‹ค๋ฅธ ๋ชจ๋“ˆ ๋˜๋Š” ์„œ๋น„์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์–ด๋œ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
enumeration (enum) new, edit, list, delete ๋„๋ฉ”์ธ ์—ด๊ฑฐํ˜•์„ ์ƒ์„ฑํ•˜๊ณ , ํŽธ์ง‘ํ•˜๊ณ , ๋‚˜์—ดํ•˜๊ณ , ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
value-object (vo) new, edit, list, delete Value Object๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํŽธ์ง‘ํ•˜๊ณ , ๋‚˜์—ดํ•˜๊ณ , ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
property (prop) delete ๋„๋ฉ”์ธ ์—”ํ„ฐํ‹ฐ์˜ ์†์„ฑ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
command new, list ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ, ํŠธ๋žœ์žญ์…˜ ๊ทœ์น™, ์˜๋„ ๊ฒ€์ฆ๊ณผ ๊ด€๋ จ๋œ ์“ฐ๊ธฐ ์œ ์Šค์ผ€์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
query new, list ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒ, ํ”„๋กœ์ ์…˜, ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜์— ์ดˆ์ ์„ ๋‘” ์ฝ๊ธฐ ์œ ์Šค์ผ€์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
api new, list ์œ ์Šค์ผ€์ด์Šค์šฉ API endpoints๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
web-app (webapp) new ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
page new, edit, list Blazor ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํŽธ์ง‘ํ•˜๊ณ , ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
event new, edit, list ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ ๋˜๋Š” ํ†ตํ•ฉ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
event-handler (handler) new, list ์ด๋ฒคํŠธ handlers๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
error-definition (error) new, list ํ‘œ์ค€ํ™”๋œ ์˜ค๋ฅ˜ ์ •์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
integration new, list, resource (new/list), operation (new/list), consume ํ†ตํ•ฉ, resources, ์ž‘์—… ๋ฐ ์†Œ๋น„์ž๋ฅผ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค.
feature background-job add, auth add, tenant add background job, ์ธ์ฆ, tenant ๊ธฐ๋Šฅ ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
database migrations add, remove, list, apply, revert Entity Framework Core migrations๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
secret list, set, remove, clear ํ”„๋กœ์ ํŠธ์˜ ๋กœ์ปฌ secrets๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
plan add AI ์ง€์› ์‹คํ–‰ ๊ณ„ํš์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
version show, list, bump ์„œ๋น„์Šค์™€ web apps์˜ ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ  ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
build - ์•„ํ‹ฐํŒฉํŠธ์™€ container images๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
user register Lino์˜ ์ธ์ฆ๋œ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
auth login, logout ์ธ์ฆ๊ณผ ๋กœ๊ทธ์•„์›ƒ์„ ํฌํ•จํ•ด CLI์˜ ๋กœ์ปฌ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
preferences culture set ๋Œ€ํ™”ํ˜• ๋ช…๋ น์— ํ‘œ์‹œ๋˜๋Š” ์–ธ์–ด ๊ฐ™์€ CLI ๋กœ์ปฌ ๊ธฐ๋ณธ ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ๋ช…๋ น์€ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ด„ํ˜ธ ์•ˆ์— ์งง์€ alias๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์ด๋ฆ„์€ ์ฝ๊ธฐ, ๋ฌธ์„œํ™”, ๊ต์œก, ์ž๋™ํ™” ๋ฐ ์ง€์›์˜ ์ฃผ์š” ์ฐธ์กฐ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ž‘

๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์ง€์†์ ์ธ ๋ฐœ์ „์— ๋Œ€๋น„๋œ ํ˜„๋Œ€์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ .NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ์„ธ์š”:

lino project new --name <ProjectName>

<ProjectName>์„ solution์˜ ์‹ค์ œ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด MyApp์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด lino project new --name MyApp์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ๋„๋ฉ”์ธ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์ธํ”„๋ผ, ์˜์†์„ฑ, API, ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ .NET solution์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ตฌ์กฐ๋Š” ์ฒซ commit๋ถ€ํ„ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ •์„ ๋ˆˆ์— ๋ณด์ด๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™, ๋ฐ์ดํ„ฐ ์ ‘๊ทผ, endpoints ๋ฐ ์šด์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๊ฐ™์€ ์œ„์น˜์— ์„ž์ด์ง€ ์•Š๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ์ ์œผ๋กœ MyApp์ด๋ผ๋Š” ์ดˆ๊ธฐ solution์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

MyApp/
โ”œโ”€โ”€ MyApp.slnx
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ Aspire/
โ”‚   โ”‚   โ”œโ”€โ”€ AppHost/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ MyApp.AppHost.csproj
โ”‚   โ”‚   โ””โ”€โ”€ ServiceDefaults/
โ”‚   โ”‚       โ””โ”€โ”€ MyApp.ServiceDefaults.csproj
โ”‚   โ””โ”€โ”€ Services/
โ”‚       โ””โ”€โ”€ Shared/
โ”‚           โ”œโ”€โ”€ Api/
โ”‚           โ”‚   โ””โ”€โ”€ MyApp.Shared.Api.csproj
โ”‚           โ”œโ”€โ”€ Application/
โ”‚           โ”‚   โ””โ”€โ”€ MyApp.Shared.Application.csproj
โ”‚           โ”œโ”€โ”€ Domain/
โ”‚           โ”‚   โ””โ”€โ”€ MyApp.Shared.Domain.csproj
โ”‚           โ”œโ”€โ”€ Infrastructure/
โ”‚           โ”‚   โ””โ”€โ”€ MyApp.Shared.Infrastructure.csproj
โ”‚           โ””โ”€โ”€ Infrastructure.Persistence/
โ”‚               โ””โ”€โ”€ MyApp.Shared.Infrastructure.Persistence.csproj
โ””โ”€โ”€ tests/

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

์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ

Lino๊ฐ€ ๋งŒ๋“  ์ดˆ๊ธฐ solution์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ธฐ์ˆ  ์ฑ…์ž„๋ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. CLI๋Š” ๋นˆ ํ”„๋กœ์ ํŠธ๋งŒ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹ , ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•œ ๊ณ„์ธต๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ–์ถ˜ ๊ธฐ๋ฐ˜์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

์˜์—ญ์ฑ…์ž„
Domain์—”ํ„ฐํ‹ฐ, Value Objects, enumerations, ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์•ฝ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค์— ์†ํ•œ ๊ทœ์น™์„ ๋ชจ์๋‹ˆ๋‹ค.
Applicationuse cases, commands, queries, ๊ฒ€์ฆ, handlers ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž…๋ ฅ/์ถœ๋ ฅ ๊ณ„์•ฝ์„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.
Infrastructure๋ณด์กฐ ์„œ๋น„์Šค, ํ†ตํ•ฉ, providers, ์ธ์ฆ, ๋ฉ”์‹œ์ง• ๋ฐ ํšก๋‹จ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
Persistencemappings, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปจํ…์ŠคํŠธ, migrations, ๊ตฌ์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฐ unit of work๋ฅผ ์ค‘์•™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
Api์™ธ๋ถ€ ์†Œ๋น„์ž๋ฅผ ์œ„ํ•ด endpoints, HTTP ๊ณ„์•ฝ, ํ•„ํ„ฐ, ์ธ์ฆ, ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์ž…๋ ฅ ๋ฌธ์„œ๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜๊ฐœ๋ฐœ ์ค‘ ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ์ปฌ ์‹คํ–‰, ๊ธฐ๋ณธ observability ๋ฐ ์„œ๋น„์Šค ๊ฐ„ ํ†ตํ•ฉ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
Tests์ฑ…์ž„๋ณ„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋„๋ฉ”์ธ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, APIs ๋ฐ ํ†ตํ•ฉ์„ ์ ์ง„์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

<ProjectName>์— ์ž…๋ ฅํ•œ ์ด๋ฆ„์€ solution์˜ ๊ธฐ์ˆ ์  ์ •์ฒด์„ฑ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. namespaces, assemblies, ์•„ํ‹ฐํŒฉํŠธ, ๊ตฌ์„ฑ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ฐธ์กฐ์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์งง๊ณ  ์•ˆ์ •์ ์ด๋ฉฐ ๋Œ€ํ‘œ์ ์ธ ์ด๋ฆ„์„ ์„ ํƒํ•˜์„ธ์š”.

์ฃผ์š” ์ด์ :

  • ๋ช…์‹œ์  ์•„ํ‚คํ…์ฒ˜: ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™, use cases, ์ธํ”„๋ผ, ์˜์†์„ฑ ๋ฐ ์ž…๋ ฅ ๊ณ„์•ฝ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆํ˜• ์ง„ํ™”: ์ปจํ…์ŠคํŠธ๊ฐ€ ์š”๊ตฌํ•  ๋•Œ ์ „ํ†ต์ ์ธ ์„œ๋น„์Šค, ๋ชจ๋“ˆํ˜• ๋ชจ๋†€๋ฆฌ์Šค, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐ SaaS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€๋น„๋œ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.
  • ์ผ๊ด€๋œ ๊ธฐ์ˆ  ํŒจํ„ด: DDD, Clean Architecture, CQRS, ์ด๋ฒคํŠธ, ํ†ตํ•ฉ, migrations, ํ…Œ์ŠคํŠธ ๋ฐ observability๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๊ณ„์  ์ž‘์—… ๊ฐ์†Œ: ๋ฐ˜๋ณต ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋„๋ฉ”์ธ, ๊ทœ์น™, ๊ณ„์•ฝ ๋ฐ ์ œํ’ˆ ๊ฒฐ์ •์— ์—๋„ˆ์ง€๋ฅผ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ: ๋ช…๋ช… ๊ทœ์น™, ํด๋” ๊ตฌ์„ฑ ๋ฐ ์ฑ…์ž„ ๊ตฌ๋ถ„์ด ํŒ€์› ๊ฐ„์˜ ๋ชจํ˜ธ์„ฑ์„ ์ค„์ž…๋‹ˆ๋‹ค.

Lino๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋นˆ ํด๋”๋‚˜ generic template์—์„œ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ opinionated ๊ธฐ๋ฐ˜์—์„œ ์‹œ์ž‘ํ•˜๋ฉฐ, ์ƒ์„ฑ๋˜๋Š” ๊ฐ ์•„ํ‹ฐํŒฉํŠธ๋Š” ๋ช…ํ™•ํ•œ ๊ธฐ์ˆ ์  ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์ ์ง„์ ์œผ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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