๐ŸŒ WEB/JPA

6. ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ณ ๊ธ‰๋งคํ•‘

์• ์ •์“ฐ 2021. 5. 17. 18:08

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

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

์Šˆํผํƒ€์ž… ์„œ๋ธŒํƒ€์ž… ๋…ผ๋ฆฌ ๋ชจ๋ธ์„ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ชจ๋ธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1. ๊ฐ๊ฐ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ -> ์กฐ์ธ ์ „๋žต (์ •์„)

- ํ…Œ์ด๋ธ” ์ •๊ทœํ™”

- ์™ธ๋ž˜ ํ‚ค ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์กฐ๊ฑด ํ™œ์šฉ ๊ฐ€๋Šฅ

- ์ €์žฅ๊ณต๊ฐ„ ํšจ์œจํ™”

- ์กฐํšŒ์‹œ ์กฐ์ธ์„ ๋งŽ์ด ์‚ฌ์šฉ -> ์„ฑ๋Šฅ ์ €ํ•˜, ์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•จ

- ๋ฐ์ดํ„ฐ ์ €์žฅ์‹œ INSERT ์ฟผ๋ฆฌ๊ฐ€ 2๋ฒˆ ํ˜ธ์ถœ ๋œ๋‹ค.

๋น„์ง€๋‹ˆ์Šค์ ์œผ๋กœ ์ค‘์š”ํ•˜๊ณ  ๋ณต์žกํ•  ๋•Œ ์„ ํƒ!

 

๋ถ€๋ชจ ํด๋ž˜์Šค ์„ค์ •

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn

 

์ž์‹ ํด๋ž˜์Šค ์„ค์ • -> dtype์— ํ‘œ์‹œ๋  ์ด๋ฆ„์„ ์ •ํ•ด ์ค„ ๊ฒฝ์šฐ

@DiscriminatorValue(name = "book")

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๊ธฐ๋ณธํŽธ) - ๊น€์˜ํ•œ / ์ธํ”„๋Ÿฐ

 

 

2. ํ†ตํ•ฉ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ -> ๋‹จ์ผ ํ…Œ์ด๋ธ” ์ „๋žต

ํ•œ ํ…Œ์ด๋ธ”์— ๋„ฃ๊ณ  DTYPE ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. 

ํ•œ ํ…Œ์ด๋ธ”์—์„œ ์กฐ์ธ ์—†์ด ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์—(์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ๋‹จ์ˆœํ•จ) ์„ฑ๋Šฅ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ๊ฐ’์ด ์•„๋‹ ๋•Œ null์ด ๋“ค์–ด๊ฐ„๋‹ค.

ํ•œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ์กฐํšŒ ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.

* ๋ฐ์ดํ„ฐ๋„ ์—†๊ณ  ๋‹จ์ˆœํ•  ๊ฒฝ์šฐ ๋‹จ์ผ ํ…Œ์ด๋ธ” ์„ ํƒ!

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn	// ํ•„์ˆ˜

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๊ธฐ๋ณธํŽธ) - ๊น€์˜ํ•œ / ์ธํ”„๋Ÿฐ

 

 

3. ์„œ๋ธŒํƒ€์ž… ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ -> ๊ตฌํ˜„ ํด๋ž˜์Šค๋งˆ๋‹ค ํ…Œ์ด๋ธ” ์ „๋žต (๋น„์ถ”์ฒœ)

- ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

- ์ค‘๋ณต ์ปฌ๋Ÿผ ์ „๋ถ€ ๋‚˜์—ด

- ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐ’์„ ๋„ฃ๊ณ  ๋นผ๊ธฐ ์ข‹์ง€๋งŒ ๋ช…ํ™•ํ•˜๊ฒŒ ์กฐํšŒํ•  ๋•Œ ๋นผ๊ณ ๋Š” ์กฐํšŒํ•  ๋•Œ union all๋กœ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

- ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ์กฐํšŒํ•ด์„œ ์ฐพ์•„์•ผํ•ด์„œ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๊ธฐ๋ณธํŽธ) - ๊น€์˜ํ•œ / ์ธํ”„๋Ÿฐ

 

 

Mapped Superclass - ๋งคํ•‘ ์ •๋ณด ์ƒ์†

๊ณตํ†ต ๋งคํ•‘ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ํด๋ž˜์Šค์— ๋“ฑ๋ก๋‚ ์งœ, ์ˆ˜์ •๋‚ ์งœ ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์ค‘๋ณต์œผ๋กœ ์„ ์–ธ ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๊ณตํ†ต ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ƒ์†๋ฐ›๋„๋ก ํ•œ๋‹ค.

* ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘์€ ์•„๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜์ง€ ์•Š๋Š”๋‹ค. ์ž์‹ ํด๋ž˜์Šค์— ๋งคํ•‘ ์ •๋ณด๋งŒ ์žฌ๊ณตํ•  ๋ฟ์ด๋‹ค.

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

@MappedSuperclass
public abstract class BaseEntity {
  private LocalDateTime createdDate;
  private LocalDateTime modifiedDate;
}

๊ทธ ํ›„์— ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค์—์„œ ์ƒ์†์„ ๋ฐ›๋Š”๋‹ค. ๊ทธ ํ›„์— JPA๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์†๋ฐ›์€ ํ•„๋“œ๋ฅผ ํฌํ•จํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ ๋‹ค. 

Hibernate: 
    
    create table Category (
       CETEGORY_ID bigint not null,
        createdDate timestamp,
        modifiedDate timestamp,
        name varchar(255),
        PARENT_ID bigint,
        primary key (CETEGORY_ID)
    )

๊ณตํ†ต ํ•„๋“œ์˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ํ•ด๋„ MappedSuperclass ๋งŒ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜๋‹ค.

 

 

๋ฐ˜์‘ํ˜•