Skip to content

Commit 40d14f0

Browse files
authored
Merge pull request #10 from boostcampwm-2024/refactor-be-#4
Refactor be #4
2 parents 7aa8272 + f475ef8 commit 40d14f0

File tree

4 files changed

+48
-104
lines changed

4 files changed

+48
-104
lines changed

apps/backend/src/redis/redis.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ export type RedisNode = {
1818
};
1919

2020
export type RedisEdge = {
21-
fromNode: number;
22-
toNode: number;
23-
type: 'add' | 'delete';
21+
fromNode?: number;
22+
toNode?: number;
23+
type?: 'add' | 'delete';
2424
};
2525

2626
@Injectable()

apps/backend/src/tasks/tasks.service.ts

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ import { InjectDataSource } from '@nestjs/typeorm';
1111
import { Page } from '../page/page.entity';
1212
import { Node } from '../node/node.entity';
1313
import { Edge } from '../edge/edge.entity';
14+
import { Inject } from '@nestjs/common';
15+
import Redis from 'ioredis';
16+
17+
const REDIS_CLIENT_TOKEN = 'REDIS_CLIENT';
1418

1519
@Injectable()
1620
export class TasksService {
1721
private readonly logger = new Logger(TasksService.name);
1822
constructor(
19-
private readonly redisService: RedisService,
23+
@Inject(REDIS_CLIENT_TOKEN) private readonly redisClient: Redis,
2024
@InjectDataSource() private readonly dataSource: DataSource,
2125
) {}
2226

@@ -25,9 +29,10 @@ export class TasksService {
2529
this.logger.log('스케줄러 시작');
2630
// 시작 시간
2731
const startTime = performance.now();
28-
const pageKeys = await this.redisService.getAllKeys('page:*');
29-
const nodeKeys = await this.redisService.getAllKeys('node:*');
30-
const edgeKeys = await this.redisService.getAllKeys('edge:*');
32+
33+
const pageKeys = await this.redisClient.keys('page:*');
34+
const nodeKeys = await this.redisClient.keys('node:*');
35+
const edgeKeys = await this.redisClient.keys('edge:*');
3136

3237
Promise.allSettled([
3338
...pageKeys.map(this.migratePage.bind(this)),
@@ -51,7 +56,10 @@ export class TasksService {
5156
}
5257

5358
async migratePage(key: string) {
54-
const redisData = (await this.redisService.get(key)) as RedisPage;
59+
const data = await this.redisClient.hgetall(key);
60+
const redisData = Object.fromEntries(
61+
Object.entries(data).map(([field, value]) => [field, value]),
62+
) as RedisPage;
5563
// 데이터 없으면 오류
5664
if (!redisData) {
5765
throw new Error(`redis에 ${key}에 해당하는 데이터가 없습니다.`);
@@ -71,6 +79,7 @@ export class TasksService {
7179

7280
// 트랜잭션 시작
7381
const queryRunner = this.dataSource.createQueryRunner();
82+
const redisRunner = this.redisClient.multi();
7483
try {
7584
await queryRunner.startTransaction();
7685

@@ -81,20 +90,16 @@ export class TasksService {
8190
await pageRepository.update(pageId, updateData);
8291

8392
// redis에서 데이터 삭제
84-
await this.redisService.delete(key);
93+
redisRunner.del(key);
8594

8695
// 트랜잭션 커밋
8796
await queryRunner.commitTransaction();
97+
await redisRunner.exec();
8898
} catch (err) {
8999
// 실패하면 postgres는 roll back하고 redis의 값을 살린다.
90100
this.logger.error(err.stack);
91101
await queryRunner.rollbackTransaction();
92-
updateData.title &&
93-
(await this.redisService.setField(key, 'title', updateData.title));
94-
updateData.content &&
95-
(await this.redisService.setField(key, 'content', JSON.parse(content)));
96-
updateData.emoji &&
97-
(await this.redisService.setField(key, 'emoji', updateData.emoji));
102+
redisRunner.discard();
98103

99104
// Promise.all에서 실패를 인식하기 위해 에러를 던진다.
100105
throw err;
@@ -105,9 +110,10 @@ export class TasksService {
105110
}
106111

107112
async migrateNode(key: string) {
108-
const redisData = (await this.redisService.get(
109-
key,
110-
)) as unknown as RedisNode;
113+
const data = await this.redisClient.hgetall(key);
114+
const redisData = Object.fromEntries(
115+
Object.entries(data).map(([field, value]) => [field, value]),
116+
) as RedisNode;
111117
// 데이터 없으면 오류
112118
if (!redisData) {
113119
throw new Error(`redis에 ${key}에 해당하는 데이터가 없습니다.`);
@@ -126,6 +132,7 @@ export class TasksService {
126132

127133
// 트랜잭션 시작
128134
const queryRunner = this.dataSource.createQueryRunner();
135+
const redisRunner = this.redisClient.multi();
129136
try {
130137
await queryRunner.startTransaction();
131138

@@ -136,20 +143,16 @@ export class TasksService {
136143
await nodeRepository.update(nodeId, updateData);
137144

138145
// redis에서 데이터 삭제
139-
await this.redisService.delete(key);
146+
redisRunner.del(key);
140147

141148
// 트랜잭션 커밋
142149
await queryRunner.commitTransaction();
150+
await redisRunner.exec();
143151
} catch (err) {
144152
// 실패하면 postgres는 roll back하고 redis의 값을 살린다.
145153
this.logger.error(err.stack);
146154
await queryRunner.rollbackTransaction();
147-
updateData.x &&
148-
(await this.redisService.setField(key, 'x', updateData.x.toString()));
149-
updateData.y &&
150-
(await this.redisService.setField(key, 'y', updateData.y.toString()));
151-
updateData.color &&
152-
(await this.redisService.setField(key, 'color', updateData.color));
155+
redisRunner.discard();
153156

154157
// Promise.all에서 실패를 인식하기 위해 에러를 던진다.
155158
throw err;
@@ -160,16 +163,20 @@ export class TasksService {
160163
}
161164

162165
async migrateEdge(key: string) {
163-
const redisData = (await this.redisService.get(
164-
key,
165-
)) as unknown as RedisEdge;
166+
const data = await this.redisClient.hgetall(key);
167+
const redisData = Object.fromEntries(
168+
Object.entries(data).map(([field, value]) => [field, value]),
169+
) as RedisEdge;
170+
166171
// 데이터 없으면 오류
167172
if (!redisData) {
168173
throw new Error(`redis에 ${key}에 해당하는 데이터가 없습니다.`);
169174
}
170175

171176
// 트랜잭션 시작
172177
const queryRunner = this.dataSource.createQueryRunner();
178+
const redisRunner = this.redisClient.multi();
179+
173180
try {
174181
await queryRunner.startTransaction();
175182

@@ -194,34 +201,28 @@ export class TasksService {
194201
});
195202
}
196203

197-
if (redisData.type === 'delete') {
198-
const edge = await edgeRepository.findOne({
199-
where: { fromNode, toNode },
200-
});
204+
// if (redisData.type === 'delete') {
205+
// const edge = await edgeRepository.findOne({
206+
// where: { fromNode, toNode },
207+
// });
208+
// console.log(`edge 정보 `);
209+
// console.log(edge);
210+
// console.log(`edge content : ${edge}`);
201211

202-
await edgeRepository.delete({ id: edge.id });
203-
}
212+
// await edgeRepository.delete({ id: edge.id });
213+
// }
204214

205215
// redis에서 데이터 삭제
206-
await this.redisService.delete(key);
216+
redisRunner.del(key);
207217

208218
// 트랜잭션 커밋
209219
await queryRunner.commitTransaction();
220+
await redisRunner.exec();
210221
} catch (err) {
211222
// 실패하면 postgres는 roll back하고 redis의 값을 살린다.
212223
this.logger.error(err.stack);
213224
await queryRunner.rollbackTransaction();
214-
await this.redisService.setField(
215-
key,
216-
'fromNode',
217-
redisData.fromNode.toString(),
218-
);
219-
await this.redisService.setField(
220-
key,
221-
'toNode',
222-
redisData.toNode.toString(),
223-
);
224-
await this.redisService.setField(key, 'type', redisData.type);
225+
redisRunner.discard();
225226

226227
// Promise.all에서 실패를 인식하기 위해 에러를 던진다.
227228
throw err;

apps/websocket/src/redis/redis.service.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ export class RedisService {
1717
@Inject(RED_LOCK_TOKEN) private readonly redisLock: Redlock,
1818
) {}
1919

20-
async getAllKeys(pattern) {
21-
return await this.redisClient.keys(pattern);
22-
}
23-
2420
createStream() {
2521
return this.redisClient.scanStream();
2622
}
@@ -42,16 +38,6 @@ export class RedisService {
4238
}
4339
}
4440

45-
// async setField(key: string, field: string, value: string) {
46-
// // 락을 획득할 때까지 기다린다.
47-
// const lock = await this.redisLock.acquire([`user:${key}`], 1000);
48-
// try {
49-
// return await this.redisClient.hset(key, field, value);
50-
// } finally {
51-
// lock.release();
52-
// }
53-
// }
54-
5541
async setFields(key: string, map: Record<string, string>) {
5642
// 락을 획득할 때까지 기다린다.
5743
const lock = await this.redisLock.acquire([`user:${key}`], 1000);

apps/websocket/src/yjs/yjs.service.ts

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,6 @@ export class YjsService
291291
y,
292292
color,
293293
});
294-
// await Promise.all([
295-
// this.redisService.setField(`node:${findPage.node.id}`, 'x', x),
296-
// this.redisService.setField(`node:${findPage.node.id}`, 'y', y),
297-
// this.redisService.setField(
298-
// `node:${findPage.node.id}`,
299-
// 'color',
300-
// color,
301-
// ),
302-
// ]);
303294
} catch (error) {
304295
this.logger.error(
305296
`노드 업데이트 중 오류 발생 (nodeId: ${id}): ${error.message}`,
@@ -318,6 +309,7 @@ export class YjsService
318309
) {
319310
for (const [key, change] of event.changes.keys) {
320311
const [fromNode, toNode] = key.slice(1).split('-');
312+
// TODO: 여기서 delete 시 edge를 못찾음 (undefined로 가져옴)
321313
const edge = edgesMap.get(key) as YMapEdge;
322314

323315
if (change.action === 'add') {
@@ -326,21 +318,6 @@ export class YjsService
326318
`edge:${edge.source}-${edge.target}`,
327319
{ fromNode: edge.source, toNode: edge.target, type: 'add' },
328320
);
329-
// this.redisService.setField(
330-
// `edge:${edge.source}-${edge.target}`,
331-
// 'fromNode',
332-
// edge.source,
333-
// );
334-
// this.redisService.setField(
335-
// `edge:${edge.source}-${edge.target}`,
336-
// 'toNode',
337-
// edge.target,
338-
// );
339-
// this.redisService.setField(
340-
// `edge:${edge.source}-${edge.target}`,
341-
// 'type',
342-
// 'add',
343-
// );
344321
}
345322
if (change.action === 'delete') {
346323
// 엣지가 존재하면 삭제
@@ -349,21 +326,6 @@ export class YjsService
349326
toNode,
350327
type: 'delete',
351328
});
352-
// this.redisService.setField(
353-
// `edge:${fromNode}-${toNode}`,
354-
// 'fromNode',
355-
// fromNode,
356-
// );
357-
// this.redisService.setField(
358-
// `edge:${fromNode}-${toNode}`,
359-
// 'toNode',
360-
// toNode,
361-
// );
362-
// this.redisService.setField(
363-
// `edge:${fromNode}-${toNode}`,
364-
// 'type',
365-
// 'delete',
366-
// );
367329
}
368330
}
369331
}
@@ -376,11 +338,6 @@ export class YjsService
376338
await this.redisService.setFields(`page:${pageId.toString()}`, {
377339
content: JSON.stringify(yXmlFragmentToProsemirrorJSON(editorDoc)),
378340
});
379-
// await this.redisService.setField(
380-
// `page:${pageId.toString()}`,
381-
// 'content',
382-
// JSON.stringify(yXmlFragmentToProsemirrorJSON(editorDoc)),
383-
// );
384341
} catch (error) {
385342
this.logger.error(
386343
`에디터 내용 저장 중 오류 발생 (pageId: ${document?.name}): ${error.message}`,

0 commit comments

Comments
 (0)