@@ -8,7 +8,6 @@ import { UpdatePageDto } from './dtos/updatePage.dto';
88import { UpdatePartialPageDto } from './dtos/updatePartialPage.dto' ;
99import { PageNotFoundException } from '../exception/page.exception' ;
1010import { WorkspaceNotFoundException } from '../exception/workspace.exception' ;
11- import Redlock from 'redlock' ;
1211
1312const RED_LOCK_TOKEN = 'RED_LOCK' ;
1413
@@ -18,20 +17,13 @@ export class PageService {
1817 private readonly pageRepository : PageRepository ,
1918 private readonly nodeRepository : NodeRepository ,
2019 private readonly workspaceRepository : WorkspaceRepository ,
21- @Inject ( RED_LOCK_TOKEN ) private readonly redisLock : Redlock ,
2220 ) { }
2321 /**
2422 * redis에 저장된 페이지 정보를 다음 과정을 통해 주기적으로 데이터베이스에 반영한다.
2523 *
2624 * 1. redis에서 해당 페이지의 title과 content를 가져온다.
2725 * 2. 데이터베이스에 해당 페이지의 title과 content를 갱신한다.
2826 * 3. redis에서 해당 페이지 정보를 삭제한다.
29- *
30- * 만약 1번 과정을 진행한 상태에서 page가 삭제된다면 오류가 발생한다.
31- * 위 과정을 진행하는 동안 page 정보 수정을 막기 위해 lock을 사용한다.
32- *
33- * 동기화를 위해 기존 페이지에 접근하여 수정하는 로직은 RedLock 알고리즘을 통해 락을 획득할 수 있을 때만 수행한다.
34- * 기존 페이지에 접근하여 연산하는 로직의 경우 RedLock 알고리즘을 사용하여 동시 접근을 방지한다.
3527 */
3628 async createPage ( dto : CreatePageDto ) : Promise < Page > {
3729 const { title, content, workspaceId, x, y, emoji } = dto ;
@@ -62,42 +54,29 @@ export class PageService {
6254 }
6355
6456 async deletePage ( id : number ) : Promise < void > {
65- // 락을 획득할 때까지 기다린다.
66- const lock = await this . redisLock . acquire ( [ `user:${ id . toString ( ) } ` ] , 1000 ) ;
67- try {
68- // 페이지를 삭제한다.
69- const deleteResult = await this . pageRepository . delete ( id ) ;
70-
71- // 만약 삭제된 페이지가 없으면 페이지를 찾지 못한 것
72- if ( ! deleteResult . affected ) {
73- throw new PageNotFoundException ( ) ;
74- }
75- } finally {
76- // 락을 해제한다.
77- await lock . release ( ) ;
57+ // 페이지를 삭제한다.
58+ const deleteResult = await this . pageRepository . delete ( id ) ;
59+
60+ // 만약 삭제된 페이지가 없으면 페이지를 찾지 못한 것
61+ if ( ! deleteResult . affected ) {
62+ throw new PageNotFoundException ( ) ;
7863 }
7964 }
8065
8166 async updatePage ( id : number , dto : UpdatePageDto ) : Promise < Page > {
82- // 락을 획득할 때까지 기다린다.
83- const lock = await this . redisLock . acquire ( [ `user:${ id . toString ( ) } ` ] , 1000 ) ;
84- try {
85- // 갱신할 페이지를 조회한다.
86- // 페이지를 조회한다.
87- const page = await this . pageRepository . findOneBy ( { id } ) ;
88-
89- // 페이지가 없으면 NotFound 에러
90- if ( ! page ) {
91- throw new PageNotFoundException ( ) ;
92- }
93- // 페이지 정보를 갱신한다.
94- const newPage = Object . assign ( { } , page , dto ) ;
95-
96- // 변경된 페이지를 저장
97- return await this . pageRepository . save ( newPage ) ;
98- } finally {
99- await lock . release ( ) ;
67+ // 갱신할 페이지를 조회한다.
68+ // 페이지를 조회한다.
69+ const page = await this . pageRepository . findOneBy ( { id } ) ;
70+
71+ // 페이지가 없으면 NotFound 에러
72+ if ( ! page ) {
73+ throw new PageNotFoundException ( ) ;
10074 }
75+ // 페이지 정보를 갱신한다.
76+ const newPage = Object . assign ( { } , page , dto ) ;
77+
78+ // 변경된 페이지를 저장
79+ return await this . pageRepository . save ( newPage ) ;
10180 }
10281
10382 async updateBulkPage ( pages : UpdatePartialPageDto [ ] ) {
0 commit comments