2024-12-31 TIL
오전 수업
1. 데이터베이스 효율화 : 샤딩
샤딩(sharding) : 데이터베이스를 물리적으로 쪼개는 기술. 하나의 게임 서버 데이터를 여러 개의 데이터베이스에서 관리한다는 것.
서버를 하나만 둘 경우 서버에 화재 등의 문제가 발생했을 때 전체 데이터를 사용할 수 없게 된다.
서버 자체가 가질 수 있는 한계를 해결할 수 있다. (서버를 나눔으로써 데이터의 용량을 확장하는 효과)
서버의 필요에 따라 줄어들거나 늘어들 수 있다
샤딩 수가 변경될 때마다 큰 비용이 발생한다.
나중에 SAGA라는 게 무엇인지 더 확인하여 적도록 하자.
해시 함수
빠른 데이터 검색을 위함
효율적인 구조로 저장(해시 테이블)
가장 간단한 방법은 값에 따라 모듈러 연산으로 값을 구하는 것
해시 충돌
다른 값임에도 나누는 방법에 따라 같은 값이 나올 수 있을 때 발생하는 것.
가능하면 동일한 키가 발생하지 않도록 만드는 게 중요하다.
체이닝(chaining)
해시 테이블처럼 등록을 하되, 테이블 각각의 원소 값을 연결리스트로 만들어 관리한다. 그러면 같은 해시 값이 나와도 여러 개의 값으 저장할 수 있게 된다.
consistent hashing?
링을 기반으로 하는 해싱 기법? 데이터를 링의 형탤로 관리하여 데이터를 관리한다는 것은 정확히 무슨 의미인지 아직 이해가 잘 가지 않는다. 일단 연결리스트를 시작과 끝을 연결시키는 방법으로 보이는데, 좀 더 연구를 해보자.
- 해시 링이 중심 자료인 모양이다.
샤딩의 단점
- 트랜잭션 : 하나의 DB만 걸리는 게 아니라 해당되는 모든 데이터가 들어 있는 DB가 전부 제한이 걸리게 된다.
-> 해결 방법 : 분산 트랜잭션
트랜잭션 매니저
- 트랜잭션 매니저가 트랜잭션을 시작하고 0번과 1번 데이터베이스에 prepare 메시지를 보낸다.
- 각 데이터베이스는 트랜잭션을 수행하고 준비상태에 놓인다.
- 준비가 완료되면 각 데이터베이스는 prepared 메시지를 트랜잭션 매니저에 보낸다.
- 매니저가 각각 확인하고 commit 메시지를 보낸다.
- 각 데이터베이스는 트랜잭션을 커밋하고 committed 메시지를 보낸다.
분산 트랜잭션의 묹
- 갱신 타이밍이 다를 수 있다.
- 전산 오류 등의 문제로 데이터베이스가 메시지를 못 받는 경우 문제가 생길 수 있다.
- 느리다.
오후 작업
- 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>`;
}
}
}
};