라이선스
기능, 라이선스 등급 및 라이선스 서비스
이 페이지는 라이선스가 Doconut의 동작을 어떻게 형성하는지에 대한 런타임 레퍼런스입니다: 각 라이선스 상태가 허용하는 것, 기능이 부여되는 방식, 그리고 코드에서 이를 모두 확인하는 방법. (라이선스를 로드하는 방법은 Getting Started → License Setup을 참조하세요.)
라이선스 상태와 그 역할
| 상태 | 문서 열기? | 워터마크 | 기능 |
|---|---|---|---|
| 전체(유료) 라이선스 (구독/업데이트 기간 내) | 예 | 없음 | 구매된 항목(Has* 플래그) |
| 임시 라이선스 (Developer/NFR — 평가 라이선스, 만료일 이전) | 예 | 없음 | 전체 — 일괄 부여 (평가 퍼널) |
| 만료 (만료일이 지난 임시 라이선스 또는 갱신일이 지난 유료 구독) | 예 | 평가 워터마크 | 부여된 기능 없음 |
| 라이선스 파일 없음 | 예 | 평가 워터마크 | 부여된 기능 없음 |
| 발견되었지만 거부됨 (잘못된 서명, 변조, 블랙리스트, 또는 라이선스 버전 윈도우보다 최신 빌드) | 아니오 — 모든 열기에 LicenseException | — | — |
두 가지 중요한 점:
- 누락된 라이선스는 임시 라이선스가 아닙니다. 라이선스 파일이 없으면 페이지에 워터마크가 표시되고 기능(검색, 주석, 플러그인)이 활성화되지 않습니다. 전체 기능을 갖춘 워터마크 없는 경험을 위해서는 실제 임시 라이선스가 필요합니다 (하나 얻기).
- 거부된 라이선스만 열기를 차단합니다. 캘린더/구독 만료는 워터마크가 있는 렌더링으로 낮아지지만, 빌드가 라이선스 버전 윈도우보다 새로운 경우는 거부되고
LicenseException과 함께 빠르게 실패합니다. 따라서 배포 시에 이를 포착할 수 있으며, 워터마크가 적용된 출력을 조용히 배포하는 것이 아닙니다. 해당 예외(OpenDocumentAsync에서 발생)는License.RejectionMessage의 이유를 포함합니다.
기능
Doconut는 기능을 통해 선택적 기능을 제어합니다. 현재는 선택 가능한 Converter와 DICOM 플러그인, 그리고 내장된 Search와 Annotation 기능이 있으며, 각각 라이선스에 의해 부여됩니다. 기본 뷰어는 기능이 아니라 전제 조건이며, IsViewerLicensed로 표시됩니다:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version전체 파이프라인이 사용하는 단일 게이트는 IsCapabilityGranted입니다:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);그 로직은 구현에서 그대로 가져온 것입니다: 활성(만료되지 않은) 임시 라이선스는 모든 기능을 부여합니다 — 아직 별도의 구매 플래그가 없는 기능도 포함합니다; 실제 구매한 라이선스는 Has* 플래그에 해당하는 기능만 부여하며, 매핑되지 않은 기능은 기본 거부됩니다. (레거시 TRIAL 유형 파일은 권한이 아니며 라이선스가 없는 것으로 처리되어 워터마크가 적용되고 아무 기능도 부여되지 않습니다.)
임시 라이선스
일반 Search와 Annotation은 기존 기능을 직접 사용합니다.
임시(Developer/NFR) 라이선스는 ExpiryNote 태그로 표시되며 강제 만료 날짜를 가집니다:
| 멤버 | 의미 |
|---|---|
IsTemporary | ExpiryNote 태그가 존재함 (ExpiryNote 태그 존재 여부로 감지 — 텍스트와 일치시키지 않음, 동적) |
ExpiryNote | 라이선스에 포함된 정보 텍스트 |
LicenseExpiry | 강제 만료 날짜 (DateTime?) |
만료 의미는 등급에 따라 다릅니다: 임시 라이선스는 LicenseExpiry 날짜만 기준으로 만료됩니다(구독 윈도우는 무시됩니다; 날짜가 없는 임시 라이선스는 만료된 것으로 처리되어 안전하게 동작합니다). 다른 모든 라이선스는 구독/업데이트 윈도우 날짜에 따라 만료됩니다.
IDoconutLicenseService 레퍼런스
IDoconutLicenseService를 주입합니다 (네임스페이스 Doconut.Core.Interfaces; 싱글톤으로 등록 — 라이선스는 시작 시 한 번 파싱됩니다):
| 멤버 | 의미 |
|---|---|
License | 전체 DoconutLicenseInfo 스냅샷(아래) |
IsTrial | 레거시 TRIAL 유형 파일(라이선스가 없는 것으로 처리 — 권한이 아님) |
IsTemporary / ExpiryNote / LicenseExpiry | 임시 라이선스 표시자 |
IsExpired | 위 등급 규칙에 따라 만료됨 |
IsVersionValid | 이 빌드가 라이선스 지원 윈도우 내에 있음 |
IsViewerLicensed | TRIAL이 아닌 파일이 발견되고 버전이 포함됨 — 기본 전제 조건 |
IsCapabilityGranted(cap) | 단일 기능 게이트 |
HasSearch HasAnnotation HasConverter HasDicom | 각 기능별 구매 플래그에 따라 제공 — 임시 라이선스를 고려한 답변은 IsCapabilityGranted 사용 |
IsValidForDomain(host) | 호스트 적용 범위; V4 라이선스는 와일드카드 *.* 사용 |
LicenseRejectionReason | 비어 있지 않음 ⇒ 이 메시지로 열기가 차단됨 |
DoconutLicenseInfo는 관리자 패널용 표시 친화적인 스냅샷을 제공합니다: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, Has* 플래그, 임시 라이선스 필드, 그리고 RejectionMessage.
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}));건강 체크
AddDoconut()는 표준 ASP.NET Core 메커니즘을 통해 라이선스/만료 상태를 보고하는 "doconut" 건강 체크를 등록합니다:
app.MapHealthChecks("/health");이를 모니터링에 연결하면 만료되는 구독이 지원 티켓 대신 알림으로 전환됩니다.
버전 업그레이드
라이선스는 버전 윈도우를 포함합니다. NuGet 패키지를 해당 윈도우보다 새로운 빌드로 업데이트하면 이 빌드에 대한 라이선스가 무효가 됩니다: IsVersionValid가 false가 되고 LicenseException과 함께 열기가 차단됩니다(License.RejectionMessage에 이유가 있음) — 의도적으로 빠르게 실패하도록 하여, 오래되었거나 라이선스가 없는 빌드가 배포 시에 포착되고 프로덕션 출력에 워터마크가 조용히 적용되는 것을 방지합니다. 구독을 갱신하고 .lic 파일을 교체한 뒤 애플리케이션을 재시작하면 AddDoconut()가 새 라이선스를 로드합니다.
이 페이지가 도움이 되었나요?