푸터 콘텐츠로 바로가기
IRONXL 사용하여

C#에서 Excel 객체 해제 | IronXL 사용하여 남아있는 Excel 프로세스 중지

엑셀 객체 해제 C#: IronXL로 남아있는 엑셀 프로세스 중단: 이미지 1 - 엑셀 객체 해제 C#: 두 가지 방법 비교

C# 애플리케이션에서 Microsoft Excel 파일 작업 시 닫히지 않는 Excel 프로세스라는 성가신 문제가 종종 발생합니다. 코드 실행이 끝난 후에도 메모리를 소비하는 다수의 EXCEL.EXE 인스턴스가 작업 관리자에서 누적되는 것을 발견할 수 있습니다. 이 가이드는 전통적인 엑셀 상호 운용성에서 왜 이런 일이 발생하는지 설명하고 IronXL이 이러한 COM 객체 문제를 완전히 해결하여 복잡한 정리 코드와 메모리 누수를 방지하는 방법을 보여줍니다.

근본 원인은 .NET Framework가 COM 참조를 통해 Microsoft Office와 상호작용하는 방식에 있습니다. Microsoft.Office.Interop.Excel을 사용하여 코드를 작성할 때, 모든 엑셀 애플리케이션 객체, 워크북, 워크시트는 명시적인 정리가 필요한 COM 객체를 생성합니다. 하나의 해제 호출이라도 놓치거나 app.Workbooks.Open()처럼 두 개의 점을 사용하는 패턴으로 인해 고아 참조가 생성되어 엑셀 프로세스가 종료되지 않습니다.

지금 바로 IronXL으로 시작하세요.
green arrow pointer

Excel 프로세스는 닫힌 이후 왜 작업 관리자에 남아 있을까요?

Excel 애플리케이션은 COM 객체 참조 카운트가 제대로 감소되지 않았기 때문에 종료되지 않습니다. 코드가 Excel 애플리케이션, 워크북 또는 워크시트를 액세스할 때마다 실행 환경은 기본 COM 객체에 대한 참조 카운트를 보유한 런타임 호출 가능 래퍼(RCW)를 생성합니다. .NET 가비지 수집기는 Marshal.ReleaseComObject을 사용하여 모든 참조가 명시적으로 해제될 때까지 이러한 상호 운용 객체를 해제할 수 없습니다.

지속되는 프로세스를 유발하는 일반적인 실수는 다음과 같습니다:

  • app.Workbooks.Open()와 같은 속성 체인에서 두 개의 점을 사용하는 것 (숨겨진 임시 객체를 생성하는 경우)
  • foreach 루프를 통해 COM 컬렉션을 반복하는 것 (해제되지 않은 열거자를 생성하는 경우)
  • 엑셀 애플리케이션 객체에서 Quit() 호출을 잊어버리는 것
  • finally 블록에서 정리 없이 예외를 포착하는 경우

이전 Microsoft Office 버전(2000-2003)에서는 Office API 객체를 릴리스하지 않으면 Excel 메인 창이 무한히 걸리게 됩니다. 나중 버전에서는 좀 더 관대해졌지만 Excel 프로세스는 여전히 작업 관리자에 누적되어 메모리 누수 및 Excel 스프레드시트 파일의 잠금 문제가 발생할 수 있습니다.

특히 서버 측 또는 예약 애플리케이션에서는 시간이 지남에 따라 프로세스가 누적되어 서버의 메모리가 부족해질 때까지 커지는 경우가 있습니다. 이유를 이해하는 것이 올바른 도구를 선택하는 첫 번째 단계입니다.

COM 계층에서는 무슨 일이 일어나나요?

Excel COM 객체에서의 모든 프로퍼티 액세스가 새로운 RCW를 생성할 수 있습니다. worksheet.Range["A1"].Value을 작성할 때, 두 개의 별도의 COM 객체가 생성됩니다 - 하나는 Range에 대해, 그리고 하나는 두 배 점 접근을 통해 암시적으로 생성됩니다. 가비지 수집기는 언젠가 이들을 정리할 수 있지만, 그 시점은 보장할 수 없습니다. 고성능 애플리케이션에서는 후행 작업이 수집보다 더 빠르게 증가할 수 있습니다.

Windows는 내부적으로 COM 참조를 계산합니다. 해당 카운트가 0에 도달할 때까지, 기초 프로세스(EXCEL.EXE)는 남아있습니다. GC.Collect()를 호출하고 GC.WaitForPendingFinalizers()는 수집 주기를 강제하지만, 이 접근법은 성능 비용이 있으며 생산 코드에 대한 장기적인 솔루션이 아닙니다.

왜 더블닷 패턴이 문제를 유발하나요?

두 배 점 패턴(app.Workbooks.Open(path))은 C#에서 관습적이지만, COM Interop 컨텍스트에서는 참조되지 않은 중간 객체를 생성합니다. Workbooks 컬렉션 객체가 생성되어 Open 호출에 사용된 다음, 코드가 해당 참조를 보유하지 않으므로 즉시 고아가 됩니다. 가비지 수집기는 이러한 객체를 마무리하는 예측 가능한 일정이 없기 때문에, EXCEL.EXE는 열려 있게 됩니다.

Interop으로 안전한 접근 방법은 모든 중간 객체를 명명된 변수에 저장하고 생성 역순으로 각각을 명시적으로 해제하는 것입니다.

엑셀 상호 운용성 객체를 올바르게 해제하는 방법은?

전통적인 접근법은 생성된 모든 COM 객체를 철저하게 추적하는 것이 요구됩니다. 더블 닷을 피하고, 모든 중간 객체를 로컬 변수에 저장하며 역순으로 해제해야 합니다. 다음 코드는 Stack Overflow 답변과 Microsoft 문서에서 일반적으로 발견되는 자세한 정리 패턴을 보여줍니다:

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// Verbose Interop cleanup pattern
Excel.Application excelApp = new Excel.Application();
Excel.Workbooks workbooks = excelApp.Workbooks;
Excel.Workbook workbook = workbooks.Open("report.xlsx");
Excel.Sheets sheets = workbook.Sheets;
Excel.Worksheet worksheet = (Excel.Worksheet)sheets[1];

// Work with data
worksheet.Cells[1, 1] = "Updated Value";

// Cleanup -- release EVERY COM object in reverse order
workbook.Close(false);
excelApp.Quit();

Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApp);

GC.Collect();
GC.WaitForPendingFinalizers();
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// Verbose Interop cleanup pattern
Excel.Application excelApp = new Excel.Application();
Excel.Workbooks workbooks = excelApp.Workbooks;
Excel.Workbook workbook = workbooks.Open("report.xlsx");
Excel.Sheets sheets = workbook.Sheets;
Excel.Worksheet worksheet = (Excel.Worksheet)sheets[1];

// Work with data
worksheet.Cells[1, 1] = "Updated Value";

// Cleanup -- release EVERY COM object in reverse order
workbook.Close(false);
excelApp.Quit();

Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApp);

GC.Collect();
GC.WaitForPendingFinalizers();
$vbLabelText   $csharpLabel

이 코드는 각 엑셀 객체를 별도로 저장하여 적절한 정리를 보장합니다. GC.Collect()GC.WaitForPendingFinalizers() 호출은 가비지 수집을 강제합니다. 일부 개발자는 예외가 발생해도 정리를 보장하기 위해 모든 것을 try/finally 블록에 감쌉니다.

일반적인 정리가 실패하는 극단적인 경우에는 일부 팀이 Windows Job 객체를 사용한 프로세스 킬 방법을 채택합니다. 이는 CreateJobObject, SetInformationJobObjectAssignProcessToJobObject에 대한 P/Invoke 선언을 포함합니다. 이 방법은 최후의 수단으로 작동하지만, 이는 근본적인 설계 문제를 수정하는 것이 아니라 증상을 치료하는 것입니다.

COM-Free Excel 라이브러리를 C#에서 설치하는 방법은?

IronXL은 Excel 파일 작업에 대해 근본적으로 다른 접근 방식을 취합니다. Microsoft Office COM 객체를 래핑하는 대신, IronXL은 자체 파서와 렌더러를 사용해 직접 Excel 파일 형식을 읽고 씁니다. 이는 COM 참조가 없고, Office Interop 종속성이 없고, 지속적인 프로세스가 없음을 의미합니다. 기계에 Microsoft Excel이 설치되어 있을 필요조차 없습니다.

Visual Studio의 NuGet 패키지 관리자 콘솔을 통해 IronXL을 설치하십시오.

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

또는 .NET CLI를 사용하세요:

dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

설치 후, 파일에 using IronXL; 지시어를 추가하세요. 이제 프로젝트는 오피스 종속성 없이 Excel 파일 작업에 직접, 네이티브로 액세스할 수 있습니다. IronXL은 .NET 8, .NET 9, .NET 10, .NET Framework 4.6.2+를 대상으로 하며, Windows, Linux, macOS, Docker, Azure에서 실행됩니다.

필요한 NuGet 패키지는 무엇인가요?

단일 NuGet 패키지만 필요합니다: IronXl.Excel. Microsoft Office, Office Interop 어셈블리 또는 COM 등록에 의존하지 않습니다. 이로 인해 배포가 극적으로 간단해집니다 - 응용 프로그램을 자체 포함 실행 파일로 게시할 수 있으며, Office가 설치되지 않은 서버에서도 실행됩니다.

PDF 생성을 필요로 하는 프로젝트의 경우, IronPDF는 IronXL과 통합되어 Excel 데이터를 Excel 자동화를 거치지 않고 직접 PDF로 내보냅니다.

COM 객체 없이 Excel 파일을 어떻게 읽습니까?

다음 코드는 IronXL로 Excel 파일을 읽는 방법을 보여줍니다. 정리 코드가 필요하지 않다는 점을 주목하십시오:

using IronXL;

// Load and read Excel files without COM objects
WorkBook workBook = WorkBook.Load("report.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;

// Access cell values directly
string cellValue = workSheet["A1"].StringValue;
decimal columnSum = workSheet["B2:B10"].Sum();

// 아니요 cleanup required -- workBook is a standard .NET object
Console.WriteLine($"Cell A1: {cellValue}");
Console.WriteLine($"Sum B2:B10: {columnSum}");
using IronXL;

// Load and read Excel files without COM objects
WorkBook workBook = WorkBook.Load("report.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;

// Access cell values directly
string cellValue = workSheet["A1"].StringValue;
decimal columnSum = workSheet["B2:B10"].Sum();

// 아니요 cleanup required -- workBook is a standard .NET object
Console.WriteLine($"Cell A1: {cellValue}");
Console.WriteLine($"Sum B2:B10: {columnSum}");
$vbLabelText   $csharpLabel

콘솔 출력

엑셀 객체 해제 C#: IronXL로 남아있는 엑셀 프로세스 중단: 이미지 3 - IronXL이 입력 엑셀 파일을 읽는 출력

IronXL은 엑셀 개체를 네이티브 .NET 형식으로 처리합니다. workBook 변수가 범위를 벗어날 때, 표준 .NET 가비지 수집기가 메모리 정리를 처리합니다. COM 참조를 추적하거나 Marshal.ReleaseComObject를 호출하거나 가비지 수집 주기를 강제할 필요가 없습니다.

또한 IronXL 워크북과 함께 using 블록을 사용할 수 있으며, 이는 프로세스 누출을 방지하기 위해 필요하지는 않지만, 이는 단지 좋은 .NET 리소스 관리 관행에 불과합니다.

여러 워크시트에 어떻게 접근합니까?

IronXL에서 여러 워크시트에 접근하는 것은 모든 .NET 컬렉션을 사용하듯이 직접적입니다:

using IronXL;

WorkBook workBook = WorkBook.Load("multi-sheet-report.xlsx");

// Iterate all worksheets
foreach (WorkSheet sheet in workBook.WorkSheets)
{
    string sheetName = sheet.Name;
    int rowCount = sheet.RowCount;
    Console.WriteLine($"Sheet '{sheetName}' has {rowCount} rows");
}

// Access a specific sheet by name
WorkSheet salesSheet = workBook["Sales"];
decimal totalRevenue = salesSheet["C2:C100"].Sum();
Console.WriteLine($"Total Revenue: {totalRevenue:C}");
using IronXL;

WorkBook workBook = WorkBook.Load("multi-sheet-report.xlsx");

// Iterate all worksheets
foreach (WorkSheet sheet in workBook.WorkSheets)
{
    string sheetName = sheet.Name;
    int rowCount = sheet.RowCount;
    Console.WriteLine($"Sheet '{sheetName}' has {rowCount} rows");
}

// Access a specific sheet by name
WorkSheet salesSheet = workBook["Sales"];
decimal totalRevenue = salesSheet["C2:C100"].Sum();
Console.WriteLine($"Total Revenue: {totalRevenue:C}");
$vbLabelText   $csharpLabel

COM 반복 열거자, 숨겨진 임시 객체, 정리가 필요하지 않습니다. IronXL의 API는 모든 부분에 걸쳐 .NET Standard 컬렉션 패턴을 따릅니다.

Interop 없이 새로운 Excel 파일을 어떻게 만듭니까?

Excel 파일 생성은 동일한 간단한 메서드 패턴으로 작동합니다. 다음 코드는 새로운 워크북을 생성하고, 구조화된 데이터를 추가하며, 기본 형식을 적용하고 저장하는 방법을 보여줍니다:

using IronXL;

// Create a new Excel spreadsheet in XLSX format
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Sales Data");

// Write headers
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Units Sold";
workSheet["C1"].Value = "Revenue";

// Write data rows
workSheet["A2"].Value = "Widget Alpha";
workSheet["B2"].Value = 450;
workSheet["C2"].Value = 22500;

workSheet["A3"].Value = "Widget Beta";
workSheet["B3"].Value = 310;
workSheet["C3"].Value = 15500;

// Add a formula
workSheet["C4"].Formula = "=SUM(C2:C3)";

// Save the Excel file
workBook.SaveAs("sales_report.xlsx");
Console.WriteLine("Spreadsheet saved successfully.");
using IronXL;

// Create a new Excel spreadsheet in XLSX format
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Sales Data");

// Write headers
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Units Sold";
workSheet["C1"].Value = "Revenue";

// Write data rows
workSheet["A2"].Value = "Widget Alpha";
workSheet["B2"].Value = 450;
workSheet["C2"].Value = 22500;

workSheet["A3"].Value = "Widget Beta";
workSheet["B3"].Value = 310;
workSheet["C3"].Value = 15500;

// Add a formula
workSheet["C4"].Formula = "=SUM(C2:C3)";

// Save the Excel file
workBook.SaveAs("sales_report.xlsx");
Console.WriteLine("Spreadsheet saved successfully.");
$vbLabelText   $csharpLabel

산출

엑셀 객체 해제 C#: IronXL로 남아있는 엑셀 프로세스 중단: 이미지 4 - Interop 없이 생성된 엑셀 파일

이 접근 방식은 Excel 애플리케이션 개체를 관리하고, 저장되지 않은 변경 사항 프롬프트를 처리하며, 주 스레드가 STA 아파트 모델을 사용하는지 확인하는 복잡성을 없앱니다. IronXL은 Office 애드인 의존성의 부담이나 Interop 어셈블리 등록 없이 스프레드시트 기능에 대한 접근을 단순화합니다.

더 복잡한 작업이 필요한 시나리오의 경우, IronXL은 공식 계산, 셀 스타일링, 다중 시트 워크북을 위한 방법을 제공합니다. Excel 워크시트 데이터를 조작하고, 형식을 적용하며, 여러 파일 형식으로 내보내는 코드를 작성할 수 있습니다 - 모든 COM 객체 수명주기 관리를 걱정할 필요 없이.

엑셀 상호 운용성과 직접 라이브러리의 주요 차이점은 무엇입니까?

다음 표는 두 접근 방식의 가장 중요한 차이점을 요약합니다:

C# 응용 프로그램을 위한 엑셀 상호 운용성 대 IronXL 비교
기능 엑셀 상호 운용성 IronXL
Microsoft Office 필요 아니요
COM 객체 정리 수동 (모든 객체) 자동 (.NET GC)
EXCEL.EXE 플로팅 위험 높음 없음
서버 환경에서 작동 제한적 (STA 스레드 필요) 예 (모든 환경)
Docker / Linux 지원 아니요
지원되는 파일 형식 XLS, XLSX (Office 통해) XLS, XLSX, CSV, TSV, JSON
스레드 안전성 STA 전용 멀티 스레드
코드 복잡도 (기본 읽기) 높음 (다수의 릴리스 호출) 낮음 (3-5 줄)

엑셀 객체 해제 C#: IronXL로 남아있는 엑셀 프로세스 중단: 이미지 2 - Interop vs. IronXL 비교 테이블

IronXL은 또한 CSV 파일 읽기, CSV로 데이터 내보내기, Excel 차트 작업, 조건부 서식 적용을 지원합니다. 이러한 기능은 모두 Office 의존성 없이 사용할 수 있으므로 IronXL은 데스크탑 및 서버 측 응용 프로그램 모두에 적합합니다.

고급 시나리오에 대한 자세한 내용은 IronXL 문서IronXL API 참조를 참조하십시오. IronXL 예제 갤러리를 탐색하여 일반적인 Excel 자동화 작업을 다루는 여러 코드 샘플을 사용할 수 있습니다.

Excel 수식 및 데이터 유효성 검사는 어떻게 합니까?

IronXL은 Excel 수식 읽기 및 쓰기를 기본적으로 지원합니다. 셀의 Formula 속성을 설정할 수 있으며 IronXL은 파일에 수식을 저장하고 평가합니다. 데이터 유효성 검사 규칙의 경우, IronXL은 드롭다운 목록, 숫자 범위 제약 조건 및 날짜 유효성을 지원하며, Excel의 계산이 필요하지 않습니다.

라이브러리는 Excel 비밀번호 보호, 병합된 셀, 및 Excel 창 고정 구성을 처리할 수 있습니다. 각 기능에 대한 단계별 가이드를 위해 IronXL 튜토리얼을 참조하십시오.

엑셀 상호 운용성에서 네이티브 .NET 라이브러리로 어떻게 마이그레이션합니까?

Interop 기반의 기존 코드베이스를 IronXL로 마이그레이션하는 과정은 일반적으로 네 단계로 구성됩니다:

  1. Microsoft.Office.Interop.Excel NuGet 참조 및 COM 등록 제거
  2. NuGet을 통해 IronXl.Excel 설치
  3. Interop 객체 생성을 WorkBook.Load, WorkBook.Create와 같은 IronXL 등가물로 대체
  4. 모든 Marshal.ReleaseComObject 호출 및 GC.Collect 패턴 삭제

대부분의 속성 이름은 직관적으로 매핑됩니다: worksheet.Cells[row, col]workSheet[$"{col}{row}"].Value로, workbook.SaveAs(path)는 거의 동일하게 유지됩니다. IronXL 마이그레이션 가이드는 일반적인 변환 패턴을 다룹니다.

주의할 점은 스레딩입니다. Interop은 STA 스레드를 요구하며, 이는 ASP.NET에서 특정 스레드 풀 구성을 강제합니다. IronXL로 전환 후, 모든 [STAThread] 속성과 스레드 아파트 설정을 제거할 수 있습니다 - IronXL은 기본적으로 스레드 안전성(thread safety)을 보장합니다.

파일이 많은 대규모 마이그레이션의 경우, IronXL 배치 처리 예제는 병렬 루프와 비동기 패턴을 사용하여 수백 개의 Excel 파일을 효율적으로 처리하는 방법을 보여줍니다.

다음 단계는 무엇입니까?

엑셀 상호 운용성의 COM 객체 정리 문제는 수년간 .NET 개발자를 좌절시켰습니다. 중간 객체를 모두 추적하고 올바른 순서로 릴리스하며, 참조를 유출하지 않고 예외를 처리하는 것은 간단한 스프레드시트 작업에 상당한 복잡성을 추가합니다.

IronXL은 더 깨끗한 진로를 제공합니다. Microsoft Office에 독립적으로 Excel 파일 형식에서 직접 작업하여, 소스에서 COM 객체 문제를 제거합니다. 기존 파일을 읽거나, 새 파일을 생성하거나, 대량 작업을 처리할 때, IronXL은 현대 .NET 개발이 요구하는 간단함으로 Excel 스프레드시트 작업을 처리합니다.

시작하려면:

.NET 생태계의 다른 Excel 라이브러리와 비교하려면 Microsoft 문서의 엑셀 상호 운용성, EPPlus 라이브러리 GitHub 저장소, 및 ClosedXML 프로젝트를 참조하여 선택지 간의 장단점을 이해하십시오. IronXL의 장점은 풍부한 API, 오피스 필요 없는 배포, 단일 상업적 라이선스 하에서의 완전한 크로스 플랫폼 지원의 조합입니다.

자주 묻는 질문

IronXL 이란 무엇인가요?

IronXL 은 C# 애플리케이션 내에서 Excel 파일을 다루는 작업을 간소화하는 .NET 라이브러리로, Microsoft Office Interop이 필요하지 않습니다.

C#에서 Excel 객체를 해제해야 하는 이유는 무엇입니까?

C#에서 Excel 객체를 해제하는 것은 Excel 프로세스가 계속 실행되는 것을 방지하는 데 매우 중요합니다. 그렇지 않으면 성능 문제 및 메모리 누수가 발생할 수 있습니다.

IronXL Excel 개체 정리에 어떻게 도움이 되나요?

IronXL Excel 개체 정리를 자동화하여 C#에서 수동으로 상호 운용성 개체를 관리할 때 발생하는 복잡성과 오류를 줄여줍니다.

C#에서 Excel Interop을 사용할 때 어떤 어려움이 있나요?

C#에서 Excel과의 상호 운용성을 구현할 때 COM 객체를 수동으로 관리해야 하므로 프로세스 잔여 문제나 메모리 누수와 같은 문제가 자주 발생합니다.

Microsoft Office가 설치되어 있지 않아도 Excel 파일을 편집할 수 있나요?

네, IronXL 사용하면 시스템에 Microsoft Office가 설치되어 있지 않아도 Excel 파일을 조작할 수 있습니다.

IronXL 모든 Excel 파일 형식을 지원합니까?

IronXL XLSX, XLS, CSV 등을 포함한 다양한 Excel 파일 형식을 지원하여 다용도의 파일 작업을 가능하게 합니다.

IronXL 대규모 엑셀 파일 작업에 적합한가요?

IronXL 은 대규모 Excel 파일 작업을 효율적으로 처리하도록 설계되어 기업 수준의 애플리케이션에 적합합니다.

IronXL Excel Interop 대신 사용할 때의 이점은 무엇입니까?

IronXL Excel Interop에 비해 코드 간소화, 성능 향상, COM 관련 문제 해결 등의 이점을 제공합니다.

IronXL C# 프로젝트에 통합하려면 어떻게 해야 하나요?

IronXL C# 프로젝트에 통합하려면 NuGet 패키지 관리자를 통해 설치하고 애플리케이션 코드에서 참조하면 됩니다.

IronXL 엑셀 수식을 지원합니까?

네, IronXL Excel 수식을 지원하므로 C# 애플리케이션 내에서 Excel 수식을 읽고, 쓰고, 평가할 수 있습니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me