2 분 소요

오전 수업

1. 데이터베이스 효율화 : 샤딩

샤딩(sharding) : 데이터베이스를 물리적으로 쪼개는 기술. 하나의 게임 서버 데이터를 여러 개의 데이터베이스에서 관리한다는 것.
서버를 하나만 둘 경우 서버에 화재 등의 문제가 발생했을 때 전체 데이터를 사용할 수 없게 된다.
서버 자체가 가질 수 있는 한계를 해결할 수 있다. (서버를 나눔으로써 데이터의 용량을 확장하는 효과)
서버의 필요에 따라 줄어들거나 늘어들 수 있다
샤딩 수가 변경될 때마다 큰 비용이 발생한다.
나중에 SAGA라는 게 무엇인지 더 확인하여 적도록 하자.

해시 함수

빠른 데이터 검색을 위함
효율적인 구조로 저장(해시 테이블)
가장 간단한 방법은 값에 따라 모듈러 연산으로 값을 구하는 것

해시 충돌

다른 값임에도 나누는 방법에 따라 같은 값이 나올 수 있을 때 발생하는 것.
가능하면 동일한 키가 발생하지 않도록 만드는 게 중요하다.

체이닝(chaining)

해시 테이블처럼 등록을 하되, 테이블 각각의 원소 값을 연결리스트로 만들어 관리한다. 그러면 같은 해시 값이 나와도 여러 개의 값으 저장할 수 있게 된다.

consistent hashing?

링을 기반으로 하는 해싱 기법? 데이터를 링의 형탤로 관리하여 데이터를 관리한다는 것은 정확히 무슨 의미인지 아직 이해가 잘 가지 않는다. 일단 연결리스트를 시작과 끝을 연결시키는 방법으로 보이는데, 좀 더 연구를 해보자.

  1. 해시 링이 중심 자료인 모양이다.

샤딩의 단점

  1. 트랜잭션 : 하나의 DB만 걸리는 게 아니라 해당되는 모든 데이터가 들어 있는 DB가 전부 제한이 걸리게 된다.
    -> 해결 방법 : 분산 트랜잭션

트랜잭션 매니저

  1. 트랜잭션 매니저가 트랜잭션을 시작하고 0번과 1번 데이터베이스에 prepare 메시지를 보낸다.
  2. 각 데이터베이스는 트랜잭션을 수행하고 준비상태에 놓인다.
  3. 준비가 완료되면 각 데이터베이스는 prepared 메시지를 트랜잭션 매니저에 보낸다.
  4. 매니저가 각각 확인하고 commit 메시지를 보낸다.
  5. 각 데이터베이스는 트랜잭션을 커밋하고 committed 메시지를 보낸다.
분산 트랜잭션의 묹
  1. 갱신 타이밍이 다를 수 있다.
  2. 전산 오류 등의 문제로 데이터베이스가 메시지를 못 받는 경우 문제가 생길 수 있다.
  3. 느리다.

오후 작업

  1. modal을 통해 인벤토리 가져오고 각 용도에 따라 세분화 시키기

이미 작업한 modal을 최대한 사용하고 싶어서 modal 안에 어떤 용도로 쓸 것인지 type 값을 줘서 각 기능에 닿도록 만들었다. 일종의 핸들 방식이다.

 const ownTower = async (squad = 0,type) 

c++ 등에서 작업했을 때 초기 값을 정할 수 있었던 것 같은데 html이나 nodejs 쪽에선 그게 안 되는 것인지 작동이 안 된다. 별도의 키워드가 있는 것인지도 찾아야 한다.

squad의 리스트를 구현하는 것은 getsquad라는 함수를 통해 비어 있는 칸과 채워져 있는 칸을 구현하였다.
정보를 갱신할 때마다 getsquad를 호출하는 것이 비효율적일 수도 있지만 이것보다 더 효과적으로 ui 창을 구현하는 방법은 찾지 못했다. 찾는다면 차후 수정할 수 있다.

const getSquad = async () => {
        const register = await fetch("http://localhost:3017/api/tower/squad", {
          method: "GET",
          headers: {
            "Content-Type": "application/json",
          },
        });

        if (register.ok) {
          //각각의 id의 squad 칸들에 데이터를 채워넣도록 하자.
          const result = await register.json();
          

          for (let i = 1; i <= 3; i++) {
            const squadId = `squad${i}`;
            console.log(squadId);
            document.getElementById(squadId).innerHTML = ``;
            if (result.data.length > i - 1) {
              const towerId = result.data[i - 1].OWN_TOWERS.ID;
              const realTowerId = result.data[i - 1].OWN_TOWERS.TOWER_ID;
              const upgrade = result.data[i - 1].OWN_TOWERS.UPGRADE;
              console.log(result.data);
              document.getElementById(squadId).innerHTML +=
                `<img src="./images/tower${towerId}.png" />
          <div class="card-body">
            <h5 class="card-title">Card title</h5>
            <p class="card-text">
              타워 강화 수치 : ${upgrade}
            </p>
          </div>`;
            } else {
              document.getElementById(squadId).innerHTML +=
              `<img src="./images/tower.png" />
          <div class="card-body">
            <h5 class="card-title">Card title</h5>
            <p class="card-text">
              빈 슬롯
            </p>
          </div>`;
            }
          }
        }
      };

태그:

카테고리:

업데이트: