반응형

공부 542

Part 4-4-9. 패킷 직렬화 : Packet Generator #4

패킷 직렬화 지난 시간에는 Packet Id가 담긴 Enum을 포함하여 FileFormat을 새롭게 추가하고, 또 byte 처리와 이중 list를 처리하는 로직도 추가하였다. 마지막으로 추가한 로직이 정상적으로 잘 작동하는지 실행해보며 확인하는 시간을 가져 자동화 하는 과정을 조금 더 완성시켰다. 📜 PDL 문서 자동화 지난 시간까지 우리는 PDL 파일을 수동으로 생성해주고, 이를 복사한 뒤 Debug 폴더에 넣어주는 방식으로 작업을 진행하고 있었다. 그러나 이제는 직접 파일 경로를 지정하여 원본을 참조하는 방식으로 구현을 변경할 것이다. 방법은 크게 어렵지 않다. 저장 경로를 나타내는 pdlPath를 생성해주어 이를 활용하여 처리해준다. 이 후, Create 메서드를 실행 할 때 pdlPath를 입력하..

Part 4-4-8. 패킷 직렬화 : Packet Generator #3

패킷 직렬화 지난 시간에는 Packet Generator를 이용하여 패킷 처리 코드를 자동화 하는 작업을 해보았다. 또한 완성된 코드를 기존 코드에 대체해보며 정상적으로 코드가 실행되는지 테스트해보았다. 오늘도 지난 시간에 이어 자동화 코드를 보다 개선해보도록 하자. 💘 FileForamt 코드를 계속해서 수정하는데, 이를 매번 Client Session, Server Session에 복사, 붙여넣기 하는 작업 또한 귀찮아진다. 따라서 해당 과정도 파일의 내용을 참조하여 사용해 자동화 하는 과정을 만들 수 있다. 이를 처리하기 위해서는 PacketFormat 스크립트 내부에 몇 가지 코드를 더 작성해야 하므로 먼저 그 작업을 처리해보자. 🖋️ Using 처리 파일을 통째로 가져와서 사용하기 위해서는 us..

Part 4-4-7. 패킷 직렬화 : Packet Generator #2

패킷 직렬화 지난 시간에는 Packet Generator를 이용하여 패킷 자동화를 어떻게 하면 구성하고, 사용할 수 있는가? 에 대해서 개념 이해를 가지는 시간을 가졌다. Xml 파일에 담긴 데이터를 읽어와 각 타입별로 적합하게 변환하는 작업이 굉장히 유용하여서 추후 다른 프로젝트에서도 필요하다면 사용할 수 있어보인다. 🫵 GenPackets.cs 🧗‍♀️ 파일 생성 using (XmlReader x = XmlReader.Create("PDL.xml", settings)) { x.MoveToContent(); while (x.Read()) { if (x.Depth == 1 && x.NodeType == XmlNodeType.Element) ParsePacket(x); } File.WriteAllText(..

Part 4-4-6. 패킷 직렬화 : Packet Generator #1

패킷 직렬화 지난 시간에는 직렬화, 역직렬화를 마무리 하는 시간을 가졌다. 이를 통해 숫자, 문자, 구조체, 리스트 등 다양한 형태의 자료형들을 어떠한 방법으로 인코딩하여 패킷을 보내주고, 이를 수신하여 읽을 때 어떻게 역직렬화 하여 데이터를 처리하는 지 알아보았다. 즉 Packet 하나를 만들어 Session에 대해서 학습하였다. 오늘 학습은 이러한 패킷들을 자동화하여 처리하는 Packet Generator에 대해서 알아보도록 하자. 📪 Packet Generator 자동화는 지금까지 하드코딩으로 진행하며 작업했던 것들을 자동화하여 처리하는 것을 뜻한다. 여태껏 Session을 만들어 줄 때 자료형을 하나하나 입력해주어서 만들어 주었지만, 이제 Packet Generator를 통해 자동화 처리를 한다...

Part 4-4-5. 패킷 직렬화 : Serialization #4

패킷 직렬화 지난 시간에는 ushort, int 자료형과 같이 크기가 정해져 있는 자료형과는 다른 string 자료형의 패킷 Write, Read에 대해서 알아보았다. 이는 크게 2가지의 방법으로 나뉘어져 있는데, 먼저 String Packet의 사이즈를 확인하고 그 다음 내부 데이터 값을 전송하는 방법이었다. 그렇다면 오늘은 String에서 더 나아가 List 자료구조를 보낼 때에는 어떻게 처리해야 하는지에 대해서 학습해본다. 💷 List Packet 그렇다면 List Packet은 어떻게 넘겨줄 수 있을까? 예시를 들어 설명하기 위해 기존에 작업하던 PlayerInfoReq 클래스에 새로운 List를 추가하자. public List skills = new List(); { } public struct..

Part 4-4-4. 패킷 직렬화 : Serialization #3

패킷 직렬화 지난 시간에는 유니코드와 인코딩의 기본적인 개념과 UTF-8, 16의 개념 및 차이점에 대해서 알아보았다. 이러한 지식을 바탕으로 오늘 배울 문자열 처리를 잘 학습해보자. 🧐 🚩 코드개선 Session Write 기존 코드는 아래 이미지와 같이 new Span을 사용하여 packetId, playerId 값을 세그먼트에 넘겨주었다. 이 부분을 보다 가독성 좋고 효율적으로 변경할 수 있다. 바로 매번 Span 변수를 사용하는 것이 아닌 Span 변수를 한번만 호출하고 선언하여 세그먼트의 값을 받아와 Span의 Offset 값만 변경하며 필요한 값들을 byte 타입으로 변경시켜 줄것이다. 변경된 코드를 보면 Span span을 선언하여 사용한다. 또한 기존 코드에서는 각 패킷의 사이즈를 하드코딩..

Part 4-4-3. 패킷 직렬화 : UTF-8 vs UTF-16

패킷 직렬화 지난 시간에는 Send(=Write)와 Recv(=Read) 두 메서드를 Packet이라는 최상위 부모 객체에 abstract로 선언하여 이를 각자의 패킷(PlayerInfoReq)에서 override 하는 작업을 통해 또 한번의 개선을 진행했다. 이번 시간에는 Serialization에 더 자세하게 알아보기 전에 인코딩과 UTF-8, 16에 대해서 알아보자. 🍦 유니코드 유니코드(Unicode)란? 유니코드는 글자들의 특별한 번호표 같은 것이다. 예를 들어, "A"는 유니코드에서 특정한 번호를 가지고 있고, "가"라는 한글도 또 다른 번호를 가지고 있다. 🧐 왜 이런 번호를 가지게 되었을까? 1. 글자를 쉽게 구분하기 위해 * 유니코드는 전 세계의 거의 모든 글자들을 포함하고 있습니다. 각..

[뒤끝 강의] 온라인 게임 개발 #02 - 유저 관리 기능을 이용한 로그인

뒤끝 이번 시간에는 '게임 유저 관리' 기능을 이용한 로그인을 배웁니다. 다만 학습하기 전 뒤끝에서 제공하는 함수는 크게 동기, 비동기, SendQueue로 호출할 수 있습니다. 각각에 대해서 먼저 알아보도록 하겠습니다. 🧐 동기 비동기 SendQueue 비동기 호출을 위한 처리 BackendManager 스크립트를 다음과 같이 수정합니다. using UnityEngine; using BackEnd; // 뒤끝 SDK public class BackendManager : MonoBehaviour { private void Awake() { // Update() 메소드의 Backend.AsyncPoll() 호출을 위해 오브젝트 파괴 방지 DontDestroyOnLoad(gameObject); // 뒤끝 서..

[뒤끝 강의] 온라인 게임 개발 #01 - 뒤끝 SDK 설치 및 준비

뒤끝 뒤끝 계정 생성 및 프로젝트 생성에 관한 내용은 따로 작성하지 않는다. 😜 유니티 프로젝트 생성 및 설정 유니티 허브에서 새로운 프로젝트를 생성한 뒤 뒤끝 홈페이지에서 문서 - 뒤끝 SDK를 눌러 최신 버전의 뒤끝 SDK를 다운로드 받는다. 이 후 다운로드한 패키지 파일을 유니티 프로젝트에 임포트 한 후 Unty - The Backend - Edit Setting을 눌러준다. 뒤끝 콘솔에서 생성한 프로젝트에 들어 간 후 인증 정보 탭에 들어가 Client App Id와 Signature Key를 TheBackendSettings 객체 Client App Id와 Signature Key에 넣어준다. 뒤끝 초기화 뒤끝 서버 사용을 위한 BackendManager 스크립트를 생성 후 아래와 같이 적어줍니..

[뒤끝 강의] 온라인 게임 개발 #00 - 뒤끝 소개

뒤끝이란? PC, 콘솔, 모바일 등의 다양한 플랫폼에서 온라인 게임 개발 및 운영을 위해 필요한 서버, 데이터베이스 구축을 보다 손쉽게 설정할 수 있는 서버 시스템이다. ❓ 게임 서버가 왜 필요한데? 1. 기기 변경, 초기화 등에 따른 유저 데이터를 안전하게 유지할 수 있다. 2. 푸시 메시지, 우편, 이벤트, 랭킹, 소셜 기능 활용을 통한 유저 리텐션 및 플레이타임 개선이 가능하다. 3. 게임 내 밸런스 데이터를 서버에서 관리하기 때문에 수치를 조정하기 위해 앱을 업데이트 하지 않고 뒤끝에서 게임 밸런스를 수정할 수 있다. 4. 유저 주요 지표 및 로그를 통한 이탈 구간 확인 개선 및 유저 데이터 분석 및 관리하는 기능으로 데이터 분석 관리를 할 수 있다. 5. 캐시 재화 충전 및 영수증 검증을 통한 ..

Part 4-4-2. 패킷 직렬화 : Serialization #2

패킷 직렬화 지난 시간에는 직렬화, 역직렬화의 개념과 이를 예시를 통해 이해하고 학습하였다. 물론 아직 개선이 필요한 부분은 많이 있지만.. 🤔 📌 직렬화 #2 Send 개선 지난 시간에 열심히 뜯어고친 OnConneccted 메서드 내부에서 buffer를 Send 하는 부분을 더욱 편리하게 사용하기 위해 이를 PlayerInfoReq 클래스 내부에 함수로 만들어 줄 것이다. 위 스크립트에서 빨간 줄로 그어진 부분을 개선할 것이다. 😋 먼저 사용하지 않는 PlayerInfoOk 클래스는 지워주고, Server 쪽에서 패킷을 읽는 부분(=역직렬화)도 매번 재사용 하기 위한 Read 메서드와, 패킷을 보내기 전 직렬화 하는 과정인 Write 메서드를 작성한다. public abstract class Pack..

Part 4-4-1. 패킷 직렬화 : Serialization #1

패킷 직렬화 지난 시간까지 Session, Connector, RecvBuffer, SendBuffer, PacketSession 등 다양한 클래스를 만들어 패킷 통신에 대해서 진행해보았다. 또한 통신하는 과정에서의 개선, 최적화 등 다양한 방식의 작업 또한 추가적으로 진행해보았다. 이번 세션에서는 패킷 직렬화를 통해 String, List 등 다양한 타입을 가지는 자료형들에 대해서 어떻게 전송이 필요하고, 어떤 방식으로 압축해야 하는지 등 보다 자세하게 알아보자. 📌 직렬화 마이크로소프트 공식 홈페이지에 따르면 C#(.NET)에서의 직렬화란 '지속시키거나 전송할 수 있는 형태로 개체 상태를 변환하는 프로세스'를 뜻한다. 그렇다면 왜? 직렬화를 사용해야 하고 이용해야할까? 이는 간단하다. String, ..

Part 4-3-13. 네트워크 프로그래밍 : PacketSession

네트워크 프로그래밍 지난 시간에는 SendBuff 클래스를 만들었다. 클래스 내부에는 버퍼로 활용해 줄 recvBuffer, 사용한 영역을 표기하는 usedSize, 남은 공간의 크기를 나타내는 FreeSize를 선언해준다. 또한 메서드로는 Receive와 같이 Open, Close 함수를 만들어었지만, Receive와는 다르게 Clean 함수는 만들어주지 않았다. 🤔 이 후, TreadLocal을 이용한 SendBufferHelper를 만들어 SendBuff 클래스 내부를 건드리지 않고 사용하였다. 패킷 전송하기 📤 패킷을 전송하는 방법까지 알아보았지만, 정작 패킷만 보았을 때 패킷의 사이즈가 어느정도인지 아직은 알 수 없다. 따라서 보통 패킷의 첫 번째 인자로는 사이즈를 넣어주고, 두 번째 인자로는 ..

Part 4-3-12. 네트워크 프로그래밍 : SendBuffer

네트워크 프로그래밍 지난 시간에는 ReceiveBuff를 만들어서 Read, Write Pos(=Segment)를 생성하였다. 이러한 과정에서 byte를 받아오고, 또 받아온 byte를 처리하는 로직을 작성하였다. 또한 중간중간 R/W Pos를 초기화해주는 Clear 함수, 작업이 완료 된 이후 OnRead, OnWrite 처리를 하는 메서드 또한 만들었다. 기존 Send의 문제점 기존 Send는 Encoding을 진행한 후, byte 타입으로 전환하여 이를 넘겨주고, 넘겨준 Send Queue에 저장하여 처리하는 방식으로 진행하였다. 이번 시간에는 기존에 Encoding으로 처리하던 방법을 이번에는 실질적인 패킷 데이터로 가정하고 넘겨 받기 위해 Send Buffer를 만들어 줄 것이다. 😎 Recei..

Part 4-3-11. 네트워크 프로그래밍 : RecvBuffer

네트워크 프로그래밍 지난 시간에는 TCP와 UDP 각각의 개념들에 대해서 알아보고, 또 '차이점은 무엇이 있는가?'에 대해서 학습하였다. 오늘은 이전 시간에 학습한 것과 마찬가지로 TCP 특성 중 현재 처리 가능한 패킷만 받고, 나머지는 나중에 처리하는 흐름제어 및 혼잡제어 기능을 구현하여 어떻게 처리하는지 알아보며 구현한다. 기존 코드의 문제점 기존 코드는 시작 시 SetBuffer의 위치를 0으로 설정해놓았기 때문에 TCP 특성상 100byte를 보내어도, 80byte만 받았을 경우 문제가 발생한다. 왜냐하면 80byte의 위치부터 나머지 20byte을 다 받은 후에 처리를 해야하기 때문이다. 따라서 현재 얼마나 받았고, 받아왔는지를 처리하며 표시할 방법이 필요하다. RecvBuffer 클래스 제작 ..

Part 4-3-10. 네트워크 프로그래밍 : TCP/UDP

네트워크 프로그래밍 지난 시간에는 Connector를 이용하여 ServerCore 프로젝트를 라이브러리화 하는 작업을 진행했다. 이번 시간에는 실질 적으로 패킷을 전송하고, 수신하는 부분을 만들 것이다. 그렇지만 우리 프로젝트는 현재 string으로만 데이터를 전송하고 있는데, 현업에서는 string 형태로 패킷을 전송하지 않기 때문에 이를 수정해야한다. 하지만 어떻게? 무슨 방법으로? 등 패킷 통신처리에 대한 다양한 대한 궁금증이 생기게 되는데 이 때 사용할 수 있는 방법이 TCP/UDP가 있다. 따라서 오늘은 TCP와 UDP에 대해서 다시금 알아보는 시간을 가진다. 예제 😎 간단하게 예를 들어보자. 우리가 아무것도 모르지만 TCP를 이용해 서버를 구성한다고 하면, TCP의 특징 떄문에 우리가 클라이언..

Part 4-3-9. 네트워크 프로그래밍 : Connector

네트워크 프로그래밍 지난 시간에는 Session을 상속하는 과정과 총 4가지의 Event Handler(OnConnected, OnRecv, OnSend, OnDisconnected )를 이용하여 구현하는 시간을 가졌다. 이번 시간에는 Connector를 만드는 시간을 가진다. 👍 Connector를 만들기 전에, 왜 만들어야 할까? 클라이언트와 서버간의 통신은 당연히 필요하기 때문에 구현하는 것이 맞지만, 서버만 이용하고 있는 곳에 왜 Connecotr가 필요할까? 그 이유는 다음과 같다. 1. 현재 서버 코어 같은 경우에는 서버를 메인 용도로 만들고 있지만 커넥트, 샌드, 리시브 하는 부분은 사실 공용으로 사용하면 좋다. 2. 서버 또한 분산처리를 할 수 있기 때문에 서버끼리의 연결과 통신이 필요하다..

Part 4-3-8. 네트워크 프로그래밍 : Session #4 (Event Handler)

네트워크 프로그래밍 지난 시간에서 우리는 Session을 만들어 소켓 프로그래밍의 Receive 부분과 Send 부분을 분리하여 작업이 진행되도록 처리 했다. 오늘은 Recv 부분의 코드 로직을 서버 단과 컨텐츠 단을 나누어서 작업이 진행될 수 있도록 개선할 것이다. 이 작업은 이벤트 핸들러를 이용하는 방법과, 상속을 이용하는 방법이 있지만 루키스님은 상속이 보다 구현하기 쉽기 때문에 상속 방법을 통해 이를 구현한다. 😎 Session 클래스 내 상속 메서드 추가 먼저 우리가 무엇을 사용해야 되는지 다시 한번 생각해보아야 한다. 이를 곰곰이 생각해 나누어 보면 크게 4가지로 나뉘어 질 수 있는 것을 알 수 있다. 1. 어떤 클라이언트에서 접속을 했는지 알 수 있는 OnConnected 2. 클라이언트가 ..

나를 성장시켜준 자기 계발 방법 3가지

주니어 시절 가장 어려웠던 건 ‘어떻게 자기 계발해야 하는지’ 방법을 몰랐다는 것이었다. 주변에 물어볼 만한 선배나 동료가 많지 않았고, 요즘처럼 다양한 플랫폼에서 직무 관련 많은 정보를 얻기도 쉽지 않았기 때문이다. 그래서 무작정 검색도 해보고, 주변에 참고할 만한 기획안을 요청해 보기도 하고, 서점에 가서 책도 읽었다. 관련 온/오프라인 세미나도 꾸준히 다니며 다양한 노력을 했다. 그렇게 성장에 목말라하던 나도 이제는 IT업계에서 일한 지 벌써 10년이 넘었다. 지금은 주변에 선배, 동료, 후배들도 많고, 자연스럽게 알게 되는 업계 소식도 많아졌다. 그래서 주니어 때만큼 성장에 목말라하지 않지만, 배움엔 끝이 없으니 멈추지 않고 정진하고 있다. 하지만 주니어 시절, 누군가 나에게 성장하는 방법을 알려..

공부/자기계발 2023.10.26
반응형