# 자기소개서 > ㈜페이타랩 · C# WPF 응용프로그램 개발자 지원 --- ## 1. 지원동기 — Windows 환경 위의 안정성 저는 귀사의 패스오더가 풀어내고 있는 **"Windows POS와 모바일 서비스를 잇는다"**는 문제에 주목해 지원했습니다. 귀사의 채용 정보와 기술 글에서 인상 깊었던 지점은 두 가지였습니다. 하나는 카페 POS의 99%가 Windows 기반이라는 환경 위에서 구형 PC부터 최신 키오스크까지 모두 지원해야 한다는 점이었습니다. 다른 하나는 오전 피크에 하루 트래픽의 33.3%가 몰리는 가운데, 점주 PC가 초당 수백 건의 주문을 누락 없이 받아야 한다는 점이었습니다. 단순한 데스크톱 클라이언트가 아니라 외부 서버, 영수증 프린터, 마이크로서비스가 한 번에 맞물려 동작하는 통합 지점이라는 점이 가장 인상 깊었습니다. 이 문제는 제가 그동안 익혀온 문제 의식과 닿아 있습니다. 셀프호스트 파일 서비스 CloudSharp에서는 Local FS·MinIO·S3를 동일한 storage_key로 추상화했습니다. 운영 환경이 달라져도 동일하게 동작하는 구조를 만들었고, tusd라는 외부 Go 프로세스와 hook으로 안전하게 연계했습니다. 또한 `TusBlazorClient`를 NuGet에 배포하면서 C# 코드와 JavaScript 라이브러리를 직접 잇는 경계 설계를 경험했습니다. 다양한 실행 환경과 외부 의존성을 한 번에 다뤄야 한다는 점에서, 귀사의 점주용 프로그램이 풀고 있는 문제에 제가 가장 잘 기여할 수 있다고 판단해 지원했습니다. --- ## 2. 업무 시 강점 — 외부 시스템을 안정적으로 잇는 설계 저의 가장 큰 강점은 **C# 코드와 외부 시스템 사이의 경계를 안정적으로 설계하는 능력**입니다. 이 강점은 Blazor WebAssembly용 NuGet 라이브러리 `TusBlazorClient`를 단독으로 설계·구현·배포한 경험에서 만들어졌습니다. Blazor의 순수 C# 코드는 대용량 파일 업로드에서 메모리·속도 한계가 있었습니다. 검증된 JavaScript 라이브러리 `tus-js-client`를 C# API로 감싸는 래퍼가 필요한 상황이었습니다. 가장 어려웠던 지점은 **JS↔.NET 콜백 브릿지 설계**였습니다. tus-js-client는 진행률·오류·완료를 JS 콜백으로 통지합니다. 반면 C# 델리게이트는 JSON 직렬화가 불가능해 JS에 그대로 넘길 수 없었습니다. 콜백을 일부만 사용하는 시나리오에서는 JS→.NET 호출 자체가 불필요한 오버헤드가 되는 문제도 있었습니다. 저는 모든 콜백을 `TusOptionJsInvoke`라는 한 객체에 모아 `DotNetObjectReference`로 JS에 한 번만 전달했습니다. 콜백 본문은 `[JsonIgnore]`로 직렬화에서 제외했습니다. 동시에 `TusOptionNullCheck` 메타정보를 별도로 두어, JS 측에서 null 콜백에 대한 `invokeMethodAsync`를 아예 건너뛰도록 했습니다. 상태 변경이 없는 `OnBeforeRequest`/`OnAfterResponse`는 동기 호출로 바꿔 마샬링 비용을 추가로 줄였습니다. 그 결과 사용자는 JavaScript 한 줄 없이 C#만으로 **18개 옵션과 7종 콜백을 모두 사용**할 수 있게 되었습니다. 기본 업로드, 중단·재개, 옵션 동적 변경, 재시도 시나리오를 **9개의 Selenium E2E 테스트**로 검증했습니다. 이후 NuGet에 1.0.1 버전으로 공개 배포해 외부 사용자에게 노출되는 라이브러리로 운영했습니다. 이 경험은 패스오더 점주용 프로그램이 풀어야 할 문제와 직접 닿아 있다고 생각합니다. 영수증 프린터, 바코드 스캐너, REST API, Socket 통신, 마이크로서비스는 모두 C# 외부에 있는 시스템입니다. 이들을 C#에서 어떻게 안전하게 연결하느냐가 곧 안정성의 핵심이기 때문입니다. 입사 후에도 외부 의존성과 C# 사이의 경계를 명확히 설계해 주문 누락과 장애를 줄이는 데 기여하겠습니다. --- ## 3. 입사 후 포부 — 구형부터 최신까지, 같은 안정성으로 입사 후에는 **수만 개 매장의 다양한 환경에서 동일한 안정성을 보장하는 WPF 개발자**로 성장하고 싶습니다. 귀사는 ArgoCD·Argo Rollouts 기반 Canary 배포, Istio Service Mesh, Kafka 전용 Gateway, 0단계 모드를 운영하고 있습니다. 모두 "사용자에게 영향을 주지 않는 검증"을 핵심 가치로 둔 도구입니다. 점주용 PC 프로그램에서도 같은 기준으로 안정성을 끌어올리고 싶습니다. **입사 초기**에는 패스오더 점주용 프로그램의 코드베이스를 파악하는 데 집중하겠습니다. 영수증 프린터·POS PC·키오스크에서 같은 코드가 어떻게 다르게 동작하는지, REST/Socket 통신과 마이크로서비스 연동이 어떻게 맞물려 있는지 익히고 싶습니다. **1년 안**에는 점진적 리팩토링 과정에 직접 참여하고 싶습니다. CloudSharp에서 Clean Architecture로 계층 경계를 분리해본 경험이 도움이 될 것으로 보입니다. 비즈니스 로직·통신·UI가 섞여 있는 부분을 단계적으로 분리하고, 구형 PC와 최신 키오스크의 동작 차이를 잡아내는 회귀 테스트를 보강하고 싶습니다. **3년 안**에는 주문 접수·결제 상태·하드웨어 제어 흐름의 신뢰성 패턴을 팀 내에서 정리해 공유할 수 있는 개발자가 되고 싶습니다. 대규모 운영 경험은 아직 부족합니다. 다만 CloudSharp에서 Finalize 동시성을 CAS로 다루고 Recovery Worker로 교착을 자동 해소한 경험이 있습니다. 이 경험을 바탕으로 실제 운영 환경에서 발생하는 장애를 분석해 구조에 반영하는 역량을 채워가겠습니다. --- ## 4. 성장 과정 — 외부에 닿는 코드의 무게 저는 **"동작하는 코드"에서 "외부에 노출되어도 안정적인 코드"**로 관점을 옮겨온 개발자입니다. 처음 개발을 시작했을 때는 기능이 잘 돌아가면 그것으로 충분하다고 생각했습니다. 관점이 바뀐 계기는 `TusBlazorClient`를 NuGet에 공개하면서였습니다. 내 코드를 다른 개발자가 의존하기 시작하자, 작은 결정 하나가 외부 사용자의 코드를 깨뜨릴 수 있다는 사실을 체감했습니다. 콜백을 `[JsonIgnore]`로 분리하고, `IAsyncDisposable`로 JS 모듈 생명주기를 정리한 것은 모두 같은 질문에서 나왔습니다. "사용자의 코드가 이 라이브러리 때문에 어떻게 깨질 수 있는가." 이 경험 이후 CloudSharp에서도 같은 태도로 설계했습니다. JWT 대신 Opaque Session Token을 선택해 권한 변경이 즉시 반영되도록 했습니다. Finalize 중복은 CAS와 Recovery Worker로 막았고, 외부 공개 API에는 Zero Information Leak 정책을 적용했습니다. 모두 "외부에서 이 코드가 어떻게 잘못 사용될 수 있는가"를 먼저 묻는 사고에서 나온 선택이었습니다. 귀사의 점주용 프로그램은 전국 수만 개 매장에서 매일 영업의 가장 앞단에 서 있는 코드입니다. 외부에 닿는 코드의 무게를 익혀온 만큼, 점주님과 손님 양쪽이 신뢰할 수 있는 프로그램을 만드는 데 책임감 있게 기여하겠습니다.