JPA ์—”ํ‹ฐํ‹ฐ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ (@Entity, @MappedSuperclass, @Inheritance ์ƒ์† ๋งคํ•‘ ์ „๋žต)

2025. 4. 16. 15:48ยท๐Ÿ’ป๐Ÿš€/Spring & SpringBoot

๐Ÿš€ ์–ด๋…ธํ…Œ์ด์…˜ ์š”์•ฝ

์–ด๋…ธํ…Œ์ด์…˜ ๋ชฉ์ 
@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
'๐Ÿ’ป๐Ÿš€/Spring & SpringBoot' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • JpaRepository ํ•„๋“œ๋ช…์œผ๋กœ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ
  • '์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค'์˜ ์˜๋ฏธ
aggeeeee
aggeeeee
ใ€€ φ(๏ผŽ๏ผŽ;)ใ€€๐Ÿ”œใ€€\_ใธ(โ–ญ-โ–ญ)โœจ
  • aggeeeee
    ๐Ÿฅ” ๋‹˜์˜ ๋ธ”๋กœ๊ทธ
    aggeeeee
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (155)
      • Today I Learned (25)
      • ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ (115)
        • ๋ณธ์บ ํ”„ ๊ณผ์ œ (17)
        • ์‚ฌ์ „์บ ํ”„ ๊ณผ์ œ (23)
        • SQL ์ฝ”๋“œ์นดํƒ€ (44)
        • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ์นดํƒ€ (31)
      • ๐Ÿ’ป๐Ÿš€ (15)
        • Java (7)
        • Git & GitHub (1)
        • CS (4)
        • Spring & SpringBoot (3)
  • ๋งํฌ

  • ์ตœ๊ทผ ๊ธ€

  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
aggeeeee
JPA ์—”ํ‹ฐํ‹ฐ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ (@Entity, @MappedSuperclass, @Inheritance ์ƒ์† ๋งคํ•‘ ์ „๋žต)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”