Django에서 ASP.NET CORE로 전환한 이유

Posted by 엘키의 주절 주절 on February 28, 2017

Django를 포기한 이유

  • 성능 문제에서 자유롭지 못하다.
    • 측정 결과에서 많이 느렸다.
      • Web기반 게임 구동을 위해 로직 클래스를 encode-decode를 반복했는데, 이 과정이 매우 느렸다. [pickle 라이브러리 이용]
        • 게임 로직을 들고 있던 클래스 기준 pickle
          • 37ms
        • 게임 로직을 들고 있던 클래스 기준 jsonpickle
          • 42ms
        • 그렇다고 ORM기반 row 하나 get해오는 것도 빠르진 않았다.
          • 7~11ms
      • 이 문제를 해결 하기 위한 방법
        • 속도 향상
          • Pypi
            • Python 3.4는 호환 불가.
            • 심지어 Python 2.7이었다고 해도 성능 문제가 있음.
        • Django 및 python 버전 업.
          • Django 1.10, python 3.5 이용.
            • 10% 가량 속도 향상이 있었으나 미미한 정도.
        • WebSocket 으로 전환.
          • 그렇다해도 느린 Python의 단점 여전히 유효.
        • Pickle을 이용하지 않고 ORM 기반으로 전환.
          • ORM 기반도 여타 언어들 보다 느림.
        • 결론
          • Python을 사용하는 이상 어떤 선택을 하더라도 만족스러운 속도를 얻기 힘들다는 결론.
            • 다른 언어로 전환하기로 함.

Java (Netty) + Spring으로 가지 않은 이유

  • 개발팀 내에 다수 개발자가 C++과 C#쪽에 좀 더 익숙함.
    • 물론 C++ 개발자의 Java 학습 비용은 그리 크지 않은 편으로 알려져있으나, 그 학습 비용 마저 줄이고 싶었음.
  • NET CORE 환경에 대한 탐구심.
    • 기존 Mono기반의 에뮬레이팅 환경과의 차이를 체감하고 싶었음.
  • C#과 Java의 포지션이 비슷한데, 굳이 배워서까지 Java를 써야하는지에 대한 의구심.
  • Linq의 부재.

ASP.NET CORE를 선택한 이유

  • 장점
    • C# 사용 가능
      • 서버 클라 단일 언어로 통합 가능.
        • Unity3D에서의 C#이 버전이 너무 낮다는 단점은 존재.
        • SuperSocket은 아직 .NET CORE 이용 불가.
      • Linq를 통한 생산성 향상.
    • NET CORE 로 넘어오면서, cross platform 개발 및 서비스가 가능 해짐.
      • Mono위에서 구동이 아닌 dotnet 커맨드를 통한 공통된 개발 환경과 구동 환경을 지원하기 시작함.
        • 이를 위한 .net standard를 호환하는 라이브러리만 사용 가능한 상황이 됨.
          • 구축된 환경을 보면 python이나 ruby로 구축된 웹서버를 deploy하고 구동 시키는 것과 매우 유사하게 되어있음.
    • Visual Studio를 이용한 개발 가능
    • MVC 패턴을 편리하게 지원함.
      • Entity Framework를 통한 ORM.
    • 성능적 우월함.
      • 기존에도 여타 웹 프레임워크에 비해 우수했던 성능이 Core 버전으로 넘어오면서 급격히 좋아졌다.
  • 단점
    • 오픈소스권 문화가 아니라서 MS가 제공하지 않는 기능은 .NET 플랫폼 지원언어로 개발해야함.
    • .NET CORE가 아직 1.x대이며, 연관 라이브러리들도 CORE 버전은 미지원되고 있는 것들이 많음.
      • 심지어 지원되는 것들도 호환성 버그나 일부 기능이 미구현 된 경우도 많으니 테스트가 많이 필요하다.
        • 실제로, Redis나 MySQL Connector 등이 NET CORE로 미구현 된 Feature가 꽤나 많았음.

SuperSocket를 선택한 이유

  • 선정 이유
    • 빠른 응답과, 다른 티어와의 통신이 필요할 시에는 소켓 서버가 답이라는 결론.
    • 웹 소켓을 선택 할 수도 있었지만, 작업자들이 좀 더 능숙한 SuperSocket 기본 버전을 사용하기로 했음.
    • C# 소켓 라이브러리중 많이 사용됐으며, 신뢰성 있는 상태.
      • .NET CORE 버전이 있었다 손 쳐도 불안했을 듯. (너무 많은 코드가 재작성 됐을 것이므로)
  • 아쉬운 점
    • NET CORE용 라이브러리가 아직 없다는 점.
    • 멀티 스레딩 관련 최적화와 동기화는 직접 설정 해주어야 되는 점.
      • 어찌보면 장점으로 볼 수 있기도 하다.

결론

  • Linq의 편의성은 우월하다.
  • .NET CORE로 넘어옴으로써 리눅스 호환성 문제도 제거됐다
  • .NET standard용 라이브러리가 부족한 아픔은 아직 있다.
    • 심지어 주요 사용 라이브러리마저 결함이 있거나 미구현 Feature가 너무 많음.
      • 아쉬운 점이 이 것 하나만 있으므로, 올 하반기 정도가 되면 베스트한 선택중 하나로 자리잡지 않을까 생각함.
  • Visual Studio 기반 개발의 편의성.
    • Resharper까지 쓰면 더 말할 것 없는 완벽한 환경!