Hibernate JPA์—์„œ ์ƒ์† ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋‚˜๋งŒ์˜ ์˜ท์žฅ ์„œ๋น„์Šค์— Entity์ธ Wardrobe(์˜ท์žฅ), Cloth(์˜ท),  Record(์ฝ”๋””)๋Š” ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆด ์ˆ˜ ์žˆ๊ณ , ์ข‹์•„์š”๊ฐ€ ๋ˆŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋™์ผํ•œ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ Entity์ธ Like(์ข‹์•„์š”)์™€ Comment(๋Œ“๊ธ€)์— Wardrobe, Cloth, Record๊ฐ€ ์†์„ฑ์œผ๋กœ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ  Wardrobe, Cloth, Record ๊ฐ๊ฐ์— ๋ชจ๋‘ Like์™€ Comment๋ฅผ  ํฌํ•จํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„์„ ํ•˜์˜€๋‹ค. 

 

๋ฌผ๋ก  ๊ธฐ๋Šฅ์€ ์ •์ƒ ๋™์ž‘ํ•˜์ง€๋งŒ ๊ณผ์—ฐ ์ด ๋ฐฉ๋ฒ• ๋ฐ–์— ์—†๋Š” ๊ฒƒ์ธ๊ฐ€ ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ์•„์ง€๊ณ  ๋˜ ๋™์ผํ•œ ํŠน์ง•์„ ๊ฐ€์ง„ Entity๊ฐ€ ์ถ”๊ฐ€ ๋˜๋ฉด Comment์™€ Like์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋˜ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ตณ์ด Hibernate๋ฅผ ์‚ฌ์šฉํ•œ ์˜๋ฏธ๊ฐ€ ์—†์ง€ ์•Š์„๊นŒ? 

 

Hibernate์—์„œ ์—”ํ‹ฐํ‹ฐ๋“ค์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ํ•œ๋ฒˆ ์ฐพ์•„๋ณด์•˜๋‹ค. ๊ทธ ๊ฒฐ๊ณผ Hibernate ์ƒ์† ์ „๋žต์ด๋ผ๋Š” ๊ฒƒ์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

Hibernate ์ƒ์† ์ „๋žต

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ƒ์† ๊ฐœ๋…์ด ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ ์Šˆํผ ํƒ€์ž…๊ณผ ์„œ๋ธŒ ํƒ€์ž…์ด๋ผ๋Š” ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์Šˆํผ ํƒ€์ž…์€  ์„œ๋ธŒ ํƒ€์ž…๋“ค์„ ์ผ๋ฐ˜ํ™”ํ•œ Table์ด๋ฉฐ ์„œ๋ธŒ ํƒ€์ž…์€ ์Šˆํผ ํƒ€์ž…์„ ์ข€ ๋” ๊ตฌ์ฒดํ™”ํ•œ Table์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.  Hibernate๋Š” ์ด๋Ÿฌํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ƒ์† ๊ด€๊ณ„๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ƒ์† ์ „๋žต์ด๋‹ค. ์ƒ์† ์ „๋žต์—๋Š” ์ด 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ํ•œ๋ฒˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

 

SINGLE TABLE ์ „๋žต 

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class PostEntity extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    ...
    
 }

PostEntity์˜ ์„œ๋ธŒ ํƒ€์ž…์ธ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋“ค์„ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ƒ์† ์ „๋žต์ด๋‹ค. ์กฐ์ธ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํ•œ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋งŒ ๋‚ ๋ฆฌ๊ฒŒ ๋œ๋‹ค.  ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๋ชจ๋“  ์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ถ„์„ ์œ„ํ•ด DType์ด ํ•„์ˆ˜๋กœ ํ•„์š”ํ•˜๋‹ค. ๋งŒ์•ฝ์— @DiscriminatorColumn์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ DType ์ปฌ๋Ÿผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

@DiscriminatorColumn : ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์„ ์–ธํ•˜๋ฉฐ, ์ž์‹๋“ค์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์šฉ๋„์˜ ์ปฌ๋Ÿผ, default = DTYPE์ด๋‹ค. 
@DiscriminatorValue("") : ํ•˜์œ„ ํด๋ž˜์Šค์— ์„ ์–ธํ•˜๋ฉฐ, ๊ตฌ๋ถ„ ์ปฌ๋Ÿผ์— ์–ด๋–ค ๊ฐ’์„ ์ง€์ •ํ• ์ง€ ์„ค์ •ํ•œ๋‹ค. default = ํด๋ž˜์Šค ์ด๋ฆ„์ด๋‹ค. 

 

JOINED ์ „๋žต 

@Inheritance(strategy = InheritanceType.JOINED)
public class PostEntity extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    ...
}

์Šˆํผ ํƒ€์ž…์ธ ์—”ํ‹ฐํ‹ฐ์™€ ์„œ๋ธŒ ํƒ€์ž…์ธ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ์กฐ์ธ์„ ์ด์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ์ƒ์† ์ „๋žต์ด๋‹ค. ์กฐ์ธ์€ id ์†์„ฑ์„ ํ†ตํ•ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ธŒ ํƒ€์ž…๊ณผ ์Šˆํผ ํƒ€์ž…์ด ๋™์ผํ•˜๊ฒŒ id ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šˆํผ ํƒ€์ž… ์—”ํ‹ฐํ‹ฐ์™€ ์„œ๋ธŒ ํƒ€์ž…์ธ ์—”ํ‹ฐํ‹ฐ์— ์ด 2๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๊ฒŒ ๋œ๋‹ค.  (dtype์ด ๋ฐ”๋กœ ๊ตฌ๋ถ„์„ ์œ„ํ•œ ๊ตฌ๋ถ„์ž์ด๋‹ค!) 

insert into post_entity (created_date, modified_date, image_id, like_cnt, member_id, dtype) values ('2021-09-17T23:20:54.135+0900', '2021-09-17T23:20:54.135+0900', 1, 0, 1, 'Wardrobe');
Hibernate: 
    insert 
    into
        wardrobes
        (is_public, name, post_id) 
    values
        (?, ?, ?)

 

TABLE_PER_CLASS ์ „๋žต

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class PostEntity extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    ...
    
}

์กฐ์ธ ์ „๋žต๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ…Œ์ด๋ธ”์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜์ง€๋งŒ ์Šˆํผ ํƒ€์ž…์˜ ์†์„ฑ๋“ค์ด ์„œ๋ธŒ ํƒ€์ž…์œผ๋กœ ๋‚ด๋ ค๊ฐ€ ์œ„์น˜ํ•œ๋‹ค. JOIN, SINGLE TABLE ์ „๋žต๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ณตํ†ต ์†์„ฑ์ด ์ค‘๋ณต๋œ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TABLE_PER_CLASS์—์„œ๋Š” ์Šˆํผ ํƒ€์ž… ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. (์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ) 

 

์—ฌ๊ธฐ์„œ ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ๋ฐœ์ƒํ•œ๋‹ค. TABLE_PER_CLASS ์ „๋žต์€ ๊ฐ๊ฐ ํ…Œ์ด๋ธ”์ด id๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ GenerationType.IDENTITY ์ „๋žต์„ ์ด์šฉํ•˜์—ฌ id๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์Šˆํผ ํƒ€์ž… ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ธŒ ํƒ€์ž… ์—”ํ‹ฐํ‹ฐ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.  ์™œ๋ƒํ•˜๋ฉด GenerationType.IDENTITY ์ „๋žต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ‚ค ์ƒ์„ฑ์„ ๋งก๊ฒจ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ ์—”ํ‹ฐํ‹ฐ์— ์กด์žฌํ•˜๋Š” id ์†์„ฑ๋“ค์ด ์œ ๋‹ˆํฌ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ id ์†์„ฑ์„ ์œ ๋‹ˆํฌํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” GenerationType.TABLE ์ „๋žต์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. GenerationType.TABLE ์ „๋žต์€ ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ์ „๋žต์ธ๋ฐ ์„œ๋ธŒ ํƒ€์ž… ์—”ํ‹ฐํ‹ฐ๋“ค์ด ๋™์ผํ•˜๊ฒŒ ์ด ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•จ์œผ๋กœ์„œ ์œ ๋‹ˆํฌํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ TABLE_PER_CLASS๋Š” ์Šˆํผ ํƒ€์ž… ์—”ํ‹ฐํ‹ฐ๋กœ ๊ฒ€์ƒ‰์„ ํ•  ๊ฒฝ์šฐ ์„œ๋ธŒ ํƒ€์ž… ํ…Œ์ด๋ธ”๋“ค์„ ๋ชจ๋‘ UNIONํ•˜์—ฌ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ์ข‹์ง€ ๋ชปํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋ผ๊ณ  ํ•œ๋‹ค. ํ‚ค ์ƒ์„ฑ ์ „๋žต์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์•„๋ž˜ ๋งํฌ์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž!

 

https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html

 

[JPA] ๊ธฐ๋ณธํ‚ค(PK) ๋งคํ•‘ ๋ฐฉ๋ฒ• ๋ฐ ์ƒ์„ฑ ์ „๋žต - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

์œ„์™€ ๊ฐ™์ด ์ƒ์† ์ „๋žต์„ ์ด์šฉํ•˜์—ฌ ์ƒ์† ๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ์ข€ ๋” ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๊ณตํ†ต ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋“ค์„ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๋กœ ๋”ฐ๋กœ ๋ชจ์•„์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ๋กœ์ง์ด ๋Œ€ํญ ์ค„์–ด๋“ค๋ฉฐ ๊ทธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šˆํผ ํƒ€์ž…์„ ์ƒ์†๋ฐ›๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด ๊ทธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์œ„ํ•œ ๊ณตํ†ต ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํ™•์žฅ์„ฑ์—๋„ ์•„์ฃผ ์šฉ์ดํ•˜๋‹ค.