๊ณ ๊ธ ๋งคํ (์์๊ด๊ณ ๋งคํ)
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์์ ๊ด๊ณ๊ฐ ์๋ค. ๋ค๋ง ๋ ผ๋ฆฌ์ ์ผ๋ก ์ํผํ์ ์๋ธํ์ ๊ด๊ณ๋ผ๋ ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ์ด ๊ฐ์ฒด์ ์์๊ณผ ์ ์ฌํ๋ค. ์์๊ด๊ณ ๋งคํ์ด๋, ๊ฐ์ฒด์ ์์๊ตฌ์กฐ์ DB ์ ์ํผํ์ ์๋ธํ์ ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๊ฒ์ผ๋ก, 3๊ฐ์ง ์ ๋ต์ผ๋ก ๋งคํํ ์ ์๋ค.
๐ฅ ์ฃผ์ ์ด๋ ธํ ์ด์
| ์ด๋ ธํ ์ด์ | ์ค๋ช | ์ ๋ต |
|---|---|---|
| @Inheritance | ์์๊ด๊ณ๋ฅผ ๋งคํํ ๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฌ์์ค์ผ ํ๋ค. | JOINED: ์กฐ์ธ ์ ๋ต, SINGLE_TABLE : ๋จ์ผ ํ ์ด๋ธ ์ ๋ต, TABLE_PER_CLASS : ๊ตฌํ ํด๋์ค๋ง๋ค ํ ์ด๋ธ์ ์์ฑํ๋ ์ ๋ต |
| @DiscriminatorColumn(name=โDTYPEโ) | ๋ถ๋ชจ ํด๋์ค์ ๋ฌ์์ค๋ค. DB์์๋ ์์๊ด๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ insert๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์๋ธํ์ ์ ๋ฐ์ดํฐ์ธ์ง ํ์ธํ๊ธฐ๊ฐ ์ด๋ ต๋ค. ๊ทธ๋์ DTYPE ์ ๋ฐ๋ก ์ค์ ํ์ฌ ์ด์์์ ํ์ธํ๊ธฐ ํธํ๊ฒ ํ๋ค. | name ์ ์๋ฌด๊ฑฐ๋ ๋ฃ์ด๋ ์๊ด์์ง๋ง default ๊ฐ DTYPE ์ด๊ธฐ๋ ํ๊ณ ๋ณดํต DTYPE ์ ์ด๋ค. |
| @DiscriminatorValue(โnameโ) | ์์ ํด๋์ค์ ๋ฌ์์ค๋ค. ์ํผํ์ ์ insert ๋ DTYPE ์ด๋ฆ์ ์ค์ ํ ์ ์๋ค. ํ์๋ ์๋. | default ๋ก๋ ํด๋์ค๋ช ์ด ๋ค์ด๊ฐ๋ค. |
๐งฉ ใ์กฐ์ธ ์ ๋ต
์ถ์ฒ: ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ (์ธํ๋ฐ)
ย
์ํผํ์ ์ PK ๋ฅผ ์๋ธํ์ ์ด FK ๋ก ์ฐธ์กฐํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ ๊ฒฝ์ฐ ์กฐ์ธ ์ ๋ต์ ์ฌ์ฉํ ์ ์๋ค.
์ธ๋ ํค ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ํ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
// ์ํผ ํ์
(๋ถ๋ชจ ํด๋์ค) : ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ผ์ด ์์ ๊ฒฝ์ฐ ์ถ์ ํด๋์ค๋ก ์ ์ธํ๋ค.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
// ์๋ธ ํ์
(์์ ํด๋์ค)
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
ย
๐งฉ ใ๋จ์ผ ํ ์ด๋ธ ์ ๋ต
์ถ์ฒ: ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ (์ธํ๋ฐ)
ย
๋ชจ๋ ์๋ธ ํ์ ์ ์นผ๋ผ์ ๋ถ๋ชจ ํ์ ์ ํฉ์ณ์ ๋จ์ผ ํ ์ด๋ธ๋ก ์ค๊ณํ ๊ฒฝ์ฐ์๋ ๋จ์ผ ํ ์ด๋ธ ์ ๋ต์ ์ฌ์ฉํ๋ค.
์ด ๊ฒฝ์ฐ์๋ ์กฐ์ธ์ด ํ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์กฐํ ์ฑ๋ฅ์ด ๋น ๋ฅด๊ณ , ์ฟผ๋ฆฌ๊ฐ ๋จ์ํ๋ค.
๋ค๋ง, ์์ ํด๋์ค๊ฐ ๋งคํํ๋ ์ปฌ๋ผ์ ๋ชจ๋ null ์ ํ์ฉํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
๋จ์ผ ํ ์ด๋ธ ์ ๋ต์ ๊ฒฝ์ฐ, ์๋ณ์ ์ํ DTYPE ์ด ๋ฐ๋์ ํ์ํด์ ๊ฐ๋ฐ์๊ฐ ์ค์ ํ์ง ์์๋ ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์๋์ผ๋ก ์์ฑํ๋ค.
// ์ํผ ํ์
(๋ถ๋ชจ ํด๋์ค)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
// ์๋ธ ํ์
(์์ ํด๋์ค)
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
ย
๐งฉ ใ๊ตฌํ ํด๋์ค๋ง๋ค ํ ์ด๋ธ ์์ฑ ์ ๋ต
์ถ์ฒ: ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ (์ธํ๋ฐ)
ย
์๋ธ ํ์ ์ ์ํผ ํ์ ์ ์นผ๋ผ์ ์ ๋ถ ๋ฃ์ด์ ๊ฐ๊ฐ ๋ณ๊ฐ์ ํ ์ด๋ธ์ ์์ฑํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ ์ ๋ต์ด๋ค.
๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์๋๋ค โฆ
ย
๐ฅ ใ@MappedSuperclass
์์ ๊ด๊ณ์์ ์ฌ์ฉํ๋ ๋งคํ์ ์๋ โ
๋ชจ๋ ํด๋์ค์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๋งคํ ์ ๋ณด๊ฐ ์์ ๋ ์ค๋ณต ์ ๋ ฅ์ด ํ๋ค๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ํด๋์ค๋ฅผ ๋ง๋ค์ด ์์๋ฐ๋ ํ์์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, ๊ทธ๋ด ๋ ๋ถ์ด๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
๊ณตํต ๋งคํ ์ ๋ณด๋ฅผ ๋ด์ ํด๋์ค๋ ์ง์ ์์ฑํด์ ์ฌ์ฉํ ์ผ์ด ์์ผ๋ฏ๋ก abstract ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๊ทธ์ ๊ณตํต ์ ๋ณด๋ง ๋ค์ด์๋ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ์ํฐํฐ๊ฐ ์๋๊ณ , ํ ์ด๋ธ๊ณผ ๋งคํํ๋๊ฒ ์๋๋ค.
// ๊ณตํต ์ ๋ณด ํด๋์ค
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
}
// ๊ณตํต ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค๋ค์ ์ ๋ถ ์์๋ฐ์์ ์ฌ์ฉ
@Entity
@Inheritance
public class Item extends BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}