.NET CORE

Posted by 엘키의 주절 주절 on June 2, 2019

온라인 게임 개발 시절 대상 환경이 윈도우였고, 클라이언트에서 전향한 개발자가 많아서 서버가 윈도우인 경우가 많았다.

내 경우만해도 윈도우 서버를 아주 오랜 기간 사용해오다가, Ruby on rails를 사용하면서 조금씩 익숙해진 리눅스 서버가 Django를 거쳐, 자바 스프링으로 클라우드 서비스를 개발하고 운용하면서 리눅스 서버에 친숙해지는 계기가 됐다.

게임 개발에서도 유니티에서 C#을 사용하는 일이 빈번하다보니, 서버도 언어를 맞출 겸 C#으로 사용해보는 것을 검토해보기도 했으나, C#으로 리눅스 서버를 사용하는 것은 mono를 통한 구동 뿐인데, 수 많은 전제 조건하여 쓰여진 코드가 죄다 윈도우 기반인 코드가 완벽하게 호환되지 못했고, 어찌어찌 동작이 된다고 해도, 불안할 수 밖에 없는 것이, 가끔 동작하는 특정한 코드가 런타임에서 문제를 일으킬 소지가 남기 때문에, 결국 C# 서버는 윈도우에서 운용하는 것이 답이었다.

친 리눅스로 MS가 방향을 선회하고, C#의 윈도우, 리눅스, mac OS X 에서 공통적인 구동 환경을 위해 추진 한 것이 바로, .NET Standard이고, 이를 기반으로 구현된 구현체가 .NET CORE다.

https://en.wikipedia.org/wiki/.NET_Core

첫 정식 버전이 2016-06-27 이니, 3년쯤 된 녀석이다. 2016년 말경 .NET CORE 1.0부터, 1.1로 버전업 될 때 까지 사용했었는데, 그 때만해도 대다수의 nuget 패키지들은 .NET Framework에서만 동작했으며, 오픈 소스로 컨버팅 된 프로젝트들은 다수가 사용 불가나 다름없었다. MS가 직접 포팅하지 않은 패키지들 다수에서 버그가 다수 발견됐고, ASP.NET CORE의 실 서비스 사용은 아직 시기 상조라고 생각하게 됐었다.

2019년 6월 현재 시점 .NET CORE의 정식 버전은 2.2이고, 3.0 preview단계인데, 시간이 흐름에 따라 production 레벨로 운용중인 서비스들고 늘어나고, 패키지들 안정성이 높아졌으며, 대다수 .NET Framework 기반의 패키지들이 이식되면서 생산성이 크게 확보된 상황인 것을 알 수 있었다.

리눅스에서의 C#은 아직도 과거의 C#을 경험해본 사람들의 편견과, MS의 태세 전환을 체감하지 못한 사람들로 우려가 많은 것이 사실이지만, 실상 어마어마한 속도로 성장중이다.

이게 얼마나 급격한 성장속도냐하면, 2017년 자료에서의 nuget 패키지 수는 고작 7만개에 부족했는데 2년여만에 두배의 패키지 수가 확보되고 있는 것이다.

2017년에는 패키지 수가 7만여개에 불과했따.

2017 mar module counts

2019년 현재는 python, ruby와 비슷한 패키지 수를 확보한 것을 알 수 있을 것이다.

2019 may module counts

또한 SQL Server (MS-SQL)도 리눅스에서의 안정성 검증이 완료됐으며, WSL 2를 이용하면 성능 저하 없이 리눅스 개발을 윈도우에서 할 수 있고, 테스트도 편하게 가능해지는 장점도 생겼다.

개인적으로 리눅스 서버에서의 운용이 얼마나 편한지와 비용 감소를 겪고 나니, 리눅스에서의 서비스가 가능한 언어나 플랫폼이 기술 선정의 조건 중 하나였는데, 이를 충족 시켜주고 다른 요소들 (언어의 편의성, 개발 툴의 편의성, CLI 도구 지원, 유니티 사용시 서버/클라 언어의 일치, 웹 프레임워크, 소켓 프레임워크 존재) 까지 받쳐주니 선택지가 하나 더 확보됐다고 생각한다.

특히 소켓 서버가 필요한 게임 서버 개발에서는, 웹/소켓 프레임워크의 존재가 선택에 있어 큰 메리트가 된다고 생각한다.

현재 .NET CORE와, DotNetty를 이용한 여러가지 구현을 하고 있는데, 이와 관련된 이야기를 앞으로도 이어가보고자 한다.