๐ ์ด๋ ธํ ์ด์ ์์ฝ
์ด๋ ธํ ์ด์ | ๋ชฉ์ |
@Entity | DB ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ ์ง์ง ์ํฐํฐ (JPA์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ํ ์ด๋ธ ๋งคํ ์ด๋ ธํ ์ด์ ) |
@MappedSuperclass | ๊ณตํต ํ๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ํ ์์ ์ ์ฉ ๋ถ๋ชจ ํด๋์ค |
@Inheritane | ์์ ๊ตฌ์กฐ ์์ฒด๋ฅผ DBํ ์ด๋ธ๋ก ๊ตฌํํ ๋ ์ฌ์ฉ, ์ ๋ต์ ๋ฐ๋ผ ํ๋ ๋๋ ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ๋ก ์ ์ฅ |
@Entity
๐ ์ค์ ๋ก DB์ ํ ์ด๋ธ(user)์ ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ด๋ค.
@Entity
public class User {
@Id
private Long id;
private String name;
}
โ๏ธ @Entity๊ฐ ์๋ค๋ฉด @Id๋ ์ธํธ๋ก ๋ฐ๋ผ๋ค๋๋ค. (Id ์ง์ ํ์)
โ๏ธ JPA์ ๊ธฐ๋ณธ ๋จ์์ด๋ค.
@MappedSuperclass
๐ ์ฌ๋ฌ ์ํฐํฐ์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ํ๋๋ค์(์์์ฉ) ์ ์ํ ๋ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์
@MappedSuperclass
public abstract class BaseTimeEntity {
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
โ๏ธ @MappedSuperclass๊ฐ ๋ถ์ ํด๋์ค๋ DBํ ์ด๋ธ์ด ๋ง๋ค์ด์ง์ง ์๋๋ค.
โ๏ธ ํ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์์ ์ํฐํฐ๊ฐ extends๋ก ์์์ ๋ฐ์์ผํ๋ค.
@Entity
public class Post extends BaseTimeEntity {
@Id
private Long id;
private String title;
}
โ๏ธ @MappedSuperclass๋ฅผ ์์๋ฐ๋๋ค๋ฉด, createdAt, updatedAt ํ๋๊ฐ ์๋์ผ๋ก ํฌํจ๋๋ค.
โ๏ธ ๋จ์ ํ๋๋ง ์์๋๋ฉฐ ๊ด๊ณ(@OneToMay ๋ฑ)๋ ์์์ด ๋์ง ์๋๋ค.
โ๏ธ๋งค๋ฒ ๊ณตํต๋ ํ๋๋ฅผ ๋ง๋ค๊ธฐ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์, ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ํ๋๋ฅผ ๋ฝ์์ @MappedSuperclass๋ฅผ ๋ง๋ค์ด์ค๋ค.
ใใ=> ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ํ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ฉ์ดํ๊ฒ ๋ง๋ค์ด์ค๋ค.
@Inheritance
์ํฐํฐ์ ์์ ๊ตฌ์กฐ๋ฅผ ํ ์ด๋ธ๋ก ๊ตฌํํ ๋ ์ฌ์ฉํ๋ค. 3๊ฐ์ง ์ ๋ต(SINGLE_TABLE, JOINED, TABLE_PER_CLASS)์ ์ ๊ณตํ๋ค.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item {
@Id
private Long id;
private String name;
}
ใ
@Entity
public class Book extends Item {
private String author;
}
@Inheritance(strategy = InheritanceType.์ ๋ต ์ ํ)
๐ ์ ๋ต ์์ฝ
์ ๋ต ์ด๋ฆ | ๋ป | ํ ์ด๋ธ ์ | ํน์ง |
SINGLE_TABLE | ํ๋์ ํ ์ด๋ธ์ ์ ๋ถ ์ ์ฅ | 1๊ฐ | ์๋ ๋น ๋ฆ, ๊ณต๊ฐ ๋นํจ์จ |
JOINED | ๋ถ๋ชจ/์์ ํ ์ด๋ธ ๋๋ ์ ์กฐ์ธ | ์ฌ๋ฌ ๊ฐ | ์ ๊ทํ ์ ๋จ, ๋๋ฆผ |
TABLE_PER_CLASS | ์์๋ง๋ค ๋ ๋ฆฝ ํ ์ด๋ธ | ์ฌ๋ฌ ๊ฐ | ์กฐ์ธ ์์, ์ค๋ณต ์ฌํจ |
* Table_per_class๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋๋ค.
๐ง ๊ณตํต ์ํ(Item)์ ์ฑ (Book), ์ํ(Movie), ์จ๋ฒ(Album) ๊ฐ์ ์์์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค,
@Entity
@Inheritance(strategy = ???)
public abstract class Item {
@Id
private Long id;
private String name;
}
@Entity
public class Book extends Item {
private String author;
}
@Entity
public class Movie extends Item {
private String director;
}
1๏ธโฃ SINGLE_TABLE
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
๐ ํ ์ด๋ธ ์์
id | name | author | director |
1 | ์ฑ 1 | ํ๊ธธ๋ | null |
2 | ์ํ1 | null | ๋ด์คํธ |
๐ซํน์ง
โ๏ธ ๋ชจ๋ ์์ ํด๋์ค ํ๋๋ฅผ ํ ํ ์ด๋ธ์ ๋ชฐ์์ ์ ์ฅํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋น ์นธ(null)์ด ๋ง์์ง๋ค. (๋ชจ๋ ํ๋๊ฐ ํฉ์ณ์ ธ์)
โ๏ธ ํ ์ด๋ธ์ด ํ๋์ด๊ธฐ ๋๋ฌธ์ ๋์คํฌ ์์ ํ ์ด๋ธ์ด ์ฐจ์งํ๋ ์ฉ๋์์ฒด๋ ์ ๋ค(๋์คํฌ ์ ์ฝ)
โ๏ธ ๊ทธ๋ฌ๋ ๋ชจ๋ ์์ ํด๋์ค์ ํ๋๋ฅผ ์ ๋ถ ๋ค ํฌํจํด์ผ ํด์ ๊ณต๊ฐ ๋นํจ์จ์ด๋ค.
๐ ์์ฑ๋๋ SQL ํ ์ด๋ธ DDL
CREATE TABLE item (
id BIGINT NOT NULL,
name VARCHAR(255),
author VARCHAR(255),
director VARCHAR(255),
dtype VARCHAR(31), -- โ
์ด๋ค ์์ ํด๋์ค์ธ์ง ๊ตฌ๋ถํ๋ ์ปฌ๋ผ
PRIMARY KEY (id)
);
2๏ธโฃ JOINED
@Inheritance(strategy = InheritanceType.JOINED)
๐ ํ ์ด๋ธ ์์
๐ Item(๋ถ๋ชจ ํ ์ด๋ธ) : ๊ณตํต ํ๋๋ง ์ ์ฅ
id | name | dtype |
1 | ์ฑ 1 | Book |
2 | ์ํ1 | Movie |
๐ Book(์์ ํ ์ด๋ธ)
id | name |
1 | ์ฑ 1 |
๐ Movie(์์ ํ ์ด๋ธ)
id | name |
2 | ์ํ1 |
id๋ Item์ PK๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค. (Item.id = Book.id ๊ทธ๋ฆฌ๊ณ Item.id = Movie.id)
๐ซํน์ง
โ๏ธ ๋ถ๋ชจ์ ์์ ์ํฐํฐ๋ฅผ ๊ฐ๊ฐ ๋ณ๋์ ํ ์ด๋ธ๋ก ๋ถ๋ฆฌํด์ ์ ์ฅํ๋ค.
โ๏ธ ์กฐํํ ๋ JOIN์ ์ฌ์ฉํด์ ๋ฌถ๋๋ค. JOIN์ผ๋ก ์ธํด ์ฑ๋ฅ์ด ๋๋ฆด ์ ์๋ค.
โ๏ธ ํ ์ด๋ธ์ด ๋ถ๋ฆฌ๋์ด ์ ๊ทํ๊ฐ ๋์ด์๋ค. (๊น๋ํ ๊ตฌ์กฐ)
๐ ์์ฑ๋๋ SQL ํ ์ด๋ธ DDL
CREATE TABLE item (
id BIGINT NOT NULL,
name VARCHAR(255),
dtype VARCHAR(31),
PRIMARY KEY (id)
);
CREATE TABLE book (
id BIGINT NOT NULL,
author VARCHAR(255),
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES item(id) -- โ
์กฐ์ธ์ฉ ์ฐ๊ฒฐ
);
CREATE TABLE movie (
id BIGINT NOT NULL,
director VARCHAR(255),
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES item(id)
);
3๏ธโฃ TABLE_PER_CLASS
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
๐ ํ ์ด๋ธ ์์
๐ Book(์์ ํ ์ด๋ธ)
id | name | author |
1 | ์ฑ 1 | ํ๊ธธ๋ |
๐ Movie(์์ ํ ์ด๋ธ)
id | name | director |
2 | ์ํ1 | ๋ด์คํธ |
์์ ํ ์ด๋ธ์ ๋ถ๋ชจ ํ๋(name)๋ ๊ฐ์ด ๋ค์ด๊ฐ๋ค.
๐ซํน์ง
โ๏ธ ๋ถ๋ชจ ํ ์ด๋ธ(item)์ด ์๊ณ , ์์ ํด๋์ค๋ง๋ค ๋ ๋ฆฝ์ ์ธ ํ ์ด๋ธ(book, item)์ ์์ฑํด์ ์ ์ฅํ๋ค.
โ๏ธ ์ค๋ณต ํ๋(name)๊ฐ ๋ง์์ ธ์ ์ ๊ทํ ์ ๋๊ฐ ๋ฎ๊ณ , ์ ์ง ๋ณด์๊ฐ ์ด๋ ต๋ค.
โ๏ธ ์ ์ฒด ์กฐํ์ UNION์ด ํ์ํด ์ด๋ ต๊ณ ๋ถํธํ๋ค.
ใใ =>์์ ํ ์ด๋ธ๋ง๋ค ๋ฐ๋ก ์กฐํํด์ผ ํ ์ ๋ ์๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ์ง๊ธฐ๊ฐ ํ๋ค๋ค.
๐ ์์ฑ๋๋ SQL ํ ์ด๋ธ DDL
CREATE TABLE book (
id BIGINT NOT NULL,
name VARCHAR(255),
author VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE movie (
id BIGINT NOT NULL,
name VARCHAR(255),
director VARCHAR(255),
PRIMARY KEY (id)
);
'๐ป๐ > Spring & SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JpaRepository ํ๋๋ช ์ผ๋ก ์ฟผ๋ฆฌ ๋ฉ์๋ ๋ง๋ค๊ธฐ (3) | 2025.05.10 |
---|---|
'์์ฑ์๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์ ๋ฐ๋๋ค'์ ์๋ฏธ (1) | 2025.03.26 |