Winnovative vs IronPDF: 기술 비교 가이드
.NET 개발자가 HTML-에서-PDF 변환 라이브러리를 평가할 때, Winnovative는 종종 수익성 있는 옵션으로 확립된 존재감을 나타냅니다. 그러나 해당 라이브러리가 오래된 렌더링 기술을 의존하고 있어 현대 웹 애플리케이션을 개발하는 팀에게는 중요한 고려 사항을 제시합니다. 이 기술 비교는 Winnovative와 IronPDF를 함께 살펴봄으로써 렌더링 엔진, API 설계 및 현대 웹 표준 지원의 중요한 차이점을 이해하는 데 도움을 줍니다.
Winnovative이해하기
Winnovative는 C# 생태계에서 주목할 만한 존재로 있는 상업적으로 라이센스된 HTML-에서-PDF 변환기입니다. HTML-에서-PDF 변환 기능으로 알려진 이 도구는 라이센스 요구 사항에 따라 $750에서 $1,600 사이의 가격대가 형성됩니다.
Winnovative의 주 기능은 HTML 콘텐츠를 C# 애플리케이션 내 PDF 문서로 변환하는 것입니다. 그러나 몇 가지 제한 사항이 현대 웹 시나리오에서의 적용성을 영향을 미칩니다:
- 구식 WebKit 엔진: Winnovative는 2016년의 WebKit 엔진을 사용하는데, 현대 웹 애플리케이션에 심각한 문제를 야기합니다.
- 제한된 CSS 지원: CSS 그리드는 지원하지 않으며, Flexbox 구현에서 버그가 발생하여 일관되지 않은 렌더링을 야기합니다.
- JavaScript 제한 사항: ES5 JavaScript만 지원—화살표 함수, async/await 및 클래스와 같은 현대 ES6+ 기능은 조용히 실패합니다.
- 정체된 개발: 혁신을 시사하는 이름에도 불구하고, 최근 몇 년간 최소한의 업데이트만 있었습니다.
- 글꼴 렌더링 문제: 웹 글꼴 및 사용자 정의 타이포그래피가 종종 올바르게 렌더링되지 않습니다.
- 보안 우려: 2016년 에라의 WebKit은 수년 간의 보안 패치가 결여되었습니다.
렌더링 엔진 문제
Winnovative의 2016년 WebKit 엔진은 현대 웹 기술을 올바르게 렌더링할 수 없습니다.
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
<script>
const items = data.map(item => item.name); // Arrow functions: FAIL
const result = await fetchData(); // Async/await: FAIL
class Report { } // Classes: FAIL
</script>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
<script>
const items = data.map(item => item.name); // Arrow functions: FAIL
const result = await fetchData(); // Async/await: FAIL
class Report { } // Classes: FAIL
</script>IronPDF대하여 PDF
IronPDF는 최신 Chromium 렌더링 엔진을 사용하여 최신 HTML, CSS, JavaScript 표준과의 호환성을 보장하는 HTML-에서-PDF 변환에 현대적인 접근 방식을 제공합니다. Winnovative의 구식 WebKit 엔진과 달리, IronPDF는 매월 업데이트를 제공하며, 변화하는 웹 기술에 지속적으로 적응합니다.
주요 특성에는 다음이 포함됩니다:
- 현대적 Chromium 엔진: 전체 ES2024 JavaScript 지원이 있는 최신 버전의 Chromium을 사용합니다.
- 완벽한 CSS3 지원: 전체 CSS 그리드, Flexbox 및 현대 레이아웃 시스템이 올바르게 작동합니다.
- 활발한 개발: 정기적인 업데이트로 보안 취약점과 기능 요구 사항을 해결합니다
- 풍부한 기능 세트: SVG, Canvas, 웹 폰트 및 최신 프레임워크 출력(React, Vue SSR)을 지원합니다
- 포괄적인 문서화: 광범위한 튜토리얼과 예제가 제공됩니다
기능 비교
다음 표는 Winnovative와IronPDF간의 기술적 차이점을 강조합니다:
| 기능/측면 | Winnovative | IronPDF |
|---|---|---|
| 렌더링 엔진 | WebKit (2016) | 최신 Chromium |
| JavaScript 지원 | ES5까지 지원 | 전체 ES2024 |
| CSS Grid | 지원되지 않음 | 풀 서포트 |
| Flexbox | 오류가 많음 | 풀 서포트 |
| Bootstrap 5 | 깨짐 | 풀 서포트 |
| Tailwind CSS | 지원되지 않음 | 풀 서포트 |
| React/Vue SSR | 문제 발생 | 완벽하게 작동 |
| 웹 폰트 | 신뢰할 수 없음 | 풀 서포트 |
| 업데이트 | 드문드문함 | 월간 |
| 가격대 | $750-$1,600 | 경쟁적 |
| 문서화 | 상업적 지원 | 폭넓은 튜토리얼 |
API 아키텍처 차이점
Winnovative와IronPDF간의 API 패턴은 클래스 구조와 메소드 명명에 관한 다른 설계 철학을 보여줍니다.
WinnovativeAPI 패턴
Winnovative는 바이트 배열 출력과 별도의 라이선스 키 할당을 가진 HtmlToPdfConverter 클래스를 사용합니다:
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully");
}
}ConvertHtml 메서드는 기본 URL 매개변수(비어 있을 때도)를 요구하고, 결과는 수동 파일 쓰기를 요구하는 바이트 배열입니다.
IronPDFAPI 패턴
IronPDF는 ChromePdfRenderer 클래스와 PdfDocument 반환 형식을 사용하며 간소화된 저장 작업을 제공합니다:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}ChromePdfRenderer 클래스는 내장 저장 메서드를 가진 PdfDocument 객체를 반환하여 수동 바이트 배열 처리를 없애줍니다. 포괄적인 HTML 변환 가이드는 HTML to PDF 튜토리얼을 참조하십시오.
URL을 PDF로 변환
웹 페이지를 PDF 문서로 변환하면 라이브러리 간의 API 사용성 차이가 드러납니다.
Winnovative구현
Winnovative는 바이트 배열 출력을 가진 ConvertUrl 메서드를 사용합니다:
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert URL to PDF
string url = "https://www.example.com";
byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(url);
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully");
}
}// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert URL to PDF
string url = "https://www.example.com";
byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(url);
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully");
}
}IronPDF구현
IronPDF는 전용 RenderUrlAsPdf 메서드를 제공합니다:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert URL to PDF
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert URL to PDF
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}RenderUrlAsPdf 메소드는 Chromium 엔진을 활용해 JavaScript 실행 및 최신 CSS 지원을 완전하게 하며, 이는 Winnovative의 2016 WebKit 엔진으로는 제한됩니다.
헤더 및 푸터 구현
페이지 번호가 있는 헤더와 푸터를 추가하면 API 복잡성의 큰 차이가 드러납니다.
Winnovative엘리먼트 기반 접근
Winnovative는 좌표 위치 지정과 System.Drawing 글꼴을 사용하는 TextElement 클래스를 사용합니다:
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
using System.Drawing;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60;
// Add header text
TextElement headerText = new TextElement(0, 0, "Document Header", new Font("Arial", 12));
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText);
// Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60;
// Add footer with page number
TextElement footerText = new TextElement(0, 0, "Page &p; of &P;", new Font("Arial", 10));
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText);
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes);
Console.WriteLine("PDF with header and footer created successfully");
}
}// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
using System.Drawing;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60;
// Add header text
TextElement headerText = new TextElement(0, 0, "Document Header", new Font("Arial", 12));
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText);
// Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60;
// Add footer with page number
TextElement footerText = new TextElement(0, 0, "Page &p; of &P;", new Font("Arial", 10));
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText);
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes);
Console.WriteLine("PDF with header and footer created successfully");
}
}Winnovative는 명시적인 좌표를 가진 TextElement 객체를 생성하고, System.Drawing Font 객체를 사용하며, 고유한 플레이스홀더 구문(&p; 및 &P;)으로 분리된 헤더/풋터 옵션을 관리해야 합니다.
IronPDF선언적 접근
IronPDF는 직관적인 속성을 가진 TextHeaderFooter을 사용합니다:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF with header and footer created successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF with header and footer created successfully");
}
}TextHeaderFooter 클래스는 좌표 위치 지정을 없애고, 표준 글꼴 크기를 사용하며, 읽기 쉬운 플레이스홀더 구문({page} 및 {total-pages})을 제공합니다. 좀 더 복잡한 디자인을 위해, IronPDF는 또한 CSS 스타일링이 포함된 전체 HTML 헤더와 푸터를 지원합니다.
API 매핑 참조
Winnovative에서 IronPDF로 전환을 평가하는 팀은 개념적 동일성을 이해하기 위한 이 매핑이 유용할 것입니다:
핵심 클래스
| Winnovative클래스 | IronPDF 동등 |
|---|---|
HtmlToPdfConverter | ChromePdfRenderer |
PdfDocument | PdfDocument |
PdfPage | PdfDocument.Pages[] |
PdfDocumentOptions | RenderingOptions |
PdfHeaderOptions | HtmlHeaderFooter |
PdfFooterOptions | HtmlHeaderFooter |
TextElement | HtmlFragment 내의 HTML |
ImageElement | HTML <img> |
PdfSecurityOptions | SecuritySettings |
메서드 매핑
| Winnovative메소드 | IronPDF 메소드 |
|---|---|
ConvertUrl(url) | RenderUrlAsPdf(url) |
ConvertUrlToFile(url, path) | RenderUrlAsPdf(url).SaveAs(path) |
ConvertHtml(html, baseUrl) | RenderHtmlAsPdf(html) |
ConvertHtmlToFile(html, path) | RenderHtmlAsPdf(html).SaveAs(path) |
ConvertHtmlFile(path) | RenderHtmlFileAsPdf(path) |
MergePdf(streams) | PdfDocument.Merge(pdfs) |
AppendPdf(pdf) | pdf1.AppendPdf(pdf2) |
옵션 매핑
| Winnovative옵션 | IronPDF 옵션 |
|---|---|
PdfPageSize.A4 | PaperSize = PdfPaperSize.A4 |
PdfPageSize.Letter | PaperSize = PdfPaperSize.Letter |
PdfPageOrientation.Portrait | PaperOrientation = PdfPaperOrientation.Portrait |
PdfPageOrientation.Landscape | PaperOrientation = PdfPaperOrientation.Landscape |
TopMargin = 20 | MarginTop = 20 |
BottomMargin = 20 | MarginBottom = 20 |
LeftMargin = 15 | MarginLeft = 15 |
RightMargin = 15 | MarginRight = 15 |
ShowHeader = true | HtmlHeader 속성 설정 |
ShowFooter = true | HtmlFooter 속성 설정 |
JavaScriptEnabled = true | EnableJavaScript = true |
팀이 Winnovative에서IronPDF전환을 고려할 때
여러 가지 시나리오에서 개발 팀이 Winnovative의 대안으로 IronPDF를 평가하게 됩니다:
현대 CSS 프레임워크 채택
Bootstrap 5, Tailwind CSS 또는 사용자 정의 CSS Grid 레이아웃을 채택한 팀은 Winnovative가 이를 정확하게 렌더링할 수 없음을 발견합니다. 2016년 WebKit 엔진은 CSS Grid 지원을 전혀 제공하지 않으며, Flexbox 구현에 결함이 있어 일관되지 않은 결과를 낳습니다.
JavaScript 애플리케이션 요구 사항
화살표 함수, async/await, 클래스, 템플릿 문자열을 포함한 ES6+ 문법을 사용하는 현대의 JavaScript 기능을 사용하는 애플리케이션은 Winnovative에서 조용한 오류를 겪습니다. IronPDF의 Chromium 엔진은 완전한 ES2024 지원을 제공하여 완전한 JavaScript 실행을 보장합니다.
보안 및 유지 관리 우려 사항
Winnovative가 2016년 시대의 WebKit에 의존하는 것은 보안 문제를 일으킵니다. 이는 수년 간의 보안 패치가 렌더링 엔진에서 누락되었기 때문입니다. 보안 준수 요구 사항이 있는 팀은 종종 이 기술적 부채를 받아들일 수 없습니다.
단일 페이지 애플리케이션 지원
React, Vue, Angular 애플리케이션은 클라이언트 측 렌더링에 의존하며, 현대적인 JavaScript 실행이 필요합니다. Winnovative의 ES5 전용 지원으로 인해 이러한 애플리케이션을 렌더링하는 데 문제가 발생하지만, IronPDF는 이를 올바르게 처리합니다.
글꼴 및 타이포그래피 요구 사항
웹 글꼴과 사용자 정의 타이포그래피는 Winnovative에서 종종 잘못 렌더링됩니다. PDF 출력 전반에 걸친 일관된 타이포그래피를 필요로 하는 팀은 IronPDF의 현대적 글꼴 처리를 더 신뢰할 수 있습니다.
일반적인 마이그레이션 고려사항
Winnovative에서 IronPDF로 전환하는 팀은 렌더링 차이를 숙지해야 합니다:
CSS 레이아웃 변경 사항
Winnovative에서 '허용 가능한' 것으로 보였던 레이아웃은 IronPDF에서 다르게 렌더링될 수 있습니다. 이는 IronPDF가 현대 표준에 따라 올바르게 렌더링하기 때문입니다. Winnovative의 버그에 대한 CSS 해결 방법들은 제거할 수 있습니다:
// Clean up legacy CSS workarounds
string cleanedHtml = html
.Replace("-webkit-flex", "flex")
.Replace("display: -webkit-box", "display: flex");// Clean up legacy CSS workarounds
string cleanedHtml = html
.Replace("-webkit-flex", "flex")
.Replace("display: -webkit-box", "display: flex");JavaScript 대기 설정
IronPDF는 동적 콘텐츠를 위한 명시적인 JavaScript 대기 옵션을 제공합니다:
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.JavaScript(5000);
// Or wait for specific element
renderer.RenderingOptions.WaitFor.HtmlElementById("content-ready", 10000);renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.JavaScript(5000);
// Or wait for specific element
renderer.RenderingOptions.WaitFor.HtmlElementById("content-ready", 10000);기본 URL 구성
IronPDF는 상대적 리소스 해상도에 대한 명시적인 기본 URL 구성을 요구합니다:
renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");추가IronPDF기능
HTML-to-PDF 변환을 넘어 IronPDF는 문서 조작 기능을 제공합니다:
.NET 호환성 및 미래 준비
Winnovative의 드문 업데이트는 최신 .NET 버전과의 장기 호환성에 대한 우려를 제기합니다. IronPDF는 .NET 8, .NET 9 및 2026년에 예상되는 .NET 10을 포함한 향후 릴리스와의 호환성을 보장하는 정기적인 업데이트로 활발히 개발되고 있습니다. 라이브러리의 async/await 지원은 C#의 최신 개발 관행과 일치하며, C# 14에서 예상되는 기능들을 포함합니다.
결론
Winnovative와 IronPDF는 HTML-to-PDF 변환 기술의 서로 다른 시대를 나타냅니다. Winnovative의 2016 WebKit 엔진은 현대 CSS Grid를 처리할 수 없으며, 결함이 있는 Flexbox 지원을 제공하며, ES6+ JavaScript에서는 조용히 실패합니다. 이는 점점 더 현대 웹 프레임워크를 사용하는 애플리케이션에 영향을 미칩니다.
IronPDF의 Chromium 기반 렌더링 엔진은 현대 웹 표준에 대한 완전한 지원을 제공하여 Bootstrap 5, Tailwind CSS, React, Vue, 기타 현대 기술이 올바르게 렌더링되도록 합니다. 이의 월별 업데이트 주기는 보안 취약점과 기능 요건을 해결하며, API 설계는 RenderHtmlAsPdf() 및 SaveAs()와 같은 메서드를 사용하여 바이트 배열 관리를 제거하면서 단순성을 우선시합니다.
현대 웹 표준이 필요하지 않은 레거시 시스템에서 작업하는 팀에게는 Winnovative가 충분할 수 있습니다. 그러나 현대 HTML, CSS, JavaScript를 활용하는 애플리케이션의 경우 IronPDF는 신뢰할 수 있는 PDF 생성을 위한 기술적인 기반을 제공합니다. 선택은 궁극적으로 귀하의 애플리케이션이 현대 웹 표준 지원을 필요로 하는지에 달려 있습니다. 그렇다면 Winnovative의 2016 렌더링 엔진은 근본적인 제한사항을 제공합니다.
추가 구현 지침은 특정 사용 사례와 고급 기능을 다루는 IronPDF 문서 및 튜토리얼을 탐색하세요.
