ݺߣ

ݺߣShare a Scribd company logo
네트워크 비동기 통신,
합의점의 길목에서
㈜넥슨
신규개발3본부 개발1실 GTR팀 성능연구유닛
김재석
다룰 내용
네트워크 프레임워크 프레임워크
개발 목표 및 구현
시기별 시도 방법 및 쟁점
싵ӗ
연관 강연
NDC2010
패킷 지옥으로부터 탈출
NDC2011
마비노기 영웅전 자이언트 서버의 비밀
C++ 프로그래머를 위한 C#
용어
서비스 : 비동기 요청을 처리하는 주체
IDC의 그것이 아님
클라이언트 : 비동기로 요청을 보내는 주체
고객 시스템에 배포되는 그것이 아님
책임연구원
2010/2011, 마비노기2
2006/2009, 마비노기 영웅전
테크니컬 디렉터
2004/2005, 마비노기
2003/2004, 프로젝트 T2
2001/2003, Oz World
[ɡ̊ɪm̚ ʨæːsɤk̚]
/ɡim ɟɛːzʌɡ/
목적
네트워크 코딩에 스트레스 받지 말자
사용하는데 지나치게 지식을 요구하지 말 것
문제
네트워크 통신 ≠ 비즈니스 로직
네트워크 통신≠ 비즈니스 로직
비동기 로직을 꼼꼼하게 처리하면 좋겠다.
모든 송수신은 우아하고 효과적으로.
네트워크 또는 비동기?
네트워크 통신 ≠ 비즈니스 로직
필요한 정보가 요구되는 시점에
즉시 계산될 수 있는 것으로
생각하고 싶다.
또 다른 문제
C++ / C# 두 언어를 잘 지원할 것
방향
우아하고 효과적인 네트워크 코드는 “생성”
C++ / C# 두 언어에서 상호 운용이 되도록
생성되는 코드가 논리의 흐름을 끊지 말 것
기반수준에서 기술되는 고급지식은 숨길 것
상충하는 설계 목표
시스템 프로그래머
혹은
응용 프로그래머
설계목표 –
시스템 프로그래머
설계목표 –
응용 프로그래머
상충하는 설계 목표
시스템 프로그래머
혹은
응용 프로그래머
실제 문제의 본질
메시지 생성 및
프토토콜 반복기
1차 시기
메시지 생성
C# : LCG (Lightweight Code Generation)
4.0에서는 Expression Trees로 대체 가능
var dm = new DynamicMethod(…);
var il = dm.GetILGenerator();
…
@delegate = dm.CreateDelegate(…);
C++ : Visual Studio 매크로 또는 하드 코딩
쟁점
좋은 점
• C#은 데이터 형식만 만들면 직렬화 코드를
작성할 필요가 없다.
나쁜 점
• C++ 코드 생산성
• C# 형식의 가변성 / 제네릭 처리
프로토콜 반복기 (client)
var op = new Operation() { … };
op.OnComplete += _ => { … }; // ②
op.OnFail += _ => { … }; // ②’
RequestOperation(loc, op); // ①
프로토콜 반복기
(service)
IEnumerable<object> Run()
{
var op = Operation;
var info = …;
yield return info.ID;
yield return info.Name;
}
쟁점
좋은 점
• 연관 코드가 가까이 있음 (클라이언트)
나쁜 점
• 반복자 때문에 서비스 코딩 난이도가 높음
• C++에 사용 불가
• 중간 처리가 필요한 비동기 작업이 드묾
대리자 기반
코드 생성
2차 시기
대리자 기반
C# 대리자를 IDL (Interface Definition
Language)로 사용
[OperationContract]
public delegate bool
Authenticate(string credential);
ref T, out T
코드 생성
C++ Client / CLI Service를 가정하고
C++ / CIL 코드 생성
Hindley-Milner 형식 유추
불변성 : ref
가변성
공변성 : out, return
반공변성 : in
코드 사용 (C++ client)
channel->BeginAuthenticate(
credential, endAuthenticate,
object);
void EndAuthenticate(IAsyncResult*
asyncResult)
{
bool result = channel->
EndAuthenticate(asyncResult);
}
코드 사용 (CLI server)
public void Handle(
long clientID,
ref AuthenticateInvoke arg)
{
var response =
new AuthenticateReturn(
ref arg,
Validate(arg.Credential));
Server.Current.Return(
clientID, ref response);
}
쟁점
좋은 점
C#에서 패킷을 기술하면 클래스 자동 생성
나쁜 점
프로토콜의 연관성을 기술할 방법이 없음
클라이언트/서비스 코드의 대칭성 없음
높은 요구 배경 지식  Copy&Paste
유지보수성 (C++ / CIL)
인터페이스 기반
코드 생성
3차 시기
인터페이스 기반
C# 인터페이스를 IDL로 사용
[ServiceContract]
public interface IServiceProvider
{
[OperationContract]
bool SampleMethod(int arg1, ref float arg2, out string arg3);
[OperationContract(IsOneWay = true)]
void SampleOneWayMethod();
[OperationContract]
long SampleProperty { get; set; }
[OperationContract]
event EventHandler SampleEvent;
}
코드 생성
Client / Service 코드를 CodeDOM으로
C++ / CIL 양쪽에 대칭으로 생성
Asynchronous Programming Design Patterns
권고를 따라 생성
자명한 Serializable 형식은 C++에 복제
(열거형 등)
코드 사용 (열거형, C++)
// [System::SerializableAttribute()]
struct Facing : public System::ValueType
{
enum EnumType { Front = 0, Back = 1 };
typedef Int32 UnderlyingType;
static const EnumType MinValue = Front;
static const EnumType MaxValue = Back;
static const std::vector<Facing>& GetValues() { … }
static bool TryParse(const String& s, /*out*/Facing& result) { … }
static Facing Parse(const String& s) { … }
Facing() { … }
Facing(EnumType value) { … }
explicit Facing(UnderlyingType value) { … }
operator EnumType() const { … }
bool operator==(const Facing& value) const { … }
bool operator==(EnumType value) const { … }
String ToString() { … }
const String& ToString() const { … }
…
};
코드 사용 (client)
public void SampleMethodAsync(int arg1, ref
float arg2);
public void SampleMethodAsync(int arg1, ref
float arg2, object userState);
public event
SampleMethodCompletedEventHandler
SampleMethodCompleted;
protected IAsyncResult BeginSampleMethod(int
arg1, ref float arg2, AsyncCallback
callback, object @object);
protected bool EndSampleMethod(IAsyncResult
asyncResult, out float arg2, out string
arg3);
코드 사용 (client)
// C#
client.SampleMethodAsync(arg1, ref arg2,
e =>
{
try
{
string arg3;
var result = e.Return(
out arg2, out arg3);
…
}
catch (CommunicationException)
{
…
}
});
코드 사용 (client)
// C++
using namespace IServiceProviderEvents;
…
client->SampleMethodCompleted() +=
new SampleMethodCompletedEventHandler(*this, &OnSampleMethodCompleted);
…
client->SampleMethodAsync(arg1, arg2);
void OnSampleMethodCompleted(Object* sender, SampleMethodCompletedEventArgs* e)
{
try
{
float arg2;
String arg3;
bool result = e->Return(arg2, arg3);
…
}
catch (const Pointer<Exception>&)
{
…
}
}
코드 사용 (server)
// C#
public override bool SampleMethod(
int arg1, ref float arg2,
out string arg3)
{
…
}
// C++
bool SampleMethod(int arg1, float& arg2,
/*out*/String& arg3)
{
…
}
쟁점
좋은 점
작업을 위해 필요한 코드의 자동 생성으로
실제 개발에 투하되는 시간을 확보
C++ / CLI 양 쪽에서 일관성 있게 작업
나쁜 점
상속을 사용해서 생기는 제약
싵ӗ
Q&A
@tcaesvk

More Related Content

What's hot (20)

C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
Chris Ohk
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
Chris Ohk
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
[C++ korea] effective modern c++ study item8~10 정은식
[C++ korea] effective modern c++ study item8~10 정은식[C++ korea] effective modern c++ study item8~10 정은식
[C++ korea] effective modern c++ study item8~10 정은식
은식 정
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
Seok-joon Yun
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Seok-joon Yun
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item 24-26
[C++ Korea] Effective Modern C++ Study item 24-26[C++ Korea] Effective Modern C++ Study item 24-26
[C++ Korea] Effective Modern C++ Study item 24-26
Seok-joon Yun
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Seok-joon Yun
[C++]2 variables andselectionstatement
[C++]2 variables andselectionstatement[C++]2 variables andselectionstatement
[C++]2 variables andselectionstatement
Junyoung Jung
C++ 타입 추론
C++ 타입 추론C++ 타입 추론
C++ 타입 추론
Huey Park
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Isaac Jeon
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Seok-joon Yun
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino
영욱 김
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Function
wonmin lee
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
Chris Ohk
Hacosa js study 2주차
Hacosa js study 2주차Hacosa js study 2주차
Hacosa js study 2주차
Seong Bong Ji
[C++ korea] effective modern c++ study item 17 19 신촌 study
[C++ korea] effective modern c++ study item 17 19 신촌 study[C++ korea] effective modern c++ study item 17 19 신촌 study
[C++ korea] effective modern c++ study item 17 19 신촌 study
Seok-joon Yun
C++11
C++11C++11
C++11
Yubin Lim
6 swift 고급함수
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
Changwon National University
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
Chris Ohk
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
Chris Ohk
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
[C++ korea] effective modern c++ study item8~10 정은식
[C++ korea] effective modern c++ study item8~10 정은식[C++ korea] effective modern c++ study item8~10 정은식
[C++ korea] effective modern c++ study item8~10 정은식
은식 정
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
Seok-joon Yun
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Seok-joon Yun
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item 24-26
[C++ Korea] Effective Modern C++ Study item 24-26[C++ Korea] Effective Modern C++ Study item 24-26
[C++ Korea] Effective Modern C++ Study item 24-26
Seok-joon Yun
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Seok-joon Yun
[C++]2 variables andselectionstatement
[C++]2 variables andselectionstatement[C++]2 variables andselectionstatement
[C++]2 variables andselectionstatement
Junyoung Jung
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Isaac Jeon
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Seok-joon Yun
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino
영욱 김
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Function
wonmin lee
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
Chris Ohk
[C++ korea] effective modern c++ study item 17 19 신촌 study
[C++ korea] effective modern c++ study item 17 19 신촌 study[C++ korea] effective modern c++ study item 17 19 신촌 study
[C++ korea] effective modern c++ study item 17 19 신촌 study
Seok-joon Yun

Viewers also liked (20)

월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
tcaesvk
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
tcaesvk
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
tcaesvk
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
승명 양
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
Eunseok Yi
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
tcaesvk
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
흥배 최
KGC2015 - 이 게임을 만든 사람들은 누구인가요
KGC2015 - 이 게임을 만든 사람들은 누구인가요KGC2015 - 이 게임을 만든 사람들은 누구인가요
KGC2015 - 이 게임을 만든 사람들은 누구인가요
영욱 오
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
Wonha Ryu
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
Wonha Ryu
NDC 2015 마비노기 듀얼 패치 시스템
NDC 2015 마비노기 듀얼 패치 시스템NDC 2015 마비노기 듀얼 패치 시스템
NDC 2015 마비노기 듀얼 패치 시스템
tcaesvk
김재석, 패킷 지옥으로부터 탈출, NDC2010
김재석, 패킷 지옥으로부터 탈출, NDC2010김재석, 패킷 지옥으로부터 탈출, NDC2010
김재석, 패킷 지옥으로부터 탈출, NDC2010
devCAT Studio, NEXON
NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출
tcaesvk
NDC 2011, C++ 프로그래머를 위한 C#
NDC 2011, C++ 프로그래머를 위한 C#NDC 2011, C++ 프로그래머를 위한 C#
NDC 2011, C++ 프로그래머를 위한 C#
tcaesvk
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
강 민우
Cross linking PresentationCross linking Presentation
Cross linking Presentation
peredelcampo
[NDC] 인디 게임 개발사의 콘솔도전기
[NDC] 인디 게임 개발사의 콘솔도전기[NDC] 인디 게임 개발사의 콘솔도전기
[NDC] 인디 게임 개발사의 콘솔도전기
Seokho Lee
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
devCAT Studio, NEXON
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
Eunseok Yi
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
tcaesvk
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
tcaesvk
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
tcaesvk
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
승명 양
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
Eunseok Yi
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
tcaesvk
KGC2015 - 이 게임을 만든 사람들은 누구인가요
KGC2015 - 이 게임을 만든 사람들은 누구인가요KGC2015 - 이 게임을 만든 사람들은 누구인가요
KGC2015 - 이 게임을 만든 사람들은 누구인가요
영욱 오
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
Wonha Ryu
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
Wonha Ryu
NDC 2015 마비노기 듀얼 패치 시스템
NDC 2015 마비노기 듀얼 패치 시스템NDC 2015 마비노기 듀얼 패치 시스템
NDC 2015 마비노기 듀얼 패치 시스템
tcaesvk
김재석, 패킷 지옥으로부터 탈출, NDC2010
김재석, 패킷 지옥으로부터 탈출, NDC2010김재석, 패킷 지옥으로부터 탈출, NDC2010
김재석, 패킷 지옥으로부터 탈출, NDC2010
devCAT Studio, NEXON
NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출
tcaesvk
NDC 2011, C++ 프로그래머를 위한 C#
NDC 2011, C++ 프로그래머를 위한 C#NDC 2011, C++ 프로그래머를 위한 C#
NDC 2011, C++ 프로그래머를 위한 C#
tcaesvk
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
강 민우
Cross linking PresentationCross linking Presentation
Cross linking Presentation
peredelcampo
[NDC] 인디 게임 개발사의 콘솔도전기
[NDC] 인디 게임 개발사의 콘솔도전기[NDC] 인디 게임 개발사의 콘솔도전기
[NDC] 인디 게임 개발사의 콘솔도전기
Seokho Lee
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
devCAT Studio, NEXON
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
Eunseok Yi
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON

Similar to NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서 (20)

20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
Chiwon Song
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha
[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli
종빈 오
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
병걸 윤
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
KH Park (박경훈)
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
Sungkyun Kim
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
Daehee Kim
C언어 세미나 - 함수
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수
SeungHyun Lee
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?
Kyoung Up Jung
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
Jaeseung Ha
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
Ryan Park
Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015
Kris Jeong
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
Chiwon Song
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha
[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli
종빈 오
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
병걸 윤
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
KH Park (박경훈)
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
Sungkyun Kim
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
Daehee Kim
C언어 세미나 - 함수
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수
SeungHyun Lee
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
Jaeseung Ha
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
Ryan Park
Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015
Kris Jeong

NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서

  • 1. 네트워크 비동기 통신, 합의점의 길목에서 ㈜넥슨 신규개발3본부 개발1실 GTR팀 성능연구유닛 김재석
  • 2. 다룰 내용 네트워크 프레임워크 프레임워크 개발 목표 및 구현 시기별 시도 방법 및 쟁점 싵ӗ
  • 3. 연관 강연 NDC2010 패킷 지옥으로부터 탈출 NDC2011 마비노기 영웅전 자이언트 서버의 비밀 C++ 프로그래머를 위한 C#
  • 4. 용어 서비스 : 비동기 요청을 처리하는 주체 IDC의 그것이 아님 클라이언트 : 비동기로 요청을 보내는 주체 고객 시스템에 배포되는 그것이 아님
  • 5. 책임연구원 2010/2011, 마비노기2 2006/2009, 마비노기 영웅전 테크니컬 디렉터 2004/2005, 마비노기 2003/2004, 프로젝트 T2 2001/2003, Oz World [ɡ̊ɪm̚ ʨæːsɤk̚] /ɡim ɟɛːzʌɡ/
  • 6. 목적 네트워크 코딩에 스트레스 받지 말자 사용하는데 지나치게 지식을 요구하지 말 것
  • 7. 문제 네트워크 통신 ≠ 비즈니스 로직
  • 8. 네트워크 통신≠ 비즈니스 로직 비동기 로직을 꼼꼼하게 처리하면 좋겠다. 모든 송수신은 우아하고 효과적으로. 네트워크 또는 비동기?
  • 9. 네트워크 통신 ≠ 비즈니스 로직 필요한 정보가 요구되는 시점에 즉시 계산될 수 있는 것으로 생각하고 싶다.
  • 10. 또 다른 문제 C++ / C# 두 언어를 잘 지원할 것
  • 11. 방향 우아하고 효과적인 네트워크 코드는 “생성” C++ / C# 두 언어에서 상호 운용이 되도록 생성되는 코드가 논리의 흐름을 끊지 말 것 기반수준에서 기술되는 고급지식은 숨길 것
  • 12. 상충하는 설계 목표 시스템 프로그래머 혹은 응용 프로그래머
  • 15. 상충하는 설계 목표 시스템 프로그래머 혹은 응용 프로그래머
  • 17. 메시지 생성 및 프토토콜 반복기 1차 시기
  • 18. 메시지 생성 C# : LCG (Lightweight Code Generation) 4.0에서는 Expression Trees로 대체 가능 var dm = new DynamicMethod(…); var il = dm.GetILGenerator(); … @delegate = dm.CreateDelegate(…); C++ : Visual Studio 매크로 또는 하드 코딩
  • 19. 쟁점 좋은 점 • C#은 데이터 형식만 만들면 직렬화 코드를 작성할 필요가 없다. 나쁜 점 • C++ 코드 생산성 • C# 형식의 가변성 / 제네릭 처리
  • 20. 프로토콜 반복기 (client) var op = new Operation() { … }; op.OnComplete += _ => { … }; // ② op.OnFail += _ => { … }; // ②’ RequestOperation(loc, op); // ①
  • 21. 프로토콜 반복기 (service) IEnumerable<object> Run() { var op = Operation; var info = …; yield return info.ID; yield return info.Name; }
  • 22. 쟁점 좋은 점 • 연관 코드가 가까이 있음 (클라이언트) 나쁜 점 • 반복자 때문에 서비스 코딩 난이도가 높음 • C++에 사용 불가 • 중간 처리가 필요한 비동기 작업이 드묾
  • 24. 대리자 기반 C# 대리자를 IDL (Interface Definition Language)로 사용 [OperationContract] public delegate bool Authenticate(string credential); ref T, out T
  • 25. 코드 생성 C++ Client / CLI Service를 가정하고 C++ / CIL 코드 생성 Hindley-Milner 형식 유추 불변성 : ref 가변성 공변성 : out, return 반공변성 : in
  • 26. 코드 사용 (C++ client) channel->BeginAuthenticate( credential, endAuthenticate, object); void EndAuthenticate(IAsyncResult* asyncResult) { bool result = channel-> EndAuthenticate(asyncResult); }
  • 27. 코드 사용 (CLI server) public void Handle( long clientID, ref AuthenticateInvoke arg) { var response = new AuthenticateReturn( ref arg, Validate(arg.Credential)); Server.Current.Return( clientID, ref response); }
  • 28. 쟁점 좋은 점 C#에서 패킷을 기술하면 클래스 자동 생성 나쁜 점 프로토콜의 연관성을 기술할 방법이 없음 클라이언트/서비스 코드의 대칭성 없음 높은 요구 배경 지식  Copy&Paste 유지보수성 (C++ / CIL)
  • 30. 인터페이스 기반 C# 인터페이스를 IDL로 사용 [ServiceContract] public interface IServiceProvider { [OperationContract] bool SampleMethod(int arg1, ref float arg2, out string arg3); [OperationContract(IsOneWay = true)] void SampleOneWayMethod(); [OperationContract] long SampleProperty { get; set; } [OperationContract] event EventHandler SampleEvent; }
  • 31. 코드 생성 Client / Service 코드를 CodeDOM으로 C++ / CIL 양쪽에 대칭으로 생성 Asynchronous Programming Design Patterns 권고를 따라 생성 자명한 Serializable 형식은 C++에 복제 (열거형 등)
  • 32. 코드 사용 (열거형, C++) // [System::SerializableAttribute()] struct Facing : public System::ValueType { enum EnumType { Front = 0, Back = 1 }; typedef Int32 UnderlyingType; static const EnumType MinValue = Front; static const EnumType MaxValue = Back; static const std::vector<Facing>& GetValues() { … } static bool TryParse(const String& s, /*out*/Facing& result) { … } static Facing Parse(const String& s) { … } Facing() { … } Facing(EnumType value) { … } explicit Facing(UnderlyingType value) { … } operator EnumType() const { … } bool operator==(const Facing& value) const { … } bool operator==(EnumType value) const { … } String ToString() { … } const String& ToString() const { … } … };
  • 33. 코드 사용 (client) public void SampleMethodAsync(int arg1, ref float arg2); public void SampleMethodAsync(int arg1, ref float arg2, object userState); public event SampleMethodCompletedEventHandler SampleMethodCompleted; protected IAsyncResult BeginSampleMethod(int arg1, ref float arg2, AsyncCallback callback, object @object); protected bool EndSampleMethod(IAsyncResult asyncResult, out float arg2, out string arg3);
  • 34. 코드 사용 (client) // C# client.SampleMethodAsync(arg1, ref arg2, e => { try { string arg3; var result = e.Return( out arg2, out arg3); … } catch (CommunicationException) { … } });
  • 35. 코드 사용 (client) // C++ using namespace IServiceProviderEvents; … client->SampleMethodCompleted() += new SampleMethodCompletedEventHandler(*this, &OnSampleMethodCompleted); … client->SampleMethodAsync(arg1, arg2); void OnSampleMethodCompleted(Object* sender, SampleMethodCompletedEventArgs* e) { try { float arg2; String arg3; bool result = e->Return(arg2, arg3); … } catch (const Pointer<Exception>&) { … } }
  • 36. 코드 사용 (server) // C# public override bool SampleMethod( int arg1, ref float arg2, out string arg3) { … } // C++ bool SampleMethod(int arg1, float& arg2, /*out*/String& arg3) { … }
  • 37. 쟁점 좋은 점 작업을 위해 필요한 코드의 자동 생성으로 실제 개발에 투하되는 시간을 확보 C++ / CLI 양 쪽에서 일관성 있게 작업 나쁜 점 상속을 사용해서 생기는 제약
  • 38. 싵ӗ