네트워크에 DB 붙이기

개발하는 운동인·2025년 11월 20일
  • DB 기능과 네트워크 기능을 자주 사용해야 하기 때문에 싱글톤 패턴을 자주 사용한다.
  • 싱글톤 패턴은 간단하지만, 멀티스레드에서 안전하지 않다. -> static 변수를 lock을 하지 않기 때문

쓰레드 세이프 싱글턴

  • 멀티스레드 안전
  • 서버 개발에서 많이 사용
private static GameManager instance;
private static lockObj = new Object();

public static GameManager Instance
{
	get
    {
    	lock(lockObj)
        {
        	if(instance == null)
            	instance = new GameManager();
        }
        return instance;
   }
}

Lazy< T > 기반 싱글턴

DB 붙이기

    1. 연결해야 할 DB 선정
    1. 해당 DB의 SDK 또는 Package를 참조 -> ex) 유니티에 DB를 연동

구현

  1. MonoDB를 이용해서 DB를 구성한다.
  • NugetPackage -> MongoDB.Driver를 프로젝트에 추가

  1. 패킷 설계
  • 클라이언트 -> 서버 요청, 서버 -> 클라이언트 응답을 어떻게 약속할지 정의 , enum으로 숫자를 맞추고, 서버와 클라이언트가 동일하게 가지고 있어야 한다.
  1. 패킷 만들기
  • 어떻게 만들지? 유저의 ID나 유저 정보와 관련된 것들 -> 서버와 클라이언트가 동일하게 가지고 있어야 한다.
  1. 패킷 핸들러의 패킷 설계 했었던 번호를 처리할 함수 등록, 즉, 패킷 처리 함수를 등록
  2. 패킷 처리 함수 구현, 인자로 ServerPacketData를 갖고 있다.
  • 서버 패킷 Data는 사전에 정의했었고, 이 방식대로 패킷을 받아야 함

미정

    1. 클라이언트 - 어떤 버튼 클릭 했을 때
  • 위 코드를 짜려면, 패킷을 정의해야 함. 클라이언트에서
  public enum PACKETID : int
  {
      //...생략
      
      REQ_USER_ACCESSION = 1095,
      RES_USER_ACCESSION = 1096,

          //...생략
      
  }
    1. 서버쪽에서도 똑같이 만들어줌.
  public enum PACKETID : int
  {
      //...생략
      
      REQ_USER_ACCESSION = 1095,
      RES_USER_ACCESSION = 1096,

          //...생략
      
  }
    1. 뭘 보낼게?가 되어야 함. -> 택배의 수신지 주소와 수신지를 알고, 해당 주소에 내용물을 정의. 내용물 userID, 토큰, 레벨
  • 클라이언트에서 해당 내용물을 받아옴

    1. 패킷 그대로 보낼 수 없으니, 직렬화하여 서버에 보냄

RedisManager

  • 싱글톤 패턴으로 제작
  • StackExchange.Redis Nuget 패키지를 이용
  • Connet / Shutdown 구현
  • CRUD 구현
  • 실제 서비스 게임을 만들 때는 비동기 함수를 써야 함.

동기

  • 작업이 순차적
  • 하나의 작업이 끝낭 다른 작업 가능 Thread.Sleep(1000); cpu가 1초간 멈춤 유니티에서 코루틴 역할 -> cpu가 대기시간을 발생시키는 경우 비효율적
  • 서버라면 대기중인 요청을 처리하지 못함 -> 그래서 서버 프로그래밍 할 때 잘 안씀.

비동기

  • 병렬이 아님

  • 기다리는 작업은 스레드에 맡기고, 나머지는 코드 먼저 실행 Task.Delay(3000); 스레드를 할당

  • cpu가 대기를 하지 않고 바로 반환, 기다리지 않고 병렬 처리

  • 3초 동안 스레드를 반환 -> 스레드가 다른 일 하러 감

  • 그 스레드는 다른 작업을 수행 가능 -> 스레드가 다른 일 하는 중

  • 3초 후 다른 작업이 완료되면 다시 이어서 실행 -> 스레드가 다른 일이 완료 되면 다시 원래 자리로 와서 일함

  • 스레드는 놀지 않음

비동기 프로그래밍

  • Task.Delay()는 보통 델리게이트로 구현한다. Delay가 끝나면 다른 함수 호출하게 보통 함

  • async / await

  • async : 비동기 함수를 선언 , 반드시 aswait를 포함할 필요는 없다. 반환형은 Task,Task, void 중 하나

  • await : 비동기 작업을 기다림, 현재 스레드를 멈추지 않고, 바로 반납 바로 반납


0개의 댓글