Edge.js = Node.js + .NET
c# 은 광대하며 다양한 어플리케이션에서 개발하는데 사용될 수 있는 static type 프로그래밍 언어 중에 가장 파워풀하다고 말씀드리고 싶다. node.js 는 xxjavascript 플렛폼을 server side 단에서 실행하는 것을 의미하며, V8 자바스크립트 엔진 상에서 고성능 확장 가능한 어플리케이션을 구현하는데 사용될 수 있다.
.NET 은 NuGet 에서 11,000 packages 보다 더 많이 제공하고 있으며, node.js 는 npm 에서 30,000 modules 보다 더 많이 제공합니다. 이는 우리가 한 공간에서 . NET과 Node.js 플랫폼 모두를 사용할 수 있다면 이는 매우 좋을 겁니다. edge.js 가 .net 환경에서 실행할 개발자분들에게 Node.js npm module 을 구현 가능하게끔 해줍니다. 이는 하나의 프로세스에서 node.js 를 실행하며, node.js 와 .net 간의 기능을 호출 가능합니다.
edge.js 는 node.js 에서 C# 비동기 림다를 호출 할 수도 있습니다. .net 와 node.js 는 다른 스레드 모델을 사용합니다. 그러나 edge 는 하나의 스레드 v8, 그리고 멀티 스레드 CLR 을 핸들링 합니다. 현재 Edge.js 는 C#, F#, Python, PowerShell 을 가지고 자바스크립트를 사용하도록 제공해 줍니다. edge.js 는 Tomasz Janczuk 에 의해 개발되었습니다. Edge.js 프레임워크는 https://github.com/tjanczuk/edge 에 있는 Github 에서 호스팅 해줍니다.
Edge.js 프레임워크을 운영하는데 있어서 아래의 환경이 요구됩니다.
- Windows
- Node.js 0.6.x or later
- .NET 4.5
- Edge NPM Module
Working with Edge.js
command prompt 에서 npm install edge 를 실행합니다.
Calling C# class from Node.js
아래 코드는 하나의 이미지 포멧에서 다른 이미지 포멧으로 이미지를 convert 하기 위해 c# 코드를 사용하여 간단한 node.js 프로그램을 구현 하였습니다.
1: var edge = require('edge');
2: var convertImage = edge.func(function() {/*
3: #r "System.Drawing.dll"
4:
5: using System;
6: using System.Threading.Tasks;
7: using System.Collections.Generic;
8: using System.Drawing;
9: using System.Drawing.Imaging;
10:
11: class Startup
12: {
13: static IDictionary<string, ImageFormat> formats
14: = new Dictionary<string, ImageFormat>
15: {
16: { "jpg", ImageFormat.Jpeg },
17: { "bmp", ImageFormat.Bmp },
18: { "gif", ImageFormat.Gif },
19: { "tiff", ImageFormat.Tiff },
20: { "png", ImageFormat.Png }
21: };
22:
23: public async Task<object> Invoke(
24: IDictionary<string,object> input)
25: {
26: await Task.Run(async () => {
27: using (Image image = Image.FromFile(
28: (string)input["source"]))
29: {
30: image.Save((string)input["destination"],
31: formats[(string)input["toType"]]);
32: }
33: });
34:
35: return null;
36: }
37: }
38: */});
39:
40: var params = {
41: source: '.\\shiju.png',
42: destination: '.\\shiju.jpg',
43: toType: 'jpg'
44: };
45:
46: convertImage(params, function (error) {
47: if (error) throw error;
48: console.log('The image shiju.png has been asynchronously converted to shiju.jpg');
49: });
위의 코드에서 c# 비동기 림다를 넣을 수 있는 edge 함수를 사용하기 위해 c# 을 사용하였습니다. 우리는 Func을 <object,Task<object>> delegate 시그니처와 일치하는 호출 메서드를 사용하여 클래스 이름 모드를 사용하여 지정하도록 C # 클래스를 사용하였습니다.
우리는 #R을 사용하여. NET 어셈블리에 대한 참조를 추가 할 수 있습니다. 위의 프로그램은 변환 로직을 C#로 작성되었습니다. 이는 PNG 형식에서 JPG 형식으로 이미지를 변환하고 Node.js.에서 호출합니다.
아래와 같이 명령 프롬프트에, node convetimage.js 을 실행하여 node.js 프로그램을 실행해 보죠.
성공할 경우, 아래와 같이 console.log 에 기재된 글 내용이 출력된다.
첫댓글 좋은 정보 감사합니다. 지금 일하는데서 node.js로 바꿀까 연구중인데, 역시 문제는 현재 가지고 있는 c#으로된 비지니스 로직인데요. 이거로 해결될지 연구를 해봐야 겠네요.
node.js 로 어디에 효과를 두실려고 하시는지 물어봐도 될까요?
저는 그냥 이대로(mvc4+angularjs)가 좋은데 위에서 연구해보라네요. 우리쪽은 암튼 내부용 프로그램이라서(사용자 약8000명) 별 득이 없을꺼 같은데, 다른팀의 public 사이트에서는 이미 node.js로 돌리는 중이고 매우 만족한다네요. 물론 거기는 사용자가 엄청 많아서 퍼포먼스가 중요하대요. 효과는 single threaded non blocking IO에서 오는 처리 능력이 가장 우선이구요 또 서버와 틀라이언트 양쪽모두 자바스크립트를 쓴다는 점, 윈도우 서버를 안써도 된다는 점(어드민을 한계통 기술로만 뽑을수 있으니까) 등등 이네요.
답변 감사합니다. 윈도우 서버 안써도 된다는 점이 제일 강력한 맨트네요.ㅎ
한참만에 리플다셨네요. 위의 내용에 업데이트 하자면요...
일단 윈도우 개발자쪽에서의 강한 반대로 잠정적 보류로 결정 났구요. 퍼블릭 사이트 쪽은 ruby가 주였는데 전부 node.js로 옮기는 중입니다 물론 로직도 전부 js로 새로 쓰는 중이구요.
참고로 제가 하는 프로젝트는 그사이에 ServiceStack(https://servicestack.net)을 새로 적용해서 약50% 정도의 perfomance 증가를 가졌습니다. 요즘은 PostSharp(http://www.postsharp.net) 를 이용해서 AOP를 구현중에 있습니다. PostSharp은 첨엔 그냥 그랬는데 구현해보니 코드를 참 간결하게 만들수 있게 도와주네요. 강추합니다. 특히 기존프로젝트에 로깅이나 보안같으거 새로 넣을때는요.
심재운님은 아니지만 저도 궁금 했는데 답변 감사합니다 ^^