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์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค:- hasJoinColumn: true
- hasJoinColumn: false
ํ์ฌ 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
PostEntity์user_id์ปฌ๋ผ์ด ์์ด์ผ ํจ- ๋ณดํต
Post์์BelongsToOne์ผ๋ก ์ญ๋ฐฉํฅ ์ ์
์ต์
์์ : fromColumn ์ฌ์ฉ
TypeScript ์ฌ์ฉ
HasMany๋ DataLoader ํจํด์ผ๋ก ์๋ ์ต์ ํ๋ฉ๋๋ค. N+1 ์ฟผ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
ManyToMany
N:M ๊ด๊ณ - ๋ค๋๋ค ๊ด๊ณ๋ฅผ ์ค๊ฐ ํ ์ด๋ธ(Join Table)์ ํตํด ๊ตฌํํฉ๋๋ค.๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
post.entity.json
์ต์
์๋ฐฉํฅ ์ ์
TypeScript ์ฌ์ฉ
Custom Join Clause
๋ณต์กํ JOIN ์กฐ๊ฑด์ด ํ์ํ ๊ฒฝ์ฐ SQL ํํ์์ ์ง์ ์์ฑํ ์ ์์ต๋๋ค.Relation ํ์ฉ ํจํด
1. Subset์์ Relation ํ๋ ์ ํ
user: LEFT JOINtags: DataLoader๋ก ๋ณ๋ ์ฟผ๋ฆฌ
2. ์ค์ฒฉ Relation
3. Relation ํํฐ๋ง
4. Relation ์ ๋ ฌ
Relation ์ค๊ณ ๊ฐ์ด๋
BelongsToOne vs OneToOne
CASCADE vs RESTRICT
nullable ์ค์
์ฃผ์์ฌํญ
๋ค์ ๋จ๊ณ
Enums
Enum ํ์
์ ์ํ๊ณ ํ์ฉํ๊ธฐ
Subset
Subset์ ํ์ฉํ ํ์
์์ ํ ์ฟผ๋ฆฌ
Puri Query Builder
Relation์ ํ์ฉํ ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ
Performance
Relation ์ฟผ๋ฆฌ ์ต์ ํํ๊ธฐ