Skip to main content
Relations๋Š” Entity ๊ฐ„์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•œ ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Relation ํƒ€์ž… ๊ฐœ์š”

Sonamu๋Š” 4๊ฐ€์ง€ Relation ํƒ€์ž…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

BelongsToOne

N:1 ๊ด€๊ณ„ - ๋‹ค์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ฅผ ์ฐธ์กฐ ์˜ˆ: Post โ†’ User (์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๊ธ€์ด ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์†ํ•จ)

OneToOne

1:1 ๊ด€๊ณ„ - ์„œ๋กœ ํ•˜๋‚˜์”ฉ๋งŒ ์ฐธ์กฐ ์˜ˆ: User โ†” Employee (์‚ฌ์šฉ์ž์™€ ์ง์› ์ •๋ณด๊ฐ€ 1:1 ๋งค์นญ)

HasMany

1:N ๊ด€๊ณ„ - ํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฟ์„ ์†Œ์œ  ์˜ˆ: User โ†’ Posts (ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๊ธ€ ์†Œ์œ )

ManyToMany

N:M ๊ด€๊ณ„ - ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ์˜ˆ: Post โ†” Tag (๊ฒŒ์‹œ๊ธ€๊ณผ ํƒœ๊ทธ์˜ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„)

BelongsToOne

N:1 ๊ด€๊ณ„ - ํ˜„์žฌ Entity๊ฐ€ ๋‹ค๋ฅธ Entity์— ์†ํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

post.entity.json
์ƒ์„ฑ๋˜๋Š” ์ปฌ๋Ÿผ: user_id (integer, not null) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ:

์˜ต์…˜

RelationOn ์˜ต์…˜

์˜ˆ์ œ: nullable๊ณผ CASCADE

๋™์ž‘:
  • department_id๊ฐ€ NULL ํ—ˆ์šฉ
  • ๋ถ€์„œ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ์ง์›์˜ department_id๊ฐ€ NULL๋กœ ์„ค์ •๋จ

TypeScript ์‚ฌ์šฉ

OneToOne

1:1 ๊ด€๊ณ„ - ๋‘ Entity๊ฐ€ ์„œ๋กœ ํ•˜๋‚˜์”ฉ๋งŒ ์ฐธ์กฐํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

OneToOne์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
ํ˜„์žฌ Entity์— FK ์ปฌ๋Ÿผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
employee.entity.json
์ƒ์„ฑ๋˜๋Š” ์ปฌ๋Ÿผ: user_id (integer, unique, not null)๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ:

์˜ต์…˜

์˜ˆ์ œ: ์–‘๋ฐฉํ–ฅ OneToOne

๊ด€๊ณ„ ์„ค๋ช…:
  • User๋Š” Employee๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ (nullable)
  • Employee๋Š” ๋ฐ˜๋“œ์‹œ User๋ฅผ ๊ฐ€์ ธ์•ผ ํ•จ (not null)
  • User๊ฐ€ ์‚ญ์ œ๋˜๋ฉด Employee๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋จ (CASCADE)

HasMany

1:N ๊ด€๊ณ„ - ํ•˜๋‚˜์˜ Entity๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ Entity๋ฅผ ์†Œ์œ ํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

user.entity.json
์กฐ๊ฑด:
  • Post Entity์— user_id ์ปฌ๋Ÿผ์ด ์žˆ์–ด์•ผ ํ•จ
  • ๋ณดํ†ต Post์—์„œ BelongsToOne์œผ๋กœ ์—ญ๋ฐฉํ–ฅ ์ •์˜

์˜ต์…˜

์˜ˆ์ œ: fromColumn ์‚ฌ์šฉ

JOIN ์ฟผ๋ฆฌ:

TypeScript ์‚ฌ์šฉ

HasMany๋Š” DataLoader ํŒจํ„ด์œผ๋กœ ์ž๋™ ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค. N+1 ์ฟผ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ManyToMany

N:M ๊ด€๊ณ„ - ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”(Join Table)์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

post.entity.json
์ž๋™ ์ƒ์„ฑ๋˜๋Š” Join Table:

์˜ต์…˜

Join Table ๋„ค์ด๋ฐ ๊ทœ์น™: ๋‘ ํ…Œ์ด๋ธ”๋ช…์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ __๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. - ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ: posts__tags - ์ž˜๋ชป๋œ ์˜ˆ: tags__posts (์•ŒํŒŒ๋ฒณ ์ˆœ ์•„๋‹˜)

์–‘๋ฐฉํ–ฅ ์ •์˜

TypeScript ์‚ฌ์šฉ

Custom Join Clause

๋ณต์žกํ•œ JOIN ์กฐ๊ฑด์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ SQL ํ‘œํ˜„์‹์„ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
customJoinClause๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํ‘œ์ค€ Relation์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

Relation ํ™œ์šฉ ํŒจํ„ด

1. Subset์—์„œ Relation ํ•„๋“œ ์„ ํƒ

์ž๋™ ์ƒ์„ฑ๋˜๋Š” ์ฟผ๋ฆฌ:
  • user: LEFT JOIN
  • tags: DataLoader๋กœ ๋ณ„๋„ ์ฟผ๋ฆฌ

2. ์ค‘์ฒฉ Relation

Sonamu๊ฐ€ ์ž๋™์œผ๋กœ ํ•„์š”ํ•œ JOIN์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

3. Relation ํ•„ํ„ฐ๋ง

4. Relation ์ •๋ ฌ

Relation ์„ค๊ณ„ ๊ฐ€์ด๋“œ

BelongsToOne vs OneToOne

CASCADE vs RESTRICT

nullable ์„ค์ •

์ฃผ์˜์‚ฌํ•ญ

์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€A โ†’ B โ†’ C โ†’ A ๊ฐ™์€ ์ˆœํ™˜ ์ฐธ์กฐ๋Š” ํ”ผํ•˜์„ธ์š”. ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
JOIN ๊นŠ์ด ์ œํ•œ๋„ˆ๋ฌด ๊นŠ์€ ์ค‘์ฒฉ Relation (3๋‹จ๊ณ„ ์ด์ƒ)์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณ„๋„ ์ฟผ๋ฆฌ๋กœ ๋ถ„๋ฆฌํ•˜์„ธ์š”.
ManyToMany Join TableJoin Table์€ Sonamu๊ฐ€ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋ณ„๋„์˜ Entity๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ปฌ๋Ÿผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ณ„๋„ Entity๋กœ ๋ถ„๋ฆฌํ•˜์„ธ์š”.

๋‹ค์Œ ๋‹จ๊ณ„

Enums

Enum ํƒ€์ž… ์ •์˜ํ•˜๊ณ  ํ™œ์šฉํ•˜๊ธฐ

Subset

Subset์„ ํ™œ์šฉํ•œ ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ

Puri Query Builder

Relation์„ ํ™œ์šฉํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑํ•˜๊ธฐ

Performance

Relation ์ฟผ๋ฆฌ ์ตœ์ ํ™”ํ•˜๊ธฐ