๋ณด์กด ๋ฌธ์ œ

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” Hibernate ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ์ƒˆ๋กญ๊ณ  ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ณ„ํš์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ ค๋Š” ์„ธ ๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

class User {
  int id;
  String name;
  LocalDate birthday;
}
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
class Client extends User {
   String address;
}

ํด๋ž˜์Šค๋Š” ์„œ๋กœ ์ƒ์†๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ์ ์€ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Hibernate๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜ ์œ ํ˜•

Hibernate์—๋Š” ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งคํ•‘๋œ ์Šˆํผํด๋ž˜์Šค
  • ์‹ฑ๊ธ€ ํ…Œ์ด๋ธ”
  • ์กฐ์ธ๋œ ํ…Œ์ด๋ธ”
  • ํด๋ž˜์Šค๋ณ„ ํ…Œ์ด๋ธ”

๊ฐ ์ „๋žต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ณ ์œ ํ•œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๊ทธ๋“ค์€ ๋งค์šฐ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ HQL์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์˜ ์žฅ์ ์ด ํ™•์—ฐํžˆ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฒฝ์šฐ๋‹ค.

๋‚˜๋Š” ์ด ์šฉ์–ด๋“ค์ด ๋Ÿฌ์‹œ์•„์–ด๋กœ ๋ฒˆ์—ญ๋œ ๊ฒƒ์„ ๋“ค์–ด๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ ์˜์–ด๋กœ ๋ฐœ์Œํ•˜๋Š” ๊ฒƒ๋„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์—์„œ๋Š” ๊ฐ๊ฐ์˜ ์˜๋ฏธ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

@MappedSuperClass

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

CREATE TABLE user {
  id INT,
  name VARCHAR,
  birthday DATE
}
CREATE TABLE employee {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE
}
CREATE TABLE client {
  id INT,
  name VARCHAR,
  birthday DATE,
  address VARCHAR
}

์ด๋Ÿฌํ•œ ํ…Œ์ด๋ธ”์˜ ํด๋ž˜์Šค๊ฐ€ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . Hibernate๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์— @MappedSuperclass ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๊ฒƒ ์—†์ด๋Š” Hibernate๋Š” ๋‹จ์ˆœํžˆ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํ•„๋“œ์™€ ์ฃผ์„์„ ๋ฌด์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ฃผ์„์ด ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@MappedSuperclass
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
class Client extends User {
   String address;
}

์ด๊ฒƒ์€ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์›์‹œ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‹ค์ œ๋กœ ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต ํ•„๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

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