๐Ÿ’พ Database

[JPA] ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘, ๊ณตํ†ต ์†์„ฑ ๋งคํ•‘

์—ฐ_์šฐ๋ฆฌ 2022. 2. 21. 20:16
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ๊ฐ์ฒด์˜ ์ƒ์†๊ด€๊ณ„

    extends๋กœ ์ง€์›ํ•ด์ค€๋‹ค.

    @Entity
    public class Item {
        @Id @GeneratedValue
        @Column(name = "item_id")
        private Long id;
        private String name;
        private int price;
        private int stockQuantity;
    }
    
    @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;
    }

     

    DB์—์„œ ์Šˆํผํƒ€์ž…-์„œ๋ธŒํƒ€์ž… ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

    ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ƒ์†๊ด€๊ณ„๊ฐ€ ์—†์ง€๋งŒ

    ์ƒ์†๊ณผ ์œ ์‚ฌํ•œ ์Šˆํผํƒ€์ž…-์„œ๋ธŒํƒ€์ž… ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค.

     

    JPA์—์„œ๋Š” ์•„๋ž˜ 3๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ด์ฃผ๋ฉฐ, @Inheritance ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    1. ํ†ตํ•ฉ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด ์กฐ์ธ์—†์ด ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•

        ์žฅ์  : ์กฐ์ธ์ด ์—†์–ด์„œ ์กฐํšŒ ์„ฑ๋Šฅ์ด ๋น ๋ฅด๋‹ค.

        ๋‹จ์  : ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋งคํ•‘ํ•œ ์ปฌ๋Ÿผ์€ ๋ชจ๋‘ null์ด ํ—ˆ์šฉ๋œ๋‹ค.

                ํ…Œ์ด๋ธ”์ด ๋„ˆ๋ฌด ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ๋Š” ์กฐํšŒ ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.

     

        JPA์—์„œ ๊ธฐ๋ณธ์ „๋žต์ด๋‹ค. Item ์—”ํ‹ฐํ‹ฐ์— @Entity๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜

        @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์— ํ†ตํ•ฉ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

     

    2. ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”๋กœ ๋‚˜๋ˆ„๋˜ ํ…Œ์ด๋ธ”๋งˆ๋‹ค ์ปฌ๋Ÿผ์„ ์ค‘๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•

        ์žฅ์  : ํ†ตํ•ฉ ํ…Œ์ด๋ธ”๋ณด๋‹ค ํ…Œ์ด๋ธ”์ด ๋‚˜๋‰˜์–ด์ ธ ์ปฌ๋Ÿผ์— not null์ œ์•ฝ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

        ๋‹จ์  : ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” Item์œผ๋กœ Album, Book, Movie๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

                ํ•˜์ง€๋งŒ ๊ฐ ํ…Œ์ด๋ธ”๋งˆ๋‹ค ๋‚˜๋‰˜์–ด์ง„ ์ƒํƒœ์—์„œ Item์œผ๋กœ ์กฐํšŒํ•˜๊ฒŒ๋˜๋ฉด

                ๋ชจ๋“  ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค(Union SQLํ•„์š”)

                => DB์„ค๊ณ„์ž, ORM ์ „๋ฌธ๊ฐ€ ๋ชจ๋‘ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค!!

     

        Item์—”ํ‹ฐํ‹ฐ์— @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.

        ๊ฐ์ฒด์—์„œ๋Š” Item์—”ํ‹ฐํ‹ฐ์— abstract ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ์ถ”์ƒํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

        ๊ทธ๋Ÿฌ๋ฉด extends๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ, Itemํ…Œ์ด๋ธ”์€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.

     

    3. ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”๋กœ ๋‚˜๋ˆ„๋˜ ์ค‘๋ณต ์ปฌ๋Ÿผ์€ ๊ณตํ†ต ํ…Œ์ด๋ธ”๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์กฐ์ธ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•

       ์žฅ์  : ์ •๊ทœํ™”๋ฅผ ํ†ตํ•ด ์ €์žฅ๊ณต๊ฐ„์ด ํšจ์œจํ™”๋œ๋‹ค.

       ๋‹จ์  : ์กฐํšŒ ์‹œ ์กฐ์ธ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ๋˜์–ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

                ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ Insert๋ฌธ์„ 2๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค.

     

       Item์—”ํ‹ฐํ‹ฐ์— @Inheritance(strategy = InheritanceType.JOINED)๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    public class Item {
        @Id @GeneratedValue
        @Column(name = "item_id")
        private Long id;
        private String name;
        private int price;
        private int stockQuantity;
    }
    
    @Entity
    public class Movie extends Item{
        private String director;
        private String actor;
    }
    Movie movie = new Movie();
    movie.setName("์•„๋ฐ”ํƒ€");
    movie.setPrice(10000);
    movie.setStockQuantity(10);
    movie.setActor("๋ฐฐ์šฐ");
    movie.setDirector("์ž‘๊ฐ€");
    
    em.persist(movie);

     

    @DiscriminatorColumn

    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ–ˆ์„ ๋•Œ, item์— ์ž…๋ ฅ๋œ ๊ฐ’์ด ์ž์‹์ธ album, book, movie ์ค‘ ์–ด๋–ค ๊ฒƒ์— ์˜ํ•ด ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

     

    ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์— ์„ค์ •ํ•œ๋‹ค.

    @DiscriminatorColumn์„ ์„ค์ •ํ–ˆ์„ ๋•Œ ์ƒ๊ธฐ๋Š” ์ปฌ๋Ÿผ์˜ ๊ธฐ๋ณธ๋ช…์€ DTYPE์œผ๋กœ, (name = "~")์œผ๋กœ ์ปฌ๋Ÿผ๋ช…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

    DTYPE์— ๋“ค์–ด๊ฐ€๋Š” ๊ธฐ๋ณธ๊ฐ’์€ ์—”ํ‹ฐํ‹ฐ๋ช…์ด๋‹ค.

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn
    public class Item {
        @Id @GeneratedValue
        @Column(name = "item_id")
        private Long id;
        private String name;
        private int price;
        private int stockQuantity;
    }
    
    @Entity
    public class Movie extends Item{
        private String director;
        private String actor;
    }

     

    @DiscriminatorValue

    @DiscriminatorColumn์— ์ž…๋ ฅ๋˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ž์‹ํ…Œ์ด๋ธ”์— ์„ค์ •ํ•œ๋‹ค.

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn
    public class Item {
        @Id @GeneratedValue
        @Column(name = "item_id")
        private Long id;
        private String name;
        private int price;
        private int stockQuantity;
    }
    
    @Entity
    @DiscriminatorValue("M")
    public class Movie extends Item{
        private String director;
        private String actor;
    }

     

     

    @MappedSuperclass

    ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ createdBy, createTime, updatedBy...  ๋“ฑ๋“ฑ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋Ÿผ๋“ค์˜ ๊ฒฝ์šฐ

    BaseEntity๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค€๋‹ค.

     

    ์ฃผ์˜! @MappedSuperclass๋Š” ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘์ด ์•„๋‹ˆ๋‹ค. 

    ์ž์‹ ํด๋ž˜์Šค์— ์ปฌ๋Ÿผ์ •๋ณด๋งŒ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

    ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•  ์ผ์ด ์—†์œผ๋ฏ€๋กœ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

    @MappedSuperclass
    public abstract class BaseEntity {
    
        private String createBy;
    
        @Column(name = "updateBy")
        private String update;
    }
    
    @Entity
    public class Member extends BaseEntity {
        @Id @GeneratedValue
        @Column(name = "member_id")
        private Long id;
        private String name;
    }

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ