Wednesday, April 26, 2017

서버 프로그래밍 공부에 대한 생각

바쁘신분들을 위한 요약
1. 먼저 무료/상용 엔진을 학습해 보세요 (상용엔진 추천! 가장 표준적이고 쉬우며 편의성을 제공)
2. 자신이 컨텐츠를 만들고 싶은지, 서버 엔진 프로그래머로 취업을 원하는지 고민해 보세요.
3. 그래도 욕심이 나시면 이 글에서 소개하는 내용들을 참고해보세요.

어떤 분께서 클라이언트신데 서버를 어떻게 배워야 할지 모르겠다고 쓰신 글을 보고 작성해 봅니다.
C++ 윈도우 서버를 처음부터 만든다면 다음과 같은 내용을 공부해야 할것으로 생각됩니다.
지극히 주관적인 생각이니까 참고만 부탁드려요. 의견은 환영하지만 부드럽게 부탁드립니다 ^_^;;
1. 준비학습
1-1. win socket (tcp/udp)
1-2. iocp
1-3. overlapped io
1-4. 멀티스레드
1-5. 메모리/오브젝트 풀
1-6. 3,5를 활용한 브로드캐스팅
1-0. 별도로 간단히 SQL의 사용법
이 밖에도 TCP의 전송 및 혼잡제어 부분은 udp를 만들때 응용되기도 하고, 전송 중 예외처리를 위해 중요하다고 생각합니다.
보통 이쯤 될때까지 혼자 만들다보면 어쩐지 udp를 슬슬 버리게 됩니다. 이핑계 저핑계 대면서요 ㅎ
중국에서 udp를 쓰면 다 털린다던가...
암호화 알고리즘에 대해 나와야 할것같은데? 라고 생각하시는 분도 계시겠지만 공부하며 혼자 하다보면 저것도 벅차요 ㅋ
디비는 살짝 논외로 쳤는데 결국은 필요해집니다. 레디스라거나 하는걸 추가로 학습하면 좋을듯!

공부가 끝난 뒤 개발해야 할 내용은
2. 모듈 개발
2-1. 로깅시스템
2-2. 메모리/오브젝트 풀
2-3. 스레드 풀 (TLS랑 전역적인거 둘 다 되는걸로)
2-4. iocp 모듈 (프로엑터 패턴. tcp, udp)
2-5. 패킷 프로세싱 (전송 및 혼잡제어)
2-6. 테스트로 사용할 서버/클라
2-7. 우아한 접속/종료 및 예외처리
2-8. 스트레스 테스트 툴
이렇게 만들어보면 조금 감이 올 것이고 그 다음에 해야 할 일은 모듈화 해서 라이브러리로 만드는 것이겠죠.
그런데 라이브러리화가 끝나면 '자 이제 시작이야~(내꿈을) 내꿈을 위한여행~(피카츄)' 가 시작됩니다.
바로 서버 구조란 무엇인가... 에 대해 고민해야 할 차례거든요.

3. 서버 구조 설계
3-1. 한대의 서버가 클라이언트들을 받아들이는 가장 단순한 구조 (유저가 많아지면 서버를 나눔)
3-2. 서버가 많아짐에 따라 접속/인증만 처리하는 로비서버 + 여러대의 게임서버 구조
3-3. 인증을 만들다보면 필요한 페킷 암호화 및 인증키 처리 (여기서 이걸 우겨넣다가 라이브러리를 재설계 하는 일도;;)
3-4. 그런데 요즘 유저들은 서버 자체가 나뉘면 싫어하지 않을까요? 체널링에 대한 고민
3-5. 체널링에 따른 인증 이동기능
3-6. 서버간 통신 및 브로드캐스팅 (ex 메이플의 메가폰. 운영자공지 등)
뭐 이정도 공부하고 이정도 만들면 되지 않을까... 그렇게 생각하고 있습니다.
그런데 과연... 자신이 서버 프로그래머로 취직할게 아니거나, 컨텐츠 서버 프로그래머로 취직하려고 해도 이런 내용들이 전부 필요할까요? 저는 그것에 대해서는 상당히 회의적입니다. 간단히 클라이언트만 봐도 요즘 DirectX12 배우시는 학생분들 있으신가요? 여기서 만약 부스트 asio가 등장한다고 해도 대분류 1번 준비학습 정도만 생략되는 수준입니다.
뿐만 아니라 아무리 asio나 부스트가 좋다고 해도 사실 1번에서 누군가 이끌어주지 않으면 많은 시행착오를 겪게됩니다.
어떻게 만들어야 쓰기 편하고 표준적인지 알기 어렵기 때문이죠.
DirectX 처음 배울때 3D MAX 파싱해서 물체 띄우는 수준으로 게임엔진을 만들 수 없는것과 같습니다.

4. 권장 사항
이때 제가 권할 수 있는 방법은 일단 오픈소스나 상용엔진을 학습해보는 것입니다.
여기서 서버엔진이란 무엇이며, 어떻게 쓰는것이 표준적이고 효율적인 설계인지를 엿볼 수 있습니다.
그 뒤에 자신이 무엇을 하고싶은지 고민해보세요.
컨텐츠를 만드시고 싶다면 서버엔진을 배우시고 잘 활용하는 쪽으로 학습하시는걸 추천합니다.
그러나 나는 '서버 엔진 프로그래머가 되겠어!'라고 결심하셨다면 위의 것들을 하나씩 정복해 나가시면 될 것 같습니다 ㅎ

5. 핵심?
프로그래머로 일하는데 있어서 서버를 지향하시는 분들께서는 이정도면 되지 않을까.. 그렇게 생각합니다.
라우터라던가 L4스위치 등 하드웨어에 대한 지식이 풍부하면 도움은 되겠지만 프로그래밍 이외의 범위임으로 일단 생략...
우리 마음대로 만들겠다! 라며 상용 엔진을 사용하지 않는 회사들도 재야의 고수들이 기본기 있고 범용적인 라이브러리
드ㄹ을 자체적으로 개발해서 사용하고 있기 때문에 무료/상용 엔진으로 기본기와 구조를 익혀도 좋습니다.
넷트워크에서 중요한 신뢰성등은 사실 지식도 필요하지만 많은 노하우가 중요한 만큼 상용엔진을
쓰는것이 안정적이고 편안하고 안락한 퇴근을 보장하죠... ㅇ<-<
세롭게 공부하면서 개발해 보는것도 중요하지만 상용 엔진을 권하는 이유는 이밖에도 많습니다.
요즘 트렌드는 엔진을 처음부터 개발하기 보다는 그간 만들어진 바퀴들도 얼마나 멋진것을 만들어내느냐에 있으니까요
!

두서없고 주관적인 글 읽어주셔서 감사합니다. 위에 살짝 요약해뒀고요. 질문이나 부드러운 의견은 언제나 환영합니다!
http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=4473

No comments:

Post a Comment