๋๋ง์ ์ท์ฅ ์๋น์ค์ 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
์์ ๊ฐ์ด ์์ ์ ๋ต์ ์ด์ฉํ์ฌ ์์ ๊ด๊ณ๋ฅผ ๊ตฌํํ๊ฒ ๋๋ฉด ์ข ๋ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ์๋ฅผ ๋ค์ด์ ๊ณตํต ๋น์ฆ๋์ค ๋ก์ง๋ค์ ํ๋์ ์๋น์ค๋ก ๋ฐ๋ก ๋ชจ์์ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ณต ๋ก์ง์ด ๋ํญ ์ค์ด๋ค๋ฉฐ ๊ทธ ๋ฟ๋ง ์๋๋ผ ์ํผ ํ์ ์ ์์๋ฐ๊ธฐ๋ง ํ๋ค๋ฉด ๊ทธ ์ํฐํฐ๋ฅผ ์ํ ๊ณตํต ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ์ฉํ ์ ์์ด ํ์ฅ์ฑ์๋ ์์ฃผ ์ฉ์ดํ๋ค.