๋ฒ ์ด์ง๋ฐ
๋ฐ์ดํฐ๋ชจ๋ธ๋ง๊ณผ ์ฐ๊ด๊ด๊ณ
12/19 11:00 ~ 12:00 (์ฝ 1์๊ฐ ์งํ)
์ค์ํค์๋
- ๋จ๋ฐฉํฅ vs ์๋ฐฉํฅ
- ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ
- ๋ถ๋ชจ-์์ ๊ด๊ณ
- cascade
- orphanRemoval
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง
1. ๋ด์ผ๋ฐฐ์์บ ํ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ ๋ถ์
a. ์๋๋ฆฌ์ค์ ์๋ง์ ๋น์ฆ๋์ค ๊ด์ ์?!
b. ๋ด์ผ๋ฐฐ์์บ ํ ์์คํ ์ ______________________์ด๋ค!
- ํ ๋ช ์ ํ์์ด ํ๋์ ์์ ๋ง ๋ค์ ์ ์๋ ๊ตฌ์กฐ
- ํ๋์ ์์ ์ด ์ฌ๋ฌ ๋ช ์ ํ์์ ํฌํจํ ์ ์๋ ๊ตฌ์กฐ
2. ํ ์ด๋ธ ์ง์ ๊ทธ๋ ค๋ณด๊ธฐ
a. case1: Course ํ ์ด๋ธ์ด studentId๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
student ํ ์ด๋ธ
pk (ํ์) | name |
1 | gygim |
2 | Steve |
Course ํ ์ด๋ธ
pk (์์ ) | student_id | name |
1 | 1 | Spring |
2 | 1 | Ktor |
3 | 1 | React |
4 | 2 | Java |
5 | 2 | Kotlin |
- ํ ๋ช ์ ํ์์ด ์ฌ๋ฌ ๊ฐ์ ์์ ์ ๋ค์ ์ ์๋ ๊ตฌ์กฐ
- ํ๋์ ์์ ์ด ํ๋์ ํ์๋ง ํฌํจํ ์ ์๋ ๊ตฌ์กฐ
โถ ๋ด์ผ๋ฐฐ์์บ ํ์ ์๊ตฌ์ฌํญ๊ณผ ๋ง์ง ์๋ค.
b. case2: Student ํ ์ด๋ธ์ด courseId๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
Course ํ ์ด๋ธ
pk (์์ ) | name |
1 | Spring |
2 | Java |
Student ํ ์ด๋ธ
pk (ํ์) | course_id | name |
1 | 1 | gygim |
2 | 1 | Steve |
3 | 1 | John |
4 | 2 | Isac |
5 | 2 | David |
- ํ ๋ช ์ ํ์์ด ํ๋์ ์์ ๋ง ๋ค์ ์ ์๋ ๊ตฌ์กฐ
- ํ๋์ ์์ ์ด ์ฌ๋ฌ ๋ช ์ ํ์์ ํฌํจํ ์ ์๋ ๊ตฌ์กฐ
โถ ๋ด์ผ๋ฐฐ์์บ ํ์ ์๊ตฌ์ฌํญ๊ณผ ๋์ผํ๋ค.
๋ค์ํ ๋ฐ์ดํฐ์ ์ฐ๊ด๊ด๊ณ ๊ฐ๋
- ๋จ๋ฐฉํฅ vs ์๋ฐฉํฅ
- ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ
- ๋ถ๋ชจ - ์์ ๊ด๊ณ
1. ๋จ๋ฐฉํฅ vs ์๋ฐฉํฅ
a. ๋จ๋ฐฉํฅ: ํ์ชฝ์์๋ง ๋ค๋ฅธ ์ํฐํฐ(Entity)๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ
@ManyToOne๋ง ์ค์ ํ ์ํฉ
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "course_id") // ์ธ๋ ํค ๊ด๋ฆฌ
private Course course; // ๋จ๋ฐฉํฅ ๊ด๊ณ
}
b. ์๋ฐฉํฅ: ์ํฐํฐ(Entity)๊ฐ ์๋ก ์ฐธ์กฐํ๋ ์ํฉ
@OneToMany๋ฅผ ์ถ๊ฐ๋ก ์ค์ ํ ์ํฉ
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "course")
private List<Student> students = new ArrayList<>();
}
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "course_id")
private Course course;
}
2. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ (๋ฐ์ดํฐ ๊ด์ )
๋ฐ์ดํฐ ๊ด์ ์์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ธ๋ํค(FK: ForeignKey)๋ฅผ ์์ ํ๊ณ ์๋ ์ํฐํฐ(Entity)(ํ ์ด๋ธ)์ด๋ค.
PK | FK | name |
์๋ณ์ | ์ธ๋ํค | ์์ฑ |
class Entity {
private Long id; // ์๋ณ์
private Entity entity; // ์ธ๋ํค
private String name; // ์์ฑ
}
3. ๋ถ๋ชจ - ์์ ๊ด๊ณ (๋น์ฆ๋์ค ๊ด์ )
๋น์ฆ๋์ค ๊ด์ ์์ ํ ์ํฐํฐ(Entity)๊ฐ ๋ค๋ฅธ ์ํฐํฐ(Entity)๋ฅผ ํฌํจํ๋ ๋ ผ๋ฆฌ์ ๊ด๊ณ๋ฅผ ์๋ฏธํ๋ค.
4. ์๋๋ฆฌ์ค์์ ํ์ฉ๋๋ ๋ฐ์ดํฐ ๊ด๊ณ ์ดํด๋ณด๊ธฐ
a. ํ์์ ์ฐ๊ด๊ด๊ณ ์ดํด๋ณด๊ธฐ
๋ฐ์ดํฐ ๊ด์
id | course_id | name |
1 | 2 | gygim |
public class Student {
...
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id")
private Course course;
private String name;
...
}
๋น์ฆ๋์ค ๊ด์
- ํ์์ ์ฐ๊ด ๊ด๊ณ์์ ์ฃผ์ธ์ด๋ค.
- ํ์์ ๋ถ๋ชจ - ์์ ๊ด๊ณ์์ ์์์ด๋ค.
b. ์์ ์ ์ฐ๊ด ๊ด๊ณ ์ดํด๋ณด๊ธฐ
๋ฐ์ดํฐ ๊ด์
id | name |
1 | Spring |
public class Course {
...
@OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Student> students;
...
}
๋น์ฆ๋์ค ๊ด์
- ์์ ์ ์ฐ๊ด ๊ด๊ณ์์ ์ฃผ์ธ์ด ์๋๋ค.
- ์์ ์ ๋ถ๋ชจ - ์์ ๊ด๊ณ์์ ๋ถ๋ชจ์ด๋ค.
5. ์ ๋ฆฌ
student_id | course_id | name |
1 | 2 | gygim |
public class Student {
...
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id")
private Course course;
private String name;
...
}
course_id | name |
1 | Spring |
public class Course {
...
@OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Student> students;
...
}
์ฐ๊ด ๊ด๊ณ ์ฃผ์ธ | ๋ถ๋ชจ | ์์ | |
ํ์ | โ | โ | โ |
์์ | โ | โ | โ |
- @JoinColumn์ ํ์ฌ ์ํฐํฐ(Entity)๊ฐ ์์ ํ๊ณ ์๋ ์ธ๋ํค ์ปฌ๋ผ์ด ์ด๋ค ์์ฑ๊ณผ ์ฐ๊ฒฐ๋๋์ง ๋ช ์ํ๋ค.
- @JoinColumn์ด ์๋ ์ชฝ์ด ์ฐ๊ด ๊ด๊ณ ์ฃผ์ธ์ด๋ค.
์ถ๊ฐ: CascadeType๊ณผ orphanRemoval
1. CascadeType
๋ถ๋ชจ ์ํฐํฐ(Entity)๊ฐ ์ํํ๋ ์์ (์์ํ, ๋ณํฉ, ์ญ์ ๋ฑ)์ ์์ ์ํฐํฐ(Entity)์๊ฒ ์ ํํ๋ ๊ธฐ์ค์ด๋ค.
PERSIST | ๋ถ๋ชจ๋ฅผ ์ ์ฅํ๋ฉด ์์๋ ์ ์ฅ |
MERGE | ๋ถ๋ชจ๋ฅผ ๋ณํฉํ๋ฉด ์์๋ ๋ณํฉ |
REMOVE | ๋ถ๋ชจ๋ฅผ ์ญ์ ํ๋ฉด ์์๋ ์ญ์ |
REFRESH | ๋ถ๋ชจ๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ์์๋ ์๋ก๊ณ ์นจ |
DETACH | ๋ถ๋ชจ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์์๋ ๋ถ๋ฆฌ |
ALL | ์์ ๋ชจ๋ ์์ ํฌํจ |
2. CascadeType ํ์ฉ ๋ฐฉ๋ฒ
@Entity
public class Course {
...
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "course_id") // ์ธ๋ ํค ์ค์
private List<Student> students = new ArrayList<>();
...
}
3. orphanRemoval
๋ถ๋ชจ์์ ๊ด๊ณ๊ฐ ๋์ด์ง(๋ฆฌ์คํธ์์ ์ ๊ฑฐ๋) ์์ ์ํฐํฐ(Entity)๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๋ ๊ธฐ๋ฅ์ด๋ค.
๋ถ๋ชจ ์ํฐํฐ(Entity)๊ฐ ์ญ์ ๋์ง ์๋๋ผ๋ ์์ ์ํฐํฐ(Entity)๊ฐ ๋ฆฌ์คํธ์์ ์ ๊ฑฐ๋๋ฉด ์์ ์ํฐํฐ(Entity)๋ ์ญ์ ๋๋ค.
'Today I Learned(TIL) > ์์ค๋ณ ํ์ต๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 4ํ์ฐจ ์ธ์ (0) | 2024.12.21 |
---|---|
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 3ํ์ฐจ ์ธ์ (0) | 2024.12.16 |
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 2ํ์ฐจ ์ธ์ (0) | 2024.12.11 |
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 1ํ์ฐจ ์ธ์ (0) | 2024.12.07 |
์์ค๋ณ ํ์ต๋ฐ_์คํ ๋ค๋๋ฐ 1ํ์ฐจ (1) | 2024.12.04 |