Skip to content

Commit e073915

Browse files
committed
feat: 캐시를 통해 titile이 변경되었을 때만 DB에 쿼리 날림
1 parent b7b8a7d commit e073915

File tree

8 files changed

+129
-7
lines changed

8 files changed

+129
-7
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,4 @@ lerna-debug.log*
4848
!.vscode/tasks.json
4949
!.vscode/launch.json
5050
!.vscode/extensions.json
51-
backend/db.sqlite
51+
db.sqlite

apps/backend/db

-36 KB
Binary file not shown.

apps/backend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
"class-transformer": "^0.5.1",
3535
"class-validator": "^0.14.1",
3636
"lib0": "^0.2.98",
37+
"node-ts-cache": "^4.4.0",
38+
"node-ts-cache-storage-memory": "^4.4.0",
3739
"path": "^0.12.7",
3840
"reflect-metadata": "^0.1.13",
3941
"rxjs": "^7.8.1",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Module, Global } from '@nestjs/common';
2+
import { NodeCacheService } from './node-cache.service';
3+
4+
@Global()
5+
@Module({
6+
providers: [NodeCacheService],
7+
exports: [NodeCacheService],
8+
})
9+
export class NodeCacheModule {}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { Cache, CacheContainer } from 'node-ts-cache';
3+
import { MemoryStorage } from 'node-ts-cache-storage-memory';
4+
5+
type Node = {
6+
title: string;
7+
x: number;
8+
y: number;
9+
};
10+
11+
@Injectable()
12+
export class NodeCacheService {
13+
private cache: CacheContainer;
14+
private ttlTime: number;
15+
16+
constructor() {
17+
this.ttlTime = 10;
18+
this.cache = new CacheContainer(new MemoryStorage());
19+
}
20+
21+
async set(nodeId: number, value: Node): Promise<void> {
22+
const config = { ttl: this.ttlTime };
23+
await this.cache.setItem(nodeId.toString(), value, config);
24+
}
25+
26+
async get(nodeId: number): Promise<Node | undefined> {
27+
return await this.cache.getItem<Node>(nodeId.toString());
28+
}
29+
30+
async has(nodeId: number): Promise<boolean> {
31+
const item = await this.cache.getItem(nodeId.toString());
32+
return item !== undefined;
33+
}
34+
35+
async hasSameTitle(nodeId: number, title: string): Promise<boolean> {
36+
const node = await this.get(nodeId);
37+
return !!node && node.title === title;
38+
}
39+
}

apps/backend/src/yjs/yjs.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { Module } from '@nestjs/common';
22
import { YjsService } from './yjs.service';
33
import { NodeModule } from 'src/node/node.module';
4+
import { NodeCacheModule } from 'src/node-cache/node-cache.module';
45

56
@Module({
6-
imports: [NodeModule],
7+
imports: [NodeModule, NodeCacheModule],
78
providers: [YjsService],
89
})
910
export class YjsModule {}

apps/backend/src/yjs/yjs.service.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Server } from 'socket.io';
1010
import { YSocketIO } from 'y-socket.io/dist/server';
1111
import * as Y from 'yjs';
1212
import { NodeService } from '../node/node.service';
13+
import { NodeCacheService } from 'src/node-cache/node-cache.service';
1314

1415
@WebSocketGateway(1234)
1516
export class YjsService
@@ -18,7 +19,10 @@ export class YjsService
1819
private logger = new Logger('YjsGateway');
1920
private ysocketio: YSocketIO;
2021

21-
constructor(private readonly nodeService: NodeService) {}
22+
constructor(
23+
private readonly nodeService: NodeService,
24+
private readonly nodeCacheService: NodeCacheService,
25+
) {}
2226
@WebSocketServer()
2327
server: Server;
2428

@@ -41,15 +45,28 @@ export class YjsService
4145

4246
this.ysocketio.on('document-loaded', (doc: Y.Doc) => {
4347
doc.on('update', (update) => {
44-
// console.log(Y.decodeUpdate(update).structs);
45-
// console.log(doc.share.get('default'));
4648
const nodes = Object.values(doc.getMap('nodes').toJSON());
47-
console.log(nodes);
49+
50+
// 모든 노드에 대해 검사한다.
4851
nodes.forEach((node) => {
4952
const { title, id } = node.data;
5053
const { x, y } = node.position;
5154
console.log(title, id, x, y);
52-
this.nodeService.updateNode(id, { title, x, y });
55+
// 만약 캐쉬에 노드가 존재하지 않다면 갱신 후 캐쉬에 노드를 넣는다.
56+
if (!this.nodeCacheService.has(id)) {
57+
console.log(id);
58+
this.nodeService.updateNode(id, { title, x, y });
59+
this.nodeCacheService.set(id, { title, x, y });
60+
return;
61+
}
62+
63+
// 만약 캐쉬에 노드가 존재하고 title이 다르다면 갱신한다.
64+
if (!this.nodeCacheService.hasSameTitle(id, title)) {
65+
this.nodeService.updateNode(id, { title, x, y });
66+
this.nodeCacheService.set(id, { title, x, y });
67+
return;
68+
}
69+
// 만약 캐쉬에 노드가 존재하고 title이 동일하다면 패스한다.
5370
});
5471
});
5572
this.logger.log(`Document loaded: ${doc.guid}`);

yarn.lock

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3045,6 +3045,11 @@ bl@^4.0.3, bl@^4.1.0:
30453045
inherits "^2.0.4"
30463046
readable-stream "^3.4.0"
30473047

3048+
3049+
version "3.7.2"
3050+
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
3051+
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
3052+
30483053
30493054
version "1.20.3"
30503055
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
@@ -3750,6 +3755,11 @@ delegates@^1.0.0:
37503755
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
37513756
integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
37523757

3758+
denque@^1.5.0:
3759+
version "1.5.1"
3760+
resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf"
3761+
integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==
3762+
37533763
37543764
version "2.0.0"
37553765
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@@ -6604,6 +6614,23 @@ node-releases@^2.0.18:
66046614
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
66056615
integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
66066616

6617+
node-ts-cache-storage-memory@^4.4.0:
6618+
version "4.4.0"
6619+
resolved "https://registry.yarnpkg.com/node-ts-cache-storage-memory/-/node-ts-cache-storage-memory-4.4.0.tgz#d87da36bef0145c4d5a988191ffff6b9789c394e"
6620+
integrity sha512-eG8tFF4C1/RBmx52cS/dEu63l+Cn+Z6mz16nuTJwNyvtvDHWjsKKM3hg77PA7ddgf2ztaCyen8ZMQnLy191S4g==
6621+
dependencies:
6622+
debug "^4.3.2"
6623+
node-ts-cache "^4.4.0"
6624+
6625+
node-ts-cache@^4.4.0:
6626+
version "4.4.0"
6627+
resolved "https://registry.yarnpkg.com/node-ts-cache/-/node-ts-cache-4.4.0.tgz#ce10368537751d198565d15d1352bab5cc649252"
6628+
integrity sha512-ZULcxpzyFfgpOd33PHjwhPz4fkWSfyrwa9sq1j4jyOm+PaBpQDIzB3m5HRiSKdgEBtQhP3g6hX44dnMjnoHiPA==
6629+
dependencies:
6630+
bluebird "3.7.2"
6631+
debug "^4.3.2"
6632+
redis "^3.1.2"
6633+
66076634
nopt@^5.0.0:
66086635
version "5.0.0"
66096636
resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
@@ -7494,6 +7521,33 @@ readdirp@~3.6.0:
74947521
dependencies:
74957522
picomatch "^2.2.1"
74967523

7524+
redis-commands@^1.7.0:
7525+
version "1.7.0"
7526+
resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89"
7527+
integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==
7528+
7529+
redis-errors@^1.0.0, redis-errors@^1.2.0:
7530+
version "1.2.0"
7531+
resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
7532+
integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==
7533+
7534+
redis-parser@^3.0.0:
7535+
version "3.0.0"
7536+
resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4"
7537+
integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==
7538+
dependencies:
7539+
redis-errors "^1.0.0"
7540+
7541+
redis@^3.1.2:
7542+
version "3.1.2"
7543+
resolved "https://registry.yarnpkg.com/redis/-/redis-3.1.2.tgz#766851117e80653d23e0ed536254677ab647638c"
7544+
integrity sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==
7545+
dependencies:
7546+
denque "^1.5.0"
7547+
redis-commands "^1.7.0"
7548+
redis-errors "^1.2.0"
7549+
redis-parser "^3.0.0"
7550+
74977551
reflect-metadata@^0.1.13:
74987552
version "0.1.14"
74997553
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859"

0 commit comments

Comments
 (0)