Skip to content

Commit 93c6f92

Browse files
refactor: 대체키 snowflakeId column으로 추가
1 parent b187192 commit 93c6f92

File tree

9 files changed

+78
-4
lines changed

9 files changed

+78
-4
lines changed

apps/backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"@nestjs/swagger": "^8.0.5",
3535
"@nestjs/typeorm": "^10.0.2",
3636
"@nestjs/websockets": "^10.4.8",
37+
"@theinternetfolks/snowflake": "^1.3.0",
3738
"@types/multer": "^1.4.12",
3839
"class-transformer": "^0.5.1",
3940
"class-validator": "^0.14.1",

apps/backend/src/edge/edge.entity.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,23 @@
22
import {
33
Entity,
44
PrimaryGeneratedColumn,
5-
// Column,
5+
Column,
66
ManyToOne,
77
JoinColumn,
8+
Index,
89
} from 'typeorm';
910
import { Node } from '../node/node.entity';
11+
import { Snowflake } from '@theinternetfolks/snowflake';
1012

1113
@Entity()
1214
export class Edge {
1315
@PrimaryGeneratedColumn('increment')
1416
id: number;
1517

18+
@Column({ unique: true })
19+
@Index()
20+
snowflakeId: string = Snowflake.generate();
21+
1622
@ManyToOne(() => Node, (node) => node.outgoingEdges, { onDelete: 'CASCADE' })
1723
@JoinColumn({ name: 'from_node_id' })
1824
fromNode: Node;

apps/backend/src/edge/edge.service.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ describe('EdgeService', () => {
5050
const dto: CreateEdgeDto = { fromNode: 3, toNode: 5 };
5151
const fromNode = {
5252
id: 3,
53+
snowflakeId: 'generated-snowflake-id-to-node',
5354
x: 0,
5455
y: 0,
5556
title: 'Node Title',
@@ -59,6 +60,7 @@ describe('EdgeService', () => {
5960
} as Node;
6061
const toNode = {
6162
id: 5,
63+
snowflakeId: 'generated-snowflake-id-from-node',
6264
x: 0,
6365
y: 0,
6466
title: 'Node Title',
@@ -112,6 +114,7 @@ describe('EdgeService', () => {
112114
it('존재하는 모든 엣지를 반환한다.', async () => {
113115
const node3 = {
114116
id: 3,
117+
snowflakeId: 'generated-snowflake-id-node-3',
115118
x: 0,
116119
y: 0,
117120
title: 'Node Title',
@@ -121,6 +124,7 @@ describe('EdgeService', () => {
121124
} as Node;
122125
const node4 = {
123126
id: 4,
127+
snowflakeId: 'generated-snowflake-id-node-4',
124128
x: 0,
125129
y: 0,
126130
title: 'Node Title',
@@ -130,6 +134,7 @@ describe('EdgeService', () => {
130134
} as Node;
131135
const node5 = {
132136
id: 5,
137+
snowflakeId: 'generated-snowflake-id-node-5',
133138
x: 0,
134139
y: 0,
135140
title: 'Node Title',
@@ -139,6 +144,7 @@ describe('EdgeService', () => {
139144
} as Node;
140145
const node7 = {
141146
id: 7,
147+
snowflakeId: 'generated-snowflake-id-node-7',
142148
x: 0,
143149
y: 0,
144150
title: 'Node Title',
@@ -150,16 +156,19 @@ describe('EdgeService', () => {
150156
const expectedEdgeList = [
151157
{
152158
id: 1,
159+
snowflakeId: 'generated-snowflake-id-edge-1',
153160
fromNode: node3,
154161
toNode: node5,
155162
} as Edge,
156163
{
157164
id: 2,
165+
snowflakeId: 'generated-snowflake-id-edge-2',
158166
fromNode: node3,
159167
toNode: node4,
160168
} as Edge,
161169
{
162170
id: 3,
171+
snowflakeId: 'generated-snowflake-id-edge-3',
163172
fromNode: node3,
164173
toNode: node7,
165174
} as Edge,

apps/backend/src/node/node.entity.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,21 @@ import {
66
OneToOne,
77
OneToMany,
88
JoinColumn,
9+
Index,
910
} from 'typeorm';
1011
import { Page } from '../page/page.entity';
1112
import { Edge } from '../edge/edge.entity';
13+
import { Snowflake } from '@theinternetfolks/snowflake';
1214

1315
@Entity()
1416
export class Node {
1517
@PrimaryGeneratedColumn('increment')
1618
id: number;
1719

20+
@Column({ unique: true })
21+
@Index()
22+
snowflakeId: string = Snowflake.generate();
23+
1824
@Column('float')
1925
x: number;
2026

apps/backend/src/node/node.service.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ describe('NodeService', () => {
5353
const dto: CreateNodeDto = { title: 'Node Title', x: 0, y: 0 };
5454
const node = {
5555
id: 1,
56+
snowflakeId: 'generated-snowflake-id-node',
5657
x: 0,
5758
y: 0,
5859
title: 'Node Title',
@@ -167,6 +168,7 @@ describe('NodeService', () => {
167168
it('존재하는 노드를 아이디로 조회하여 반환한다.', async () => {
168169
const node = {
169170
id: 1,
171+
snowflakeId: 'generated-snowflake-id-node',
170172
x: 0,
171173
y: 0,
172174
title: 'Node Title',

apps/backend/src/page/page.entity.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,20 @@ import {
77
CreateDateColumn,
88
UpdateDateColumn,
99
VersionColumn,
10+
Index,
1011
} from 'typeorm';
1112
import { Node } from '../node/node.entity';
13+
import { Snowflake } from '@theinternetfolks/snowflake';
1214

1315
@Entity()
1416
export class Page {
1517
@PrimaryGeneratedColumn('increment')
1618
id: number;
1719

20+
@Column({ unique: true })
21+
@Index()
22+
snowflakeId: string = Snowflake.generate();
23+
1824
@Column()
1925
title: string;
2026

apps/backend/src/page/page.service.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ describe('PageService', () => {
6262
// 페이지 엔티티
6363
const newPage: Page = {
6464
id: 1,
65+
snowflakeId: 'generated-snowflake-id-page',
6566
title: 'new page',
6667
content: {} as JSON,
6768
createdAt: newDate,
@@ -74,6 +75,7 @@ describe('PageService', () => {
7475
// 노드 엔티티
7576
const newNode: Node = {
7677
id: 1,
78+
snowflakeId: 'generated-snowflake-id-node',
7779
x: 0,
7880
y: 0,
7981
page: null,
@@ -127,6 +129,7 @@ describe('PageService', () => {
127129
const originDate = new Date();
128130
const originPage: Page = {
129131
id: 1,
132+
snowflakeId: 'generated-snowflake-id-origin-page',
130133
title: 'origin title',
131134
content: {} as JSON,
132135
node: null,
@@ -138,6 +141,7 @@ describe('PageService', () => {
138141
const newDate = new Date();
139142
const newPage: Page = {
140143
id: 1,
144+
snowflakeId: 'generated-snowflake-id-new-page',
141145
title: 'Updated Title',
142146
content: {} as JSON,
143147
node: null,
@@ -175,6 +179,7 @@ describe('PageService', () => {
175179
const newDate = new Date();
176180
const expectedPage: Page = {
177181
id: 1,
182+
snowflakeId: 'generated-snowflake-id-page',
178183
title: 'title',
179184
content: {} as JSON,
180185
node: null,
@@ -204,16 +209,19 @@ describe('PageService', () => {
204209
const expectedPageList = [
205210
{
206211
id: 1,
212+
snowflakeId: 'generated-snowflake-id-page-1',
207213
title: 'title1',
208214
node: null,
209215
},
210216
{
211217
id: 2,
218+
snowflakeId: 'generated-snowflake-id-page-2',
212219
title: 'title2',
213220
node: null,
214221
},
215222
{
216223
id: 3,
224+
snowflakeId: 'generated-snowflake-id-page-3',
217225
title: 'title3',
218226
node: null,
219227
},

apps/backend/src/user/user.entity.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@ import {
44
PrimaryGeneratedColumn,
55
Column,
66
CreateDateColumn,
7+
Index,
78
} from 'typeorm';
9+
import { Snowflake } from '@theinternetfolks/snowflake';
810

911
@Entity()
1012
export class User {
1113
@PrimaryGeneratedColumn('increment')
1214
id: number;
1315

16+
@Column({ unique: true })
17+
@Index() // 인덱스 추가
18+
snowflakeId: string = Snowflake.generate(); // Snowflake ID 사용
19+
1420
@Column({ unique: true })
1521
providerId: string; // 네이버/카카오 ID
1622

yarn.lock

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2766,6 +2766,11 @@
27662766
dependencies:
27672767
"@tanstack/query-core" "5.60.6"
27682768

2769+
"@theinternetfolks/snowflake@^1.3.0":
2770+
version "1.3.0"
2771+
resolved "https://registry.yarnpkg.com/@theinternetfolks/snowflake/-/snowflake-1.3.0.tgz#da26407eba4a0639d23e6ea08136e66270ee0e03"
2772+
integrity sha512-/5fjyE+JIa95Lm1uDJ9fx52W7/ZHBVvKo5GbpR+swpchbriLzVgFAIUOVwLsscnUTBixyQ+JsEh5pJQM/zKNzQ==
2773+
27692774
"@tiptap/core@^2.1.7", "@tiptap/core@^2.9.1":
27702775
version "2.9.1"
27712776
resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.9.1.tgz#ceed211a9ecfe25a94e0e0863936169990e75aee"
@@ -9604,7 +9609,16 @@ string-length@^4.0.1:
96049609
char-regex "^1.0.2"
96059610
strip-ansi "^6.0.0"
96069611

9607-
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
9612+
"string-width-cjs@npm:string-width@^4.2.0":
9613+
version "4.2.3"
9614+
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
9615+
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
9616+
dependencies:
9617+
emoji-regex "^8.0.0"
9618+
is-fullwidth-code-point "^3.0.0"
9619+
strip-ansi "^6.0.1"
9620+
9621+
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
96089622
version "4.2.3"
96099623
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
96109624
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -9636,7 +9650,14 @@ string_decoder@~1.1.1:
96369650
dependencies:
96379651
safe-buffer "~5.1.0"
96389652

9639-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
9653+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
9654+
version "6.0.1"
9655+
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
9656+
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
9657+
dependencies:
9658+
ansi-regex "^5.0.1"
9659+
9660+
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
96409661
version "6.0.1"
96419662
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
96429663
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -10535,7 +10556,7 @@ word-wrap@^1.2.5:
1053510556
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
1053610557
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
1053710558

10538-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
10559+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
1053910560
version "7.0.0"
1054010561
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1054110562
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -10553,6 +10574,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0:
1055310574
string-width "^4.1.0"
1055410575
strip-ansi "^6.0.0"
1055510576

10577+
wrap-ansi@^7.0.0:
10578+
version "7.0.0"
10579+
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
10580+
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
10581+
dependencies:
10582+
ansi-styles "^4.0.0"
10583+
string-width "^4.1.0"
10584+
strip-ansi "^6.0.0"
10585+
1055610586
wrap-ansi@^8.1.0:
1055710587
version "8.1.0"
1055810588
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"

0 commit comments

Comments
 (0)