우리의 진행 상황과 다가오는 기능들을 추적하세요. 우리는 최상의 개발 경험을 제공하기 위해 끊임없이 진화하고 있습니다.
이 업데이트는 Microsoft가 .NET 10의 새 버전을 공식 출시하면 해당 버전을 기반으로 한 프로젝트 생성을 완벽히 지원하게 됩니다.
현재 Lino는 .NET 9를 기반으로 프로젝트를 생성하며, 향상된 성능, C# 13의 고급 기능, 최신 ASP.NET Core 통합 등 플랫폼의 모든 기능을 활용합니다.
향후 버전의 목표는 .NET 10에 대한 즉각적인 지원을 제공하고, 업데이트된 템플릿, 적절한 Target Framework
설정, 그리고 새로운 언어 및 런타임 기능에 맞춘 scaffolding을 갖추는 것입니다.
두 가지 주요 수준을 지원하는 테스트 자동 생성:
단위 테스트:
비즈니스 로직에 중점을 두고 개별 클래스 및 메서드에 대한 테스트 생성.
통합 테스트:
데이터베이스 및 외부 서비스와의 상호 작용을 시뮬레이션하여 구성 요소 간의 통합을 확인하는 테스트 생성.
개발 환경에서 REST 엔드포인트의 테스트 및 문서화를 용이하게 하기 위한 .http
파일 자동 생성 기능 구현.
ASP.NET Core의 Policies를 사용하는 권한 기반(PBAC) 접근 제어 시스템.
권한은 Source Generators를 통해 자동으로 생성되며 .NET에서 Policies로 등록됩니다.
이 권한을 사용하는 각 서비스는 시스템 권한 데이터베이스를 자동으로 갱신하는 이벤트를 발생시킵니다.
주요 특징:
_ Source Generators를 통한 권한 자동 생성
_ ASP.NET Core에서 Policies 자동 등록
_ 이벤트/메시지를 통한 권한 데이터베이스 동적 갱신
_ 역할 기반 단순성과 권한 기반 세분성을 결합한 하이브리드 RBAC 지원
장점:
_ 최고의 성능과 확장성
_ 자동화된 관리 및 간소화된 유지보수
_ 다양한 보안 시나리오에 대한 유연성
Minimal API로 생성된 엔드포인트에 대해 IFormFile
타입에 대한 네이티브 지원을 구현합니다. 이 기능은 파일 업로드가 가능한 경로를 자동으로 생성하며 다음을 포함합니다:
_ multipart/form-data
를 통한 업로드를 지원하는 엔드포인트 정의;
_ MIME 타입 및 최대 크기에 대한 자동 유효성 검사;
_ 로컬 저장소 지원 및 Azure Blob Storage, AWS S3와 같은 클라우드 서비스 통합;
이미지, 문서, 일반 미디어와 같은 파일의 안전하고 성능 높은 업로드가 필요한 애플리케이션에 적합합니다.
이 버전부터 Lino CLI는 생성된 파일에 대해 스마트 자동 병합을 수행합니다.
이전에는 Lino가 생성한 파일이 기존 파일을 직접 대체하여 개발자가 수동으로 변경한 내용이 덮어써질 수 있었습니다.
이제 3-way merge (원본 생성 파일, 사용자가 편집한 버전, 새로 생성된 파일) 전략을 통해 Lino는 사용자 맞춤화를 유지하면서 템플릿의 구조적 업데이트도 적용할 수 있습니다.
이 접근 방식의 이점:
_ 수동 코드의 실수로 인한 덮어쓰기를 방지합니다.
_ 템플릿 기반 프로젝트의 지속적인 발전을 촉진합니다.
_ 업데이트 중 수동 충돌을 줄입니다.
_ 로컬 맞춤화와 프레임워크 발전 간 통합을 개선합니다.
이제 Lino CLI로 생성된 프로젝트는 Source Generators 기반의 Tolitech.Presentation.API.Generators 라이브러리를 사용하여 Minimal API를 자동으로 등록할 수 있습니다.
이 접근 방식은 다음의 필요성을 대체합니다:
_ MapGet
, MapPost
등으로 각 엔드포인트를 수동으로 등록하는 작업
_ Reflection을 사용하여 라우트를 스캔하고 매핑하는 것 — 이는 성능에 큰 영향을 미칩니다.
Source Generators를 사용하면 컴파일 시간에 라우팅이 이루어지며, 최적화되고 깔끔하며 추적 가능한 코드가 생성됩니다.
주요 이점:
_ 수동 라우트 등록의 반복성과 장황함 제거
_ Reflection 사용 제거로 CPU 및 메모리 사용량 절감
_ 코드 구조 개선 및 책임 분리 향상
_ 컴파일 타임 검증을 통한 안전한 자동 라우트 생성
_ 프로젝트 유지보수 및 확장성 향상
이제 Tolitech.DependencyInjection.Generators 라이브러리를 사용하며, 이는 Tolitech.DependencyInjection.Extensions의 Reflection 기반 접근 방식을 대체합니다.
이 새로운 라이브러리는 .NET의 Source Generators 기능을 활용하여 컴파일 타임에 의존성 등록을 자동으로 생성합니다.
이것은 여러 가지 이점을 제공합니다:
_ 런타임에서 Reflection 제거로 애플리케이션 성능 향상
_ 예측 가능하고 추적 가능한 코드 생성
_ 컴파일 시점에서 오류를 조기에 감지
_ .NET 빌드 파이프라인과의 네이티브 통합
우리는 이제 Central Package Manager(CPM)을 사용합니다. 이는 다중 프로젝트 솔루션에서 NuGet 패키지를 관리하기 위한 현대적인 접근 방식입니다.
이를 통해 모든 패키지 버전이 Directory.Packages.props
파일에서 중앙에서 정의되므로 불일치를 제거하고 안전하고 일관된 업데이트를 용이하게 합니다.
이로 인해 프로젝트 간 버전 차이로 인한 오류가 줄어들고, 추적 가능성이 향상되며, 대규모 종속성 업데이트 프로세스가 간소화됩니다.
Lino는 이제 전통적인 .sln
의 현대적인 진화인 새로운 형식 .slnx
로 솔루션을 생성합니다.
XML 기반의 .slnx
는 사람과 도구 모두에게 더 읽기 쉬워 외부 시스템 및 CI/CD 파이프라인과의 통합 복잡성을 줄이기 위해 채택되었습니다.
또한, 더 깔끔한 구조는 버전 관리를 크게 향상시켜 변경 사항이 보다 예측 가능하고 검토하기 쉬워집니다.
이 변화는 .NET 생태계의 미래 방향성과 일치하며, 프로젝트 개발에서의 상호 운용성, 확장성 및 자동화를 촉진합니다.
Community 구독은 이제 .NET 9 및 Aspire 9.2.1을 기반으로 한 프로젝트 생성을 지원하며, 사용자가 플랫폼의 기능을 무료로 기술적으로 탐색할 수 있게 합니다.
이번 릴리스에는 다음이 포함됩니다:
_ 자동화된 scaffolding을 통한 서비스 및 엔터티 생성;
_ 데이터베이스 선택 및 초기 설정 완벽하게;
_ EF Core Migrations
단계까지의 기능적 생성.
마이크로서비스와 모듈형 모놀리트와 같은 고급 기능은 유료 플랜에 제한되지만, 이 버전은 생성된 아키텍처, 코드 품질 및 현대적인 .NET 생태계와의 통합을 평가할 수 있는 강력한 기반을 제공합니다.
CLI는 이제 프로젝트의 모든 서비스 또는 모듈에 대한 마이그레이션 생성을 용이하게 하는 lino database migrations add
명령어를 제공합니다.
이 기능은 빌드 버전에 연결된 마이그레이션 스크립트 생성을 자동화하고 변경 사항을 일관되게 문서화할 수 있게 합니다.
주요 이점:
_ 간단하고 직관적인 명령어로 서비스 또는 모듈별 빠른 마이그레이션 생성.
_ 프로젝트 버전 관리와 호환되는 .sql
스크립트 자동 생성.
_ 분산 아키텍처에서도 데이터베이스 버전 관리 용이.
_ 안전하고 감사 가능한 방식으로 데이터베이스 구조 변경 표준화 및 문서화.
_ 애플리케이션 빌드 및 배포 흐름과 자연스럽게 통합.
새로운 버전 관리 기능을 통해 도구로 생성된 서비스 및 웹 애플리케이션의 기존 버전을 나열하고 SemVer(시맨틱 버저닝) 표준에 따라 버전을 bump할 수 있습니다. 이 기능은 릴리스 주기의 추적 가능성, 표준화 및 제어를 향상시킵니다.version
명령어를 사용하면 각 서비스 또는 애플리케이션의 버전 번호를 손쉽게 설정 및 업데이트할 수 있어 감사 추적이 용이하고 개발 흐름에 모범 사례를 통합할 수 있습니다.build
명령어도 개선되어 정의된 버전 태그를 포함한 Docker 이미지를 생성하여 패키징을 간소화하고 배포 준비를 용이하게 합니다.
이러한 개선 사항은 릴리스 관리의 일관성과 예측 가능성을 높여 개발 및 운영 팀에 더 나은 투명성을 제공합니다.
Command (Post, Put, Patch) 및 Query (Get) 유형 아티팩트 생성 시 고려할 속성을 사용자 지정합니다.
이 기능은 다음을 제공합니다:
_ 엔터티 scaffolding 과정에서 속성을 선택할 수 있는 CLI의 인터랙티브한 인터페이스;
_ 선택된 필드만 포함된 input/output 객체 자동 생성;
_ REST API에서 페이로드 커스터마이징을 완벽히 지원하여 데이터 흐름에 대한 유연성과 제어력 향상;
_ 필수 규칙 및 일관성을 준수하는 유효성 검사 및 데이터 계약과의 통합.
이 향상된 기능은 아티팩트 모델링의 세분성을 높여 CLI가 생성하는 아키텍처를 통해 노출, 저장 또는 조회될 내용을 개발자가 정밀하게 제어할 수 있도록 합니다.
Lino CLI에 자동 파일 버전 관리 및 백업 메커니즘이 구현되어 파일 생성 및 덮어쓰기 과정에서의 보안성과 추적 가능성을 보장합니다.
모든 생성된 파일은 /.lino/files/.../received/
폴더에 저장되어 시간순으로 정리되고 쉽게 찾을 수 있습니다.
대체된 파일은 /.lino/files/.../replaced/
폴더에 보관되어 필요 시 이전 버전으로 복구할 수 있습니다. 이러한 백업 구조는 더 나은 제어와 보안을 제공하며, 특히 협업 및 자동화된 개발 환경에서 생성된 파일에 대한 완전한 감사가 가능합니다.
프론트엔드 및 백엔드 프로젝트를 위한 완전한 인증 및 권한 부여 구현으로, JWT (JSON Web Tokens) 기반이며 ASP.NET Core의 맞춤형 Authorization Policies
를 통한 세밀한 권한 제어를 제공합니다.
주요 내용:
_ JWT 발행 및 검증을 통한 안전한 로그인.
_ 사용자 정의 정책(Claims 및 Roles)에 기반한 권한 부여.
_ 생성된 API와 프론트엔드(Blazor) 간 자동 통합.
_ 사용자 권한에 따른 경로 및 컴포넌트 보호.
장점:
_ 현대 애플리케이션을 위한 강력한 보안.
_ 프로필 및 도메인별 접근 모델 표준화.
_ 애플리케이션 계층 간 안전하고 통합된 경험.
_ 기업 상황에 맞게 확장 또는 적응 용이.
이제 하나 이상의 프론트엔드를 생성된 프로젝트에 추가할 수 있으며, Blazor Web Apps
의 초기 지원(서버 및 WebAssembly 모델 포함)이 제공됩니다.
이 프론트엔드는 도구에서 생성된 API와 자동으로 통합되어 백엔드 엔드포인트에 직접 호출하고 데이터베이스에 데이터를 저장하는 완전한 CRUD 페이지를 생성할 수 있습니다.
주요 내용:
_ 도메인 엔터티 기반 UI 생성.
_ 생성된 API와의 네이티브 통신.
_ 엔드투엔드 기능: 프론트엔드, 백엔드, 데이터베이스가 함께 작동.
_ 동일 프로젝트 내 다중 프론트엔드 가능 (예: 관리자, 포털, 공개).
장점:
_ 인터페이스 개발 속도 향상.
_ 재작업 및 수동 통합 감소.
_ 통합된 내비게이션, 스타일 및 데이터 접근 표준.
_ 자동 CRUD 페이지 생성으로 생산성 향상.
우리는 통합 이벤트 전송의 신뢰성을 보장하기 위해 Transactional Outbox 패턴을 구현했습니다.
애플리케이션 트랜잭션 중에 이벤트를 직접 게시하는 대신, 이제 데이터베이스 같은 트랜잭션 내 특정 테이블에 등록됩니다.
이후 background job이 이 아웃박스를 읽고 실제 이벤트를 발송합니다.
이 접근 방식의 장점:
_ 데이터베이스 변경 사항과 이벤트 게시 간 일관성을 보장합니다.
_ 중간 실패 시 메시지 손실을 방지합니다.
_ 게시된 이벤트의 재전송 및 감사 제어가 가능합니다.
_ 이벤트 중심 아키텍처 및 마이크로서비스의 모범 사례와 일치합니다.
Hangfire
라이브러리를 사용하여 생성된 서비스 — 단순하든 모듈형이든 — 에 Background Jobs 기능을 포함하는 옵션이 추가되었습니다.
이를 통해 프로젝트는 기본적으로 백그라운드 작업의 예약 및 실행 기능을 갖추게 되며, 다음을 포함합니다:
_ 반복(cron), 예약 또는 즉시 실행.
_ 통합 대시보드를 통한 모니터링.
_ 작업의 안정적인 저장 및 재처리.
이 메커니즘은 Transactional Outbox Pattern과 함께 사용할 수도 있어, 부분 실패나 분산 시나리오에서도 신뢰할 수 있는 통합 이벤트 전송을 보장합니다.
주요 이점:
_ 반복적이고 시간이 많이 걸리는 작업을 메인 흐름을 차단하지 않고 자동화.
_ 높은 복원력과 백그라운드 작업의 안정성.
_ Outbox 패턴과의 즉시 통합으로 신뢰성 있는 이벤트 처리.
_ 서비스별 작업의 쉬운 설정 및 사용자 정의.
_ 실행 상태 점검 및 제어를 위한 내장 대시보드.
MassTransit
의 추상화 및 고급 기능을 활용하여 RabbitMQ
와 함께 비동기 메시징 지원을 구성할 수 있는 기능이 추가되었습니다.
이를 통해 생성된 서비스들은 이벤트와 분산 명령을 사용하여 느슨하게 결합되고 탄력적으로 통신할 수 있습니다.
통합 주요 특징:
_ RabbitMQ를 이용한 자동화된 전송 구성.
_ 의존성 주입을 통한 MassTransit 이벤트 발행 및 수신.
_ 높은 신뢰성을 위한 Transactional Outbox 패턴 호환.
장점:
_ 이벤트 기반 통신을 통한 높은 확장성.
_ 생산자와 소비자 간의 결합도 감소.
_ 높은 장애 허용성과 자동 재처리.
_ 비동기 비즈니스 흐름 유지보수 및 확장 용이성.
강력한 Unit of Work 메커니즘이 구현되었으며, 전체 트랜잭션 제어, 도메인 이벤트 관리, 통합 이벤트 게시(Outbox Pattern), 자동 롤백 및 작업 성공/실패에 따른 Result
패턴을 지원합니다.
주요 내용:
_ 격리 수준 제어가 포함된 명시적 트랜잭션 생성.
_ 데이터 지속성과 동기화된 Domain Events 게시.
_ Outbox Pattern을 통한 느슨한 결합의 Integration Events 게시.
_ 제약 조건 검증을 지원하는 자동 롤백 및 예외 처리.
_ 작업의 Result
에 따른 커밋 조건.
_ 이벤트, 트랜잭션 및 오류에 대한 구조화된 로그.
장점:
_ 데이터베이스 기록과 생성된 이벤트 간의 트랜잭션 일관성.
_ 기본 SaveChanges 사용 또는 전체 흐름 제어의 유연성.
_ 단위 테스트 및 오류 추적의 용이성.
_ MediatR 지원을 포함한 도메인과 인프라의 명확한 분리.
이제 생성된 각 서비스별로 사용할 데이터베이스를 개별적으로 지정할 수 있으며, SQL Server 및 PostgreSQL을 기본적으로 지원합니다.
이 접근 방식은 각 서비스가 전용 데이터베이스를 가질 수 있도록 하여 완전한 격리를 보장하고 실제 마이크로서비스 아키텍처에 적합한 구현을 용이하게 합니다.
모듈형 서비스의 경우, 애플리케이션은 여전히 서비스당 하나의 데이터베이스를 사용하되 각 모듈은 schema
로 분리되어 조직화 및 응집력을 유지합니다.
주요 이점:
_ 서비스 간 데이터 격리로 보안성 및 책임 구분 향상.
_ 독립 데이터베이스를 통한 점진적인 마이크로서비스 전환 가능.
_ 모듈형 서비스에서 schema 기반 분리로 유지보수 및 도메인 이해 용이.
_ 서비스별로 적합한 DBMS를 자유롭게 선택 가능.
_ 테스트, 개별 배포, 수평 확장 용이.
Lino CLI는 이제 프로젝트를 생성할 때 개발자가 단순 서비스 (전통적 방식) 또는 모듈형 서비스 중에서 선택할 수 있도록 하며 필요에 따라 두 가지를 모두 자유롭게 조합할 수 있습니다.
이 접근 방식은 다양한 아키텍처 스타일을 직접 지원합니다:
단순 서비스: 마이크로서비스 기반 솔루션 구성에 적합하며 전통적인 단일 모놀리식 애플리케이션을 직접적이고 독립적으로 구축할 수 있습니다.
모듈형 서비스: 애플리케이션 도메인을 Bounded Contexts로 조직하여 책임 분리와 컴포넌트 간 응집을 개선한 모듈형 모놀리식 도입을 용이하게 합니다.
필요에 따라 단순 서비스, 모듈형 서비스 또는 두 가지 모두 원하는 만큼 추가할 수 있습니다.
이 접근 방식의 장점:
_ 아키텍처 모델링의 유연성 향상.
_ 모놀리식에서 마이크로서비스로의 점진적 확장 용이.
_ 도메인 또는 컨텍스트별 명확한 책임 분리.
_ 코드 조직 향상 및 현대적 아키텍처 모범 사례 준수.
_ 결합도 감소와 유지보수성 향상.
마이크로서비스로 개발하거나 모듈형 모놀리식 아키텍처를 채택하세요 — 애플리케이션에 가장 적합한 경로를 직접 선택할 수 있습니다.
Microsoft.Extensions.Caching.Hybrid
라이브러리를 사용하여 하이브리드 캐시에 대한 기본 지원이 추가되었습니다.
이 구현은 메모리 캐시(MemoryCache)와 분산 캐시(DistributedCache)를 결합하여 두 방식의 장점을 모두 제공합니다.
이 접근 방식은 자주 요청되는 항목에 대해 매우 빠른 응답을 제공하면서, 분산 환경에서 동기화 및 확장성을 유지합니다.
하이브리드 전략의 이점:
_ 로컬 메모리에서 즉시 읽기를 통한 고성능.
_ 분산 캐시를 통한 인스턴스 간 데이터 공유 및 지속성.
_ 데이터베이스 및 외부 API 호출 감소.
_ 다중 복제본 애플리케이션의 수평 확장성 향상.
_ 두 캐시 계층 간의 스마트한 동기화.
성능과 일관성을 요구하면서도 아키텍처 유연성을 유지해야 하는 시나리오에 이상적입니다.
Lino CLI는 이제 여러 언어를 통합 지원하는 프로젝트를 생성하며, 다음 문화권에 대한 자동 번역을 포함합니다:
en
, pt-BR
, es
, fr
, it
, de
, ja
, ko
, zh-Hans
및 ru
.
리소스 파일(resx)은 기본 언어를 기반으로 자동 생성되며, 내용은 자동으로 번역되어 글로벌 애플리케이션에서 즉시 사용 가능합니다.
다국어 지원의 장점:
_ 다양한 지역 및 문화에 맞춘 애플리케이션 제작을 용이하게 합니다.
_ 국제화에 필요한 시간을 단축합니다.
_ .NET 로컬라이제이션 시스템과의 네이티브 통합.
_ 다국어 애플리케이션에서 최종 사용자 경험을 개선합니다.
_ 빠르게 글로벌 시장을 위한 솔루션 확장이 가능합니다.
Lino CLI에서 생성된 코드는 이제 LoggerMessage를 사용하여 보다 효율적이고 성능 좋은 로깅을 수행합니다.
ILogger
의 일반적인 확장 메서드와 달리 값 타입의 boxing이 발생하고 런타임 할당에 영향을 주는 반면, LoggerMessage 패턴은 각 로그 메시지에 대해 강력한 타입의 정적 Actions
를 생성합니다.
이 접근법의 장점:
_ 메모리 할당을 크게 줄임.
_ int
, Guid
, DateTime
등의 값 타입에 대한 boxing
방지.
_ 대량 로그 시나리오에서 더 나은 성능.
_ 로그 메시지의 표준화 및 중앙 집중화.
_ 감사, 진단 및 모니터링 시 더 명확함.
이 개선은 성능과 추적성이 중요한 API 및 백엔드 서비스에서 특히 중요합니다.
Lino CLI는 이제 Strongly Typed Ids에 대한 선택적 지원을 제공하며, Guid
또는 int
와 같은 일반적인 타입 대신 특정한 강력한 타입으로 엔티티 식별자를 표현할 수 있습니다.
이 기능은 잘못된 엔티티 간 식별자 할당과 같은 일반적인 오류를 방지하고, 코드의 표현력을 높여 도메인에 더 잘 부합하게 만듭니다.
Strongly Typed Ids의 장점:
_ 컴파일 시점의 강력한 타입 안정성.
_ 서로 다른 엔티티 간의 실수로 인한 할당 방지.
_ 코드의 가독성과 의도 명확성 향상.
_ 도메인 내 식별자의 추적 및 디버깅 용이.
_ EF Core, JSON 직렬화 및 유효성 검사와 통합.
이 기능은 선택 사항이며, 프로젝트 생성 시 활성화할 수 있습니다.
생성된 프로젝트는 이제 .NET 생태계의 주요 분석기를 사용하여 정적 코드 분석 지원을 설정할 수 있습니다.
이 도구들은 빌드에 직접 통합되어 형식, 스타일, 아키텍처 문제 및 개발 초기 단계에서의 잠재적인 논리 오류를 식별하는 데 도움을 줍니다.
장점:
_ 처음부터 코드의 일관성과 표준화를 촉진합니다.
_ 버그와 잘못된 관행을 조기에 감지합니다.
_ 코드 리뷰와 기술 온보딩을 용이하게 합니다.
_ 코드베이스의 품질과 유지보수성을 향상시킵니다.
_ 일반적인 오류를 방지하고 .NET의 모범 사례 준수를 개선합니다.
구성은 프로젝트별로 맞춤화할 수 있어 원하는 엄격성 수준에서 더 큰 유연성을 제공합니다.
Tolitech.Results 라이브러리를 만들어 .NET에서 Result Pattern을 완전하고 유연하게 구현했습니다.
이 라이브러리는 성공 또는 실패한 작업 결과를 HTTP 상태, 메시지, 오류, 제목, 세부 사항 및 선택적 데이터(Result<T>
지원 포함)를 포함하는 구조화된 객체로 캡슐화합니다.
Result Pattern 사용의 이점:
_ 애플리케이션 전체 작업 반환 표준화.
_ 흐름 제어로서 예외 감소.
_ 작업의 조합 및 체이닝 용이.
_ 계층 및 서비스 간 더 나은 통신 지원.
_ HTTP API, 검증 및 오류 메시지와의 원활한 통합.
_ 디버깅 및 구조화된 로깅 경험 향상.
또한, Tolitech.Results.Http 및 Tolitech.Results.Guards 같은 확장이 REST API 및 방어적 검증과의 통합을 확장합니다.