6 분 소요

첫 웨비나

나는 원래 2021년도부터 웨비나 세션을 만들어서 추후 MS MVP가 되기위한 연습을 시작하려고 했었다. 하지만 역시나, 이것 저것 핑계와 귀차니즘으로 미루고 미루게 되었다. 그리고 올해가 되었고, 더 이상 미루면 이제는 정말 하기 힘들 것 같아 무작정 세션을 하게 되었다. 작년에 내가 웨비나로 하고 싶었던 것은 아래와 같다.

  • .NET GraphQL
  • Azure Functions Service Bus Trigger
  • dxmvvm

GraphQL

이 중에서 GraphQL은 공부해보니 사전에 가졌던 GraphQL에 대한 환상을 모두 깰 수 있었다. 책도 구매했고, Udemy 강좌도 들었다. HTTP 통신을 대체하면서 객체지향적으로 접근할 수 있을 거라고 생각했고, json 문서에 대해 유연한 query를 제공한다고 생각했기 때문이다.

하지만 역시나 마법은 없었고, 개발자가 일일히 다 해줘야 했던 것이다. GraphQL을 도입했을 떄의 장점은 이 아티클을 참조하면 좋다. 여기 보면 BFF 패턴, Gateway Aggregation 패턴이 나온다.

전 직장에서 MSA를 컨셉으로 제품개발을 했기 때문에 위 부분은 매력적인 요소였지만, 개발자가 부족한 환경에서 할 것은 결코 아니었다. 대체가 완벽하게 가능했다면 시간을 들여서 진행했겠지만 이미 구현한 HTTP API에 대해 한 번 감싸주고, 취합해주는 내용이기 때문에 환상이 깨졌다. 그래서 공부하다말고 필요성을 못 느껴서 공부를 접었고, 세션계획도 취소했다.

Azure Functions Service Bus Trigger

현재 이직을 하면서 전직장에서 주로했던 작업이 Azure Service Bus Trigger라 아직 까먹지 않고 있는 기술이다. Service Bus는 RabbitMQ처럼 AMQP를 구현하는 Azure의 메세지 브로커다. 물론 MQTT형식도 지원한다는데 그렇게는 사용해보지 않아서 잘 모르겠다.

완벽한 비동기 형식으로 개발할 수 있고, 메세지를 넣고, Callback 메서드를 만들어서 구독해놓으면 알아서 메세지가 들어오게된다. Redis의 list 자료구조를 사욯하여 queueing 해도 문제는 없겠지만, 내 코드에서 직접 redis list 를 pop 해야한다. 그리고 또 하나의 문제는 그렇게 message를 pop해서 처리될 Task가 나의 console APP에 위치하게 된다. 이 때 부하가 급증하면 내 단순한 콘솔앱은 죽어버리고 말 것이고 이것을 내 로컬에서 방지하기 위해선, Dockerize 하여 Docker Swam 같은 컨테이너 오케스트레이션 기술을 도입해야한 다는 것이고, 서비스 개발에 바빴던 나는 또 공부해야한다는 것이다. Azure Functions Service Bus Trigger를 이용하면 AKS같은 고급기술을 이용하지 않아도 Scale Out을 쉽게할 수 있다. 여러모로 회사 MSA 제품 개발에 합리적인 기술이었던 Azure Functions Service Bus Trigger는 우리 개발팀의 주요 관심사였고, 다함께 공부하여 없는 자료를 긁어모아서 팔만큼 팠던거 같다. 그래서 이 내용에 관해 당장 session 준비가 가능한 상태다.

하지만 이번 .NET Conf Mini 22.05에는 dxmvvm으로 나가게 되었다. 이직한 직장이 서버리스 모델은 거의 사용하지 않았기 때문이다. 게다가 내가 맡은 포지션이 WPF였기 때문에 WPF로 전문성을 가지면서 복습하고자 dxmvvm 세션을 만들었다.

DevExpress WPF MVVM Framework

추후에 내 세션이 .NET Dev AouTube에 올라가면 다시 업데이트를 하겠다.

다른 .NET 서드파티 회사들이 가지지 못한 mvvm 프레임워크를 개발하고, 무료로 풀었다는 것은 개발자 입장에서는 대단히 감사할 일이다. 거기에 dxmvvm의 pocoviewmodel 스타일은 정말 mvvm의 코드를 최소로 줄여준다.

보통은 mvvm을 하려면 relaycommand의 base형태(보통 여기까지 일반적인 mvvm프레임워크에서 구현해준다.)를 만들어서 파라미터를 몇 개 받을 수 있는지 형태도 모두 정의하고 Command마다 여러 코드를 이용해 만들어야 했는데, pocoviewmodel은 정말 일반 메서드 하나로 Command가 완성된다.

Notify Property의 경우에도 Notify를 줄수있는 Base 형태를 만들어서 view로 Notify가 가능한 클래스에 대해 Notify Base 클래스를 상속하여 개발하고, 이 부분까지는 일반적인 mvvm 프레임워크에서 제공해준다. 하지만 pocoviewmodel은 그냥 virtual 키워드 하나만 붙여주면된다.

이런 부분들이 mvvm의 개발적인 생산성까지 증가시켜준다고 판단하여 좋아하는 프레임워크가 되었고, 이것을 좀 더 알리고 사용자 풀을 구성하고자 dxmvvm으로 세션을 만들었다.

세션만들기

세션을 만들 때 도움은 최소화해서 받았던 것 같다. 우선 필요한 것이 있었다.

  • 마이크
  • 웹캠
  • 세션 강의 자료
  • 대본
  • 시연할 예제소스
  • 화면 녹화

마이크 & 웹캠

마이크는 기존에 닷넷데브 정기 미팅을 진행한다고 구매했었고, 웹캠은 대 코로나 시대가 끝날동안 재택근무하면서 화상회의를 몇번 안했기 때문에 따로 구매하지 않고, 사용할 일이 있을 때는 노트북에 장착되어 있는 기본 캠을 사용했었다. 하지만 이번 세션에서는 사용하지 않았다.

세션 강의 자료

강의 자료는 PPT를 사용했는데, PPT에 글이 더 많다. 원래 글이 더 많고 어떤 가이드가 필요하면 Word가 맞겠지만, 발표할 것이기 때문에 PPT로 했다. 디자인 같은 것은 전혀 못하고 안해본데다 그 동안 고민한 훈련 기간도 없기 때문에 PPT에 있는 기본 디자인 테마 중 괜찮은 것을 골라서 사용했다. 기본 디자인 테마라는 것이 있다는 것을 기존에는 전혀 인지하지 못했는데 막상 또 하려니까 있더라. 참 신기해.

대충 캡처사진, 공식문서링크, 소스코드 저장방법, 글자삽입으로 뚝딱뚝딱 만들었다. 내용은 어차피 내 머리속에 다 있으니까.

내가 이번 세션에서 다룰 것은 pocoviewmodel의 property, command, messenger 였다. 닷넷 채팅방에서 behavior도 요청하신 분이 계셨으나 세션을 촬영하다보니 정말 칼같이 최대 시간인 30분이 딱 맞아서 뺐다. 대신 EventToCommand를 설명했으니 일단 event는 mvvm 적으로 처리가 가능한 세션이다.

소스코드의 경우에는 Word에서 사용하는 방식인 객체 삽입형식으로 하려고 했지만, PPT다보니 글자가 커야했고 소스코드를 넣기엔 슬라이드가 늘어나기 때문에 vscode에 코드를 붙혀넣고 캡처 방식으로 했다.

대본

대본은 Notion에서 개인 워크스페이스를 하나 파서 ppt의 내용을 기반으로 구어체로 초안을 작성했다. 사실 초안이 아니고 완성본이라고 생각했는데 생각으로 읽으면서 대본을 만든거라 실제로 녹음하면서 읽어보니 내 입에 맞지 않는 단어들이 꽤 있어서 녹음하면서 정말 많이 수정했다. 게다가 통으로 한 큐에 갈 생각이었는데 연극부 출신인 내가 생각보다 발음을 더듬었어서 당황했고, 진행하면서 슬라이드와 주제별로 녹음 파일을 나누게 되었다. 녹음한 것을 Notion 대본 페이지에 댓글로 하나씩 모두 남겼는데, 내가 알기론 무료티어 워크스페이스에서 첨부가능한 최대 용량이 5MB로 알고있는데 녹음파일은 전부 합치면 100메가 정도 되는 큰 용량이었는데 어찌된 일인지 다 올라갔다…뭐지…?

예제소스

예제소스가 가장 막막했는데 역시나 막막했다. 강의는 슬라이드를 띄워놓고 녹음을 틀어줄 생각이었지만, 소스코드는 파트마다 조각조각 갈 수 없었다. 잘라서 붙히게 되면 내가 편집실력이 좋지 않기 때문에 분명히 시청자에게 편집의 느낌을 주게 될 것이고, 안그래도 자동화가 많이 되어있는 pocoviewmodel에 대해 약간의 불신을 갖지 않을까 해서다. 그래서 꼭! 라이브 코딩이어야 했다.

또 한 가지, 강의자료 녹음할 때는 대본을 보면서 했지만, 라이브코딩은 대본을 보면서 할 수 없었다. 소스코드는 준비가 되어있었는데 이걸 실시간으로 치면서 해야하니까 프로젝트를 새로 만들면서 계속 똑같은 코드를 손에 익을때까지 연습했다. 코드스니펫이 참 도움이 되었다. 소스코드 시연 부연설명의 경우엔, .NET Conf 2022 x Seoul의 이은찬님 세션이 도움이 되었다. 구어체로 설명하는게 자연스러워서 대본을 읽으면서 했던 것보다 훨씬 자연스러웠다. 물론 웹캠을 통해 얼굴이 비춰지면서 라이브 코딩 전에 라이브 세션 강의를 진행했다면 처음부터 이랬을텐데 이미 강의자료에 대한 녹음파일은 녹음이 완료된 상태여서 그걸 그대로 사용해야 시간절약이 되는 상황이었다.

중간 중간 예제코드가 짜놓은 거에서 대사나, 코드시연에 버벅거리는 부분이 있어서 이 부분도 얼마나 다시했는지, 시간을 투자했는지 잘 기억이 안난다….

화면녹화

화면 녹화도 좀 난감했다. 딱히 아는 프로그램이 없었다보니 나는 추천받은 다빈치 리졸브만 믿고 이걸로 녹화하고 편집을 다해야겠다고 생각했는데, 다빈치리졸브는 엄청나게 많은 기능이 있었고 기본적으로 영어라서 나같은 뉴비가 접근하기 쉽지 않았다.

그래서 처음 찾아본게 Windows 10에 기본적으로 내장되어있는 xbox game streaming 용 화면 녹화였다. 이걸로 하다가 전부 다 촬영을 끝마치고보니, 마이크로 음성녹음이 안되어 있었다. 이게 버그가 있는지, 녹화 시작할 때 잘보면 마이크가 꺼져있는 상태로 시작할 때가 있었고, 마이크가 켜진채로 시작할 때가 있었다. 왜 그런지는 잘 모르겠지만, 시행착오로 인해 마이크가 켜져있는지 확인하고 다시 촬영을 진행했다.

두번째 문제가 발생했다. 이 xbox game streaming은 게임을 주로 타겟으로 화면녹화하기때문에 그 응용프로그램안에서 일어나는 모든 것을 캡처하는 것이라, 나처럼 Visual studio를 사용하여 녹화하면, 프로그램을 실행했을 때 새로운 창이 나와서 실행되는데 그게 녹화가 안되었고, 클래스같은 것을 추가할 때 Visual Studio에서 추가하면 새로운 팝업 창이 뜨고 거기서 파일명을 입력하고 추가하는데 그런 창도 녹화가 안되었다…그래서 다 촬영을 끝내놓고도 영상을 쓰지 못했다.

절망적으로 데드라인인 오늘, 방송 프로그램을 어떤 것을 사용해야할까 닷넷데브 운영진 잡담방에 한탄했더니 정세일 MVP님께서 OBS Studio를 사용하라고 도움을 주셨다. 한글화되어있었고, 직관적으로 기능이 딱 화면녹화로 제한되어 있었기 때문에 사용하기가 무척 편했다. 그래서 빠르게 재녹화가 가능했다.

다빈치 리졸브 융합 마법 카드 발동, 녹음과 녹화를 융합하여 엑스트라 덱에서 영상을 소환한다…

나는 유희왕을 좋아한다…그래서 가끔 개드립도 사용한다…ㅎ

아까 언급한대로 다빈치 리졸브는 기능이 많았어서 어떻게 해야하는지 가이드 문서없이는 좀 처음보기엔 막막했다. 하지만 일전에 여러 프로그램을 만들어왔고, 경력이 찬 만큼 여러 ERP 프로그램을 봐왔던 짬의 눈길로 보니까 직관적으로 잘 만들어진 프로그램이라고 생각하게 되었다. 기능 자체는 영어지만 해석이 어려운 수준은 아니었고 하단 탭바가 순차적으로 진행되는 것이라는 것을 캐치할 수 있었다. 진행방향 화살표 좀 넣어주지

녹음파일과 녹화파일의 합성은 Edit 탭에서 했는데 내가 단축키를 몰라서 그런것이겠지만, 마우스로 모든 디테일을 조작하느라 마우스잡은 오른손이 매우 아팠다. 이건 레알이다.

기회되면 다빈치 리졸브도 공부해봐야겠다. 다행히 Udemy에 다빈치 리졸브 한국어 강의가 있었고 오늘부터 세일에 들어갔기 때문에 구매는 했고, 아직 보지는 못했다. 30시간이 넘어가는 강의였어서 당장 오늘 영상편집이 필요한 내게는 적절하지 않았다.

End Phase

그렇게 합성을 모두 끝내고 혼자 리뷰한 뒤 최종 제출에 성공했다. 정말 하얗게 불태웠다. 이직한 직장에 지인분께서 배려해주지 않으셨다면 데드라인을 맞추기 어려웠을 것이다.

감사드립니다.

이상으로 나의 첫 웨비나 세션 만들기 후기를 마친다.

아마 다음에 dotnetconf 행사를 하게되면 그 때부터는 GraphCity MVP로서 GraphCity 제품에 대한 홍보를 목적으로 세션을 나가게 될 것 같다. GraphCity 직원분께 제품소개를 물어보고 공부했는데 DevExpress만 사용해오던 내게 GraphCity의 Spread.NET같은 제품은 정말 그 이상의 생산력을 자랑하는 제품으로 다가 왔다. 개인적인 흥미로라도 좋은 제품을 널리 알려보고 싶다.