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)
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ:
์ต์
| ์ต์ | ํ์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|---|
nullable | boolean | NULL ํ์ฉ ์ฌ๋ถ | false |
useConstraint | boolean | Foreign Key ์ ์ฝ ์กฐ๊ฑด ์ฌ์ฉ | true |
onUpdate | RelationOn | ์ฐธ์กฐ ๋ ์ฝ๋ ์์ ์ ๋์ | RESTRICT |
onDelete | RelationOn | ์ฐธ์กฐ ๋ ์ฝ๋ ์ญ์ ์ ๋์ | RESTRICT |
customJoinClause | string | ์ปค์คํ JOIN ์กฐ๊ฑด | - |
RelationOn ์ต์
| ๊ฐ | ์ค๋ช | ์ฌ์ฉ ์์ |
|---|---|---|
CASCADE | ๋ถ๋ชจ ๋ณ๊ฒฝ ์ ์์๋ ๊ฐ์ด ๋ณ๊ฒฝ/์ญ์ | ์ฌ์ฉ์ ์ญ์ ์ ๊ฒ์๊ธ๋ ์ญ์ |
SET NULL | ๋ถ๋ชจ ์ญ์ ์ ์์์ FK๋ฅผ NULL๋ก ์ค์ | ๋ถ์ ์ญ์ ์ ์ง์์ ๋ถ์๋ฅผ NULL๋ก |
RESTRICT | ์์์ด ์์ผ๋ฉด ๋ถ๋ชจ ๋ณ๊ฒฝ/์ญ์ ๋ถ๊ฐ | ๊ฒ์๊ธ์ด ์์ผ๋ฉด ์ฌ์ฉ์ ์ญ์ ๋ถ๊ฐ |
NO ACTION | RESTRICT์ ์ ์ฌ, ์ฒดํฌ ์์ ๋ง ๋ค๋ฆ | - |
SET DEFAULT | ๋ถ๋ชจ ์ญ์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ | - |
์์ : 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)๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ:์ต์
| ์ต์ | ํ์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|---|
hasJoinColumn | boolean | FK ์ปฌ๋ผ ์์ฑ ์ฌ๋ถ | ํ์ |
nullable | boolean | NULL ํ์ฉ (hasJoinColumn: true ์) | false |
useConstraint | boolean | FK ์ ์ฝ (hasJoinColumn: true ์) | true |
onUpdate | RelationOn | ์์ ์ ๋์ (hasJoinColumn: true ์) | RESTRICT |
onDelete | RelationOn | ์ญ์ ์ ๋์ (hasJoinColumn: true ์) | RESTRICT |
customJoinClause | string | ์ปค์คํ JOIN ์กฐ๊ฑด | - |
์์ : ์๋ฐฉํฅ OneToOne
- User๋ Employee๋ฅผ ์ ํ์ ์ผ๋ก ๊ฐ์ง ์ ์์ (nullable)
- Employee๋ ๋ฐ๋์ User๋ฅผ ๊ฐ์ ธ์ผ ํจ (not null)
- User๊ฐ ์ญ์ ๋๋ฉด Employee๋ ํจ๊ป ์ญ์ ๋จ (CASCADE)
HasMany
1:N ๊ด๊ณ - ํ๋์ Entity๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฅธ Entity๋ฅผ ์์ ํ๋ ๊ด๊ณ์ ๋๋ค.๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
user.entity.json
PostEntity์user_id์ปฌ๋ผ์ด ์์ด์ผ ํจ- ๋ณดํต
Post์์BelongsToOne์ผ๋ก ์ญ๋ฐฉํฅ ์ ์
์ต์
| ์ต์ | ํ์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|---|
joinColumn | string | ์๋ ํ ์ด๋ธ์ FK ์ปฌ๋ผ๋ช | ํ์ |
fromColumn | string | ํ์ฌ ํ ์ด๋ธ์ ์ฐธ์กฐ ์ปฌ๋ผ๋ช | id |
nullable | boolean | ๊ด๊ณ ์์ฒด์ nullable (์ต์ ) | false |
์์ : fromColumn ์ฌ์ฉ
TypeScript ์ฌ์ฉ
HasMany๋ DataLoader ํจํด์ผ๋ก ์๋ ์ต์ ํ๋ฉ๋๋ค. N+1 ์ฟผ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
ManyToMany
N:M ๊ด๊ณ - ๋ค๋๋ค ๊ด๊ณ๋ฅผ ์ค๊ฐ ํ ์ด๋ธ(Join Table)์ ํตํด ๊ตฌํํฉ๋๋ค.๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
post.entity.json
์ต์
| ์ต์ | ํ์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|---|
joinTable | string | ์ค๊ฐ ํ
์ด๋ธ๋ช
({table1}\_\_${table2}) | ํ์ |
onUpdate | RelationOn | ์ฐธ์กฐ ๋ ์ฝ๋ ์์ ์ ๋์ | ํ์ |
onDelete | RelationOn | ์ฐธ์กฐ ๋ ์ฝ๋ ์ญ์ ์ ๋์ | ํ์ |
nullable | boolean | ๊ด๊ณ ์์ฒด์ nullable (์ต์ ) | false |
์๋ฐฉํฅ ์ ์
TypeScript ์ฌ์ฉ
Custom Join Clause
๋ณต์กํ JOIN ์กฐ๊ฑด์ด ํ์ํ ๊ฒฝ์ฐ SQL ํํ์์ ์ง์ ์์ฑํ ์ ์์ต๋๋ค.Relation ํ์ฉ ํจํด
1. Subset์์ Relation ํ๋ ์ ํ
user: LEFT JOINtags: DataLoader๋ก ๋ณ๋ ์ฟผ๋ฆฌ
2. ์ค์ฒฉ Relation
3. Relation ํํฐ๋ง
4. Relation ์ ๋ ฌ
Relation ์ค๊ณ ๊ฐ์ด๋
BelongsToOne vs OneToOne
| ์ํฉ | ๊ถ์ฅ ํ์ | ์ด์ |
|---|---|---|
| ๊ฒ์๊ธ โ ์์ฑ์ | BelongsToOne | ์ฌ๋ฌ ๊ฒ์๊ธ์ด ํ ์ฌ์ฉ์์ ์ํจ |
| ์ฌ์ฉ์ โ ํ๋กํ | OneToOne | 1:1 ๋งค์นญ ๊ด๊ณ |
| ์ฃผ๋ฌธ โ ๊ณ ๊ฐ | BelongsToOne | ์ฌ๋ฌ ์ฃผ๋ฌธ์ด ํ ๊ณ ๊ฐ์ ์ํจ |
CASCADE vs RESTRICT
| ์ํฉ | ๊ถ์ฅ ๋์ | ์ด์ |
|---|---|---|
| ์ฌ์ฉ์ ์ญ์ โ ๊ฒ์๊ธ | CASCADE | ํจ๊ป ์ญ์ |
| ์นดํ ๊ณ ๋ฆฌ ์ญ์ โ ๊ฒ์๊ธ | RESTRICT | ๊ฒ์๊ธ์ด ์์ผ๋ฉด ์ญ์ ๋ถ๊ฐ |
| ๋ถ์ ์ญ์ โ ์ง์ | SET NULL | ์ง์์ ์ ์ง, ๋ถ์๋ง NULL |
nullable ์ค์
| ์ํฉ | nullable | ์ด์ |
|---|---|---|
| ํ์ ๊ด๊ณ | false | ํญ์ ์ฐธ์กฐ ํ์ |
| ์ ํ ๊ด๊ณ | true | ์์ ์๋ ์์ |
| ์์ ์ํ | true | ๋์ค์ ์ค์ |