๊ณ ๊ธ‰ ๋งคํ•‘ (์ƒ์†๊ด€๊ณ„ ๋งคํ•‘)

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค. ๋‹ค๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์Šˆํผํƒ€์ž… ์„œ๋ธŒํƒ€์ž… ๊ด€๊ณ„๋ผ๋Š” ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ•์ด ๊ฐ์ฒด์˜ ์ƒ์†๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘์ด๋ž€, ๊ฐ์ฒด์˜ ์ƒ์†๊ตฌ์กฐ์™€ 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;

}