์„ค๋ช…

์œ„์˜ ๊ฐ ์ „๋žต๊ณผ ๊ธฐ์ˆ ์—๋Š” ๊ณ ์œ ํ•œ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ „๋žต์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

UNION ๊ธฐ๋ฐ˜ TABLE_PER_CLASS ์ „๋žต

์ด ์ „๋žต์€ ๋‹คํ˜•์„ฑ ์ฟผ๋ฆฌ ๋ฐ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(๋˜๋Š” ์ „ํ˜€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ) "์‚ฌ์šฉ์ž ์‚ฌ์šฉ์ž์—์„œ ์‚ฌ์šฉ์ž ์„ ํƒ". User๋ฅผ ์ฐธ์กฐํ•˜๋Š” Entity ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ตœ์„ ์˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค(์—ฌ์ „ํžˆ ์ตœ์ ํ™”๋œ ๋‹คํ˜•์„ฑ ์ฟผ๋ฆฌ ๋ฐ ์—ฐ๊ฒฐ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ).

SINGLE_TABLE ์ „๋žต

์ด ์ „๋žต์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

a) ๋‹จ์ˆœํ•œ ์ž‘์—…์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์ •๊ทœํ™” ๋ฐ NOT NULL ์ œ์•ฝ ์กฐ๊ฑด์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ „๋žต #3(JOINED)์„ ์„ ํ˜ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ƒ์†์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•˜๊ณ  ์œ„์ž„์œผ๋กœ ๋Œ€์ฒดํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋Š”์ง€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž์Šต๋‹ˆ๋‹ค.

b) ๋Ÿฐํƒ€์ž„์— ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์˜ ๋™์  ์ •์˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹คํ˜•์„ฑ ์ฟผ๋ฆฌ ๋ฐ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ. ๋™์‹œ์— ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ๋น„๊ต์  ์ ์€ ์ˆ˜์˜ ์ƒˆ ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉฐ ์ƒ์œ„ ํด๋ž˜์Šค์™€์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋™์ž‘์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ DBA์™€ ์ง„์ง€ํ•œ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

์กฐ์ธ ์ „๋žต

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

์—ฌ๊ธฐ์„œ ์ฃผ์˜ ์‚ฌํ•ญ: JOINED์™€ TABLE_PER_CLASS ์‚ฌ์ด์˜ ๊ฒฐ์ •์—๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์˜ ํ‰๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋„ˆ๋น„์™€ ๊นŠ์ด๋กœ ์ธํ•ด ์กฐ์ธ ๋น„์šฉ(๋ฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์„ฑ๋Šฅ)์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์™€๋Š” ๋ณ„๋„๋กœ ์ƒ์† ์ฃผ์„์„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ฐฑํ•œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€ ์ „๋žต์ด ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์ด์œ ๋กœ๋“  ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋  ๋•Œ ์ผ๋ถ€ ๊ณ„์ธต ๊ตฌ์กฐ ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@Polymorphism(type = PolymorphismType.EXPLICIT)

ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@Polymorphism(type = PolymorphismType.EXPLICIT)
class Client extends User {
   String address;
}

๊ทธ๋Ÿฐ ๋‹ค์Œ HQL ์ฟผ๋ฆฌ๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ฟผ๋ฆฌํ•  ๋•Œ ์ด ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

List<User> accounts = session.createQuery("from User").getResultList();

์ด ์ฟผ๋ฆฌ๋Š” User ๋ฐ Employee ๊ฐœ์ฒด ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ ํ•˜์ง€๋งŒ Client๋Š” ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .