TypeORM - DB Relationship
NestJS๋ฅผ ๊ณต๋ถํ๋ฉด์ ๊ฐ์ธ์ ์ธ ์ฉ๋๋ก ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ง์ ์ ์ธ์ ๋ ํ์์ ๋๋ค :)
Set-up
์์ ์ ์ ๋ช๊ฐ์ง ์ ํ ๊ฐ๋ ์ ์ธ๊ธํ๊ณ ์์ํ์.
- <Primary Key>: ํด๋น ํ ์ด๋ธ์ ์๋ณ์ ์ญํ ์ ํ๋ ์ ์ฝ์กฐ๊ฑด์ผ๋ก ํ ์ด๋ธ์ ํ๋๋ง ์ค์ ํ ์ ์์.
- <Unique Key>: ํด๋น ์ปฌ๋ผ์ ์ ๋ ฅ๋๋ ๋ฐ์ดํฐ๊ฐ ์ ์ผํจ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ ์ฝ์กฐ๊ฑด์ผ๋กํ ํ ์ด๋ธ์ ์ฌ๋ฌ๊ฐ ์ค์ ํ ์ ์๋ค. ๋น์ฐํ Primary Key๋ Unique Key์ด๊ธฐ๋ ํ๋ค.
๋ฌผ๋ก ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ํ๋์ ํ ์ด๋ธ์ ๋ ๊ฐ ์ด์์ <Pimary Key>๋ฅผ ์ค์ ํ๊ธฐ๋ ํ๋ค. ์ด ๊ฒฝ์ฐ, ๋ ๊ฐ์ Key ๋ชจ๋์ ๋ํด์ ์ค๋ณต์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ค์ํ๊ฒ ๋๋ค!
DB Relationship
์ผ๋ฐ์ ์ผ๋ก DB์ ๊ฐ Entity๋ค์ ์๋ก ์์ ํ ๊ฒฉ๋ฆฌ๋์ด ์๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ ์ ๋ โrelationshipโ์ ๊ฐ์ง๋ค. (์ด๋, ๋์ ๋๋ ๊ฐ๋ ์ด <Foreign Key>๋ค!) ์๋ก ๋ค๋ฅธ ๋ Entity๊ฐ ํจ๊ป ์ฌ์ฉ๋๊ธฐ ์ํด์๋ <Join>์ด๋ผ๋ ํ๊ฒ ๋๋๋ฐ, ์ด Join์ ์ํํ๊ธฐ ์ํด์๋ ๊ฐ Entity ์ฌ์ด์ ์ ์ ํ <Relationship>์ด ์ ์๋์ด ์์ด์ผ ํ๋ค.
One-to-One
<One-to-One> ๊ด๊ณ๋ ์๋์ ๊ฐ์ด ๊ธฐ์ ๋๋ค.
$A$ contains only one instance of $B$, and $B$ contains only one instance of $A$.
TypeORM ๊ณต์ ์์ User
์ Profile
์ ์๋ฅผ ์ ์ํ๋ค.
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
gender: string;
@Column()
photo: string;
}
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(() => Profile)
@JoinColumn()
profile: Profile;
}
๊ฐ User
๋ โ๋จ ํ๋โ์ Profile
๊ฐ์ฒด๋ฅผ ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ Profile
๊ฐ์ฒด๋ ์ค์ง โ๋จ ํ๋โ์ User
์ ๋ํด์๋ง ์ฐ๊ด๋๋ค. ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, User
Entity๊ฐ Profile
๊ฐ์ฒด๋ฅผ ๊ฐ๊ณ ์์์ ํ์ธํ ์ ์๋ค.
๋, User
Entity์ @JoinColumn()
์ด๋ผ๋ ๋ฐ์ฝ๊ฐ ๋ถ์ด์๋๋ฐ, ์ด ๊ฒฝ์ฐ, User
Table์ profileId
๊ฐ ์๋์ผ๋ก <Foreign Key>๋ก ์ค์ ๋๋ค!
+-------------+--------------+----------------------------+
| user |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| name | varchar(255) | |
| profileId | int(11) | FOREIGN KEY |
+-------------+--------------+----------------------------+
์ฃผ์ํ ์ ์ One-to-One ์๋์์๋ @JoinColumn()
์ด ๋จ๋ฐฉํฅ์ผ๋ก ์ค์ ๋๋ค๋ ๊ฒ์ด๋ค. ๋
ผ๋ฆฌ์ ์ผ๋ก๋ Target Table์ ๊ฐ์ฒด๋ก ๊ฐ๋ ์ชฝ์์ @JoinColumn()
๋ฐ์ฝ๋ฅผ ์ฐ๋ ๊ฒ์ด ์ณ๋ค!
์ด๋ ๊ฒ ์ค์ ํ์ ๊ฒฝ์ฐ, find()
๋ก User
์ ๋ณด๋ฅผ ๋ถ๋ฌ์ฌ ๋, ์๋์ ๊ฐ์ FindOptions
๋ฅผ ์ฃผ๋ฉด, Foreign Table์ธ Profile
์ ์ ๋ณด๊น์ง ํจ๊ป ๋ถ๋ฌ์ฌ ์ ์๋ค!
const users = await userRepository.find({ relations: ["profile"] });
๊ทธ ์ธ์๋ Profile
์์ User
์ ๋ณด๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก, <์๋ฐฉํฅ Bi-direction>์ผ๋ก ์ค์ ํด์ค ์๋ ์๋ค. ์ฝ๋๋ TypeORM์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค. ๐ link
์ฃผ์ํ ์ ์ One-to-One์ผ๋ก ์์ฑ๋๋ Foreign Key๋ <Unique Key>๋ผ๋ ์ ์ด๋ค! ๋ง์ฝ Unique ์กฐ๊ฑด์ ๋ง์กฑ๋์ง ์๋ DB๋ฅผ ์ค๊ณํ๊ณ ์๋ค๋ฉด, One-to-One์ด ์๋ ์๋์ One-to-Many ๋ฐฉ์์ ์จ์ผ ํ๋ค!
One-to-Many / Many-to-One
<One-to-Many> ๋๋ <Many-to-One> ๊ด๊ณ๋ ์๋์ ๊ฐ์ด ๊ธฐ์ ๋๋ค.
$A$ contains multiple instances of $B$, but $B$ contains only one instance of $A$.
TypeORM ๊ณต์ ๋ฌธ์์์ User
์ Photo
์ ์๋ฅผ ๋ค๊ณ ์๋ค. ๊ฐ Photo
๋ ์ค์ง โ๋จ ํ๋โ์ User
๋ฅผ ๊ฐ์ง๋ง, User
๋ ์ฌ๋ฌ Photo
๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ด ๊ฒฝ์ฐ, Photo
๊ฐ Many, User
๊ฐ One์ด ๋๋ค.
์ฝ๋๋ TypeORM์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค. ๐ link
One-to-Many / Many-to-One ์์ ์ฃผ์ํ ์ ์ โ@OneToMany
cannot exist without @ManyToOne
.โ๋ผ๋ ์ ์ด๋ค. ์ฆ, ํ์ชฝ์์๋ง Relationship์ ํ์๋ก ํ๋ ์ํฉ์ด๋๋ผ๋ ๋ Entity ๋ชจ๋์ ๋ํด์ @OneToMany
, @ManyToOne
์ ์ค์ ํด์ค์ผ ํ๋ค๋ ๋ง์ด๋ค! ์ฐธ๊ณ ๋ก @OneToOne
์์ ํ์ชฝ์์๋ง ์ค์ ํด์ค๋ ๊ด์ฐฎ์๋ค!
๊ทธ์ธ์ One-to-One๊ณผ ๊ฑฐ์ ๋น์ทํ๋ค.
Many-to-Many
<Many-to-Many> ๊ด๊ณ๋ ์๋์ ๊ฐ์ด ๊ธฐ์ ๋๋ค.
$A$ contains multiple instances of $B$, and $B$ contains multiple instances of $A$.
TypeORM ๊ณต์ ๋ฌธ์์์ Question
๊ณผ Category
์ ์๋ฅผ ๋ค๊ณ ์๋ค. ๊ฐ Question
์ ์ฌ๋ฌ ๊ฐ์ Category
๋ฅผ ๊ฐ์ง ์ ์๋ค. ๋ฐ๋๋ก ๊ฐ Category
๋ ์ฌ๋ฌ ๊ฐ์ Question
์ ๊ฐ์ง ์ ์๋ค!
์ฝ๋๋ TypeORM์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค. ๐ link
Many-to-Many๋ ๊ธฐ์กด์ relation๊ณผ ๋ฌ๋ฆฌ ์๋ ์์์ด ์กฐ๊ธ ๋ค๋ฅด๋ค!!
Many-to-Many์์ @JoinTable
์ ํตํด ๋ Table์ ๋ํ Foreign Key๊ฐ ๋ด๊ธด ์๋ก์ด Table์ด ์์ฑ๋๋ค!!
์ฌ์ค ๊ฐ์ธ์ ์ธ ๊ฒฝํ์ผ๋ก Many-to-Many๋ ๋ญ๊ฐ ์ ์ฝ์ด ๋ง์์ DB๋ฅผ ์ค๊ณํ๋๋ฐ์ ์ข์ ์ ํ์ด ์๋์๋ ๊ฒ ๊ฐ๋ค. ๋ง์ฝ Many-to-Many๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ๋งํ๋ค๋ฉด, ๊ณผ๊ฐํ Many-to-Many ๋ฐฉ์์ ํฌ๊ธฐํ๊ณ ์ฐํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ ๊ฒ๋ ์ข์ ์ ๊ทผ์ผ ๊ฒ ๊ฐ๋ค! ๐ฅ
๋งบ์๋ง
์ฌ์ค ๋ชจ๋ DB relationship์ ์์์ ์๊ฐํ ๋ฐ์ฝ๋ ์ดํฐ ์์ด ๊ทธ๋ฅ ์ง์ ๊ตฌํํด๋ ํ ์๋ ์๋ค!! ํ์ง๋ง, ์ด๋ ๊ฒ DB๋ฅผ ์ค๊ณํ๋ค๋ณด๋ฉด ์ธ์ ๊ฐ๋ DB relationship์ ๋ํ ๋์ฆ๊ฐ ํ์ํ๊ฒ ๋๊ณ , ๋์ ๋ฐ๋ผ์๋ DB relationship์ ์ ๊ทน ํ์ฉํ๋๊ฒ ๊ตฌํ์ ๋ ๊ฐ๋ณ๊ฒ ๊ฐ์ ธ๊ฐ ์๋ ์๋ค. ๐