JavaRush /Java Blog /Random-KO /JPA ์—”ํ„ฐํ‹ฐ ๋ฐ DB ๊ด€๊ณ„
Nikita Koliadin
๋ ˆ๋ฒจ 40
ะ”ะฝะตะฟั€

JPA ์—”ํ„ฐํ‹ฐ ๋ฐ DB ๊ด€๊ณ„

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

JPA ์—”ํ„ฐํ‹ฐ ๋ฐ DB ๊ด€๊ณ„

์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”, ๋™๋ฃŒ ์—ฌ๋Ÿฌ๋ถ„!
JPA ์—”ํ„ฐํ‹ฐ ๋ฐ DB ๊ด€๊ณ„ - 1
์ด ์ž๋ฃŒ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(์ดํ•˜ ๊ฐ„๋‹จํžˆ DB - "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค") ๊ตฌ์„ฑ, ๊ฐ์ฒด ๊ด€๊ณ„ํ˜• ๋งคํ•‘(์ดํ•˜ ๊ฐ„๋‹จํžˆ ORM ) ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ์ง€์‹, Hibernate/JPA ์™€ ๊ฐ™์€ ๊ตฌํ˜„ ์— ๋Œ€ํ•ด ์ด๋ฏธ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. . ์ด์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋ฉด JDBC ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ORM ๋ชจ๋ธ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๊ฒฝ๊ณ ํ–ˆ๊ณ , ์ ์ ˆํ•œ ์ค€๋น„ ์—†์ด ์ด ๊ธ€์„ ์ฝ์€ ๋‹น์‹ ์˜ ์ •์‹ ์— ๋Œ€ํ•ด ๋‚˜๋Š” ์ฑ…์ž„์„ ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค! :) ๋ชจ๋“  ๊ฒƒ์„ ์ˆœ์„œ๋Œ€๋กœ ๋‹ค๋ฃจ๊ธฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, ์šฐ๋ฆฌ๋Š” ์ด๋ก ์„ ์กฐ๊ธˆ๋งŒ ํŒŒํ—ค์ณ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๋ชจ๋‘๊ฐ€ ์ข‹์•„ํ•˜๋Š” Java์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ†ตํ•ฉํ•˜๊ณ  ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• ์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์น˜ํŠธ ์‹œํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋“œ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค . ๊ทธ๋Ÿผ ํ•ด๋ณด์ž!

์—”ํ„ฐํ‹ฐ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์—”ํ„ฐํ‹ฐ ๋Š” ์†์„ฑ(๋ฌธ, WHEELS , ์—”์ง„) ์„ ๊ฐ€์ง„ ์‹ค์ƒํ™œ์˜ ๊ฐ์ฒด(์˜ˆ: ์ž๋™์ฐจ) ์ž…๋‹ˆ๋‹ค . DB ์—”ํ„ฐํ‹ฐ: ์ด ๊ฒฝ์šฐ ์—”ํ„ฐํ‹ฐ๋Š” DB์— ์ €์žฅ๋˜๋ฏ€๋กœ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ž๋™์ฐจ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ์ด์œ ์™€ ๋ฐฉ๋ฒ•์€ ๋‚˜์ค‘์— ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

DB ๊ด€๊ณ„๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋จผ ์˜›๋‚ , ๋จผ ์™•๊ตญ์—์„œ๋Š” ๊ด€๊ณ„ํ˜• DB๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค . ๋ณธ DB์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Shrek์˜ ๋‹น๋‚˜๊ท€์—๊ฒŒ๋Š” ์ด๋Ÿฌํ•œ ํ…Œ์ด๋ธ”์„ ์ƒํ˜ธ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ๋„ ๋ถ„๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ 4๊ฐœ์˜ DB ๊ด€๊ณ„๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค .
  1. 1-1
  2. ์ผ๋Œ€๋‹ค
  3. ๋‹ค๋Œ€์ผ
  4. ๋‹ค๋Œ€๋‹ค
์ด ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜์Œ์œผ๋กœ ๋ณธ๋‹ค๋ฉด ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ๋” ์•…ํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฐ์ฑ…ํ•˜๋Ÿฌ ๊ฐ€๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. ์šฐ๋ฆฌ๋Š” ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ด๋“ค ๊ฐ„์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๊ณตํฌ์˜ ์˜ˆ

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

์ผ๋Œ€์ผ ๊ด€๊ณ„

์—ฌ๊ธฐ ์— ์ง€์  ๋งํฌ๋ฅผ ๊ฑธ์–ด์ฃผ์„ธ์š” .
  1. ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— H2 DB๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” DB ๋“ฑ์„ ํŽธํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” Ultimate IDEA๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด DB ์—ฐ๊ฒฐ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜์„ธ์š”. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 2

    ๋‹ค์Œ์œผ๋กœ DB ์„ค์ •์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋ฌผ๋ก  DBMS๊นŒ์ง€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณตํ•˜์ง€๋งŒ ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด H2 DB๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 3

    ๋‹ค์Œ์œผ๋กœ ํšŒ๋กœ๋ฅผ ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ DB์— ์—ฌ๋Ÿฌ ์Šคํ‚ค๋งˆ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 4

    ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด ๊ฒฐ๊ตญ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 5
  2. ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  IDEA์—์„œ ์ด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ทธ ์•ˆ์— ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Author์™€ Book์ด๋ผ๋Š” ๋‘ ์—”ํ„ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฑ…์—๋Š” ์ €์ž๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๋ช…์˜ ์ €์ž๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์‹œ์ ์—์„œ๋Š” - ์ผ๋Œ€์ผ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. DB ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

    DROP TABLE IF EXISTS PUBLIC.BOOK;
    
    CREATE TABLE PUBLIC.BOOK (
      ID         INTEGER      NOT NULL AUTO_INCREMENT,
      NAME       VARCHAR(255) NOT NULL,
      PRINT_YEAR INTEGER(4)   NOT NULL,
      CONSTRAINT BOOK_PRIMARY_KEY PRIMARY KEY (ID)
    );
    
    DROP TABLE IF EXISTS PUBLIC.AUTHOR;
    
    CREATE TABLE PUBLIC.AUTHOR (
      ID          INTEGER      NOT NULL AUTO_INCREMENT,
      FIRST_NAME  VARCHAR(255) NOT NULL,
      SECOND_NAME VARCHAR(255) NOT NULL,
      BOOK_ID     INTEGER      NOT NULL UNIQUE,
      CONSTRAINT AUTHOR_PRIMARY_KEY PRIMARY KEY (ID),
      CONSTRAINT BOOK_FOREIGN_KEY FOREIGN KEY (BOOK_ID) REFERENCES BOOK (ID)
    );

    ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์‹คํ–‰ํ•ด ๋ด…์‹œ๋‹ค:

    JPA Entities and DB Relationships - 6

    ์ฝ˜์†”์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ:

    JPA Entities and DB Relationships - 7

    DB ๊ฒฐ๊ณผ:

    JPA Entities and DB Relationships - 8
  3. ํ…Œ์ด๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด DB์—์„œ RMB๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    JPA Entities and DB Relationships - 9

    ๊ฒฐ๊ณผ:

    JPA Entities and DB Relationships - 10

    UML ๋‹ค์ด์–ด๊ทธ๋žจ ์—์„œ๋Š” ๋ชจ๋“  ๊ธฐ๋ณธ ํ‚ค์™€ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์—ฐ๊ฒฐ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ DB๋ฅผ ์ฑ„์šฐ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

    INSERT INTO PUBLIC.BOOK (NAME, PRINT_YEAR)
    VALUES ('First book', 2010),
           ('Second book', 2011),
           ('Third book', 2012);
    
    INSERT INTO PUBLIC.AUTHOR (FIRST_NAME, SECOND_NAME, BOOK_ID)
    VALUES ('Pablo', 'Lambado', 1),
           ('Pazo', 'Zopa', 2),
           ('Lika', 'Vika', 3);

    ๋‚ด ๋ง์€, ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š” ๊ฑฐ์ฃ ? ํ•œ ํ…Œ์ด๋ธ”์˜ ์—”ํ„ฐํ‹ฐ๊ฐ€ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ(๋˜๋Š” BOOK_ID์—์„œ NOT NULL์ด ์ œ๊ฑฐ๋œ ๊ฒฝ์šฐ ์ „ํ˜€ ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) ์ผ๋Œ€์ผ ๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ํ•œ ๊ถŒ์˜ ์ฑ…์— ์ €์ž๊ฐ€ ํ•œ ๋ช… ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

  5. ์ด์ œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ์ ์€ Java ํด๋ž˜์Šค๋ฅผ DB ์—”ํ„ฐํ‹ฐ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Book๊ณผ Author๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค1๊ณผ ์ฃผ์š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋ถ„์•ผ๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Author ํด๋ž˜์Šค๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

    @Data
    @Entity
    @DynamicInsert
    @DynamicUpdate
    @Table(name = "AUTHOR")
    public class Author {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ID", nullable = false)
        private Long id;
    
        @Column(name = "FIRST_NAME", nullable = false)
        private String firstName;
    
        @Column(name = "SECOND_NAME", nullable = false)
        private String secondName;
    
        @OneToOne
        @JoinColumn(name = "BOOK_ID", unique = true, nullable = false)
        private Book book;
    }
์ˆœ์„œ๋Œ€๋กœ ์•Œ์•„ ๋ด…์‹œ๋‹ค.
  1. ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ•„๋“œ๋Š” DB ์—”ํ„ฐํ‹ฐ์˜ ์†์„ฑ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  2. @Data (from Lombok )๋Š” ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•ด getter ๋ฐ setter๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ์žฌ์ •์˜๋˜๊ณ , toString ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
  3. @Entity๋Š” ์ฃผ์–ด์ง„ ํด๋ž˜์Šค๊ฐ€ ์—”ํ„ฐํ‹ฐ์ด๊ณ  DB ์—”ํ„ฐํ‹ฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  4. @DynamicInsert ๋ฐ @DynamicUpdate๋Š” ๋™์  ์‚ฝ์ž… ๋ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ DB์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๋” ๊นŠ์€ Hibernate ์„ค์ •์ž…๋‹ˆ๋‹ค.
  5. @Table (name = "AUTHOR")์€ Book ํด๋ž˜์Šค๋ฅผ DB AUTHOR ํ…Œ์ด๋ธ”์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  6. @Id๋Š” ์ด ํ•„๋“œ๊ฐ€ ๊ธฐ๋ณธ ํ‚ค๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
  7. @GeneratedValue (strategy = GenerationType.IDENTITY) โ€“ ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ ์ „๋žต์ž…๋‹ˆ๋‹ค.
  8. @Column (name = "ID", nullable = false)์€ ํ•„๋“œ๋ฅผ DB ์†์„ฑ๊ณผ ์—ฐ๊ฒฐํ•˜๊ณ  ์ง€์ •๋œ DB ํ•„๋“œ๊ฐ€ null์ผ ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Š” ์—”ํ„ฐํ‹ฐ์—์„œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๋ฐ˜๋Œ€ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ DB์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  9. @OneToOne์€ ์ฃผ์–ด์ง„ ํ•„๋“œ๊ฐ€ ์ผ๋Œ€์ผ ๊ด€๊ณ„ ํ•„๋“œ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  10. @JoinColumn (name = "BOOK_ID", Unique = true, nullable = false) - null์ด ์•„๋‹Œ ๊ณ ์œ ํ•œ BOOK_ID ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€์ชฝ( Book ํด๋ž˜์Šค )์—์„œ๋„ ์ผ๋Œ€์ผ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๊ณ  ๋งคํ•‘์ด ๋ฐœ์ƒํ•˜๋Š” ํ•„๋“œ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @OneToOne(mappedBy = "book") - ์ด ์˜ˆ์—์„œ๋Š” Author ํด๋ž˜์Šค์˜ book ํ•„๋“œ์ž…๋‹ˆ๋‹ค. JPA๋Š” ์ด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๋ฉด ์ฃผ์„์ด ์—‰๋ง์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ณ  ๊ฒฝํ—˜์ด ์Œ“์ด๋ฉด ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ ๋„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ์ด์ œ ์ตœ๋Œ€ ์ ˆ์ „ ๋ชจ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด hibernate.cfg.xml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค:

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
            <property name="hibernate.connection.driver_class">org.h2.Driver</property>
    
            <property name="hibernate.connection.url">jdbc:h2:~/db/onetoone</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password"/>
    
            <property name="hibernate.hbm2ddl.auto">update</property>
    
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>
            <property name="hibernate.use_sql_comments">true</property>
    
            <property name="hibernate.generate_statistics">true</property>
    
            <property name="hibernate.jdbc.batch_size">50</property>
            <property name="hibernate.jdbc.fetch_size">50</property>
    
            <property name="hibernate.order_inserts">true</property>
            <property name="hibernate.order_updates">true</property>
            <property name="hibernate.jdbc.batch_versioned_data">true</property>
    
            <mapping class="com.qthegamep.forjavarushpublication2.entity.Book"/>
            <mapping class="com.qthegamep.forjavarushpublication2.entity.Author"/>
        </session-factory>
    </hibernate-configuration>
์†์„ฑ ์„ค๋ช… :
  1. hibernate.dialect๋Š” ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ DBMS์˜ ๋ฐฉ์–ธ์ž…๋‹ˆ๋‹ค.
  2. hibernate.connection.driver_class - DB์˜ ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  3. hibernate.connection.url - ์šฐ๋ฆฌ DB์˜ utl. DB๋ฅผ ์ฒ˜์Œ ๊ตฌ์„ฑํ•œ ์‹œ์ ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. hibernate.connection.username - DB ์‚ฌ์šฉ์ž ์ด๋ฆ„.
  5. hibernate.connection.password โ€” DB ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ.
  6. hibernate.hbm2ddl.auto - ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์„ค์ •. ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ์—…๋ฐ์ดํŠธ๋งŒ ๋ฉ๋‹ˆ๋‹ค.
  7. hibernate.show_sql - DB ์ฟผ๋ฆฌ ํ‘œ์‹œ ์—ฌ๋ถ€.
  8. hibernate.format_sql - DB ์ฟผ๋ฆฌ ํฌ๋งท ์—ฌ๋ถ€. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋‘ ํ•œ ์ค„์— ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ผœ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  9. hibernate.use_sql_comments - DB ์ฟผ๋ฆฌ์— ์ฃผ์„์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์‚ฝ์ž…์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์š”์ฒญ์ด ์‚ฝ์ž… ์œ ํ˜•์ด๋ผ๋Š” ์„ค๋ช…์ด ์š”์ฒญ ์œ„์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
  10. hibernate.generate_statistics - ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊น…์„ ์ตœ๋Œ€๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋ฅผ ์ฝ์œผ๋ฉด ORM์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
  11. hibernate.jdbc.batch_size โ€” ์ตœ๋Œ€ ๋ฐฐ์น˜ ํฌ๊ธฐ.
  12. hibernate.jdbc.fetch_size โ€” ์ตœ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ ํฌ๊ธฐ.
  13. hibernate.order_inserts - ๋™์  ์‚ฝ์ž…์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  14. hibernate.order_updates - ๋™์  ์—…๋ฐ์ดํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  15. hibernate.jdbc.batch_versioned_data - ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. DBMS๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  16. ๋งคํ•‘ ํด๋ž˜์Šค - ์—”ํ„ฐํ‹ฐ์ธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ๋‚˜์—ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  1. ์ด์ œ ์šฐ๋ฆฌ์˜ ๋ณธ์งˆ์ด ๊ฒฐ์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์„ฑ ํƒญ์—์„œ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 11

    ๊ฒฐ๊ณผ:

    JPA Entities and DB Relationships - 12
  2. ๋˜ํ•œ ํ• ๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 13 JPA Entities and DB Relationships - 14

    ๊ฒฐ๊ณผ: ์ผ๋Œ€์ผ ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ์ž๋ฃŒ๋Š” ์ฐธ๊ณ ์šฉ์œผ๋กœ๋งŒ ์ œ๊ณต๋˜๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฐธ๊ณ ์ž๋ฃŒ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋Œ€๋‹ค ๊ด€๊ณ„

์—ฌ๊ธฐ ์— ์ง€์  ๋งํฌ๋ฅผ ๊ฑธ์–ด์ฃผ์„ธ์š” . ์ด๋ฏธ ๋„ˆ๋ฌด ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ๊ธฐ์‚ฌ์— ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” GitHub์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.
  1. ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 15

    ์•ž์˜ ํ‘œ์™€ ์ฐจ์ด์ ์ด ๋Š๊ปด์ง€์‹œ๋‚˜์š”?

  2. ๋„ํ‘œ:

    JPA Entities and DB Relationships - 16

    ์ผ๋Œ€๋‹ค ๊ด€๊ณ„ - ํ•œ ๋ช…์˜ ์ €์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ถŒ์˜ ์ฑ…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™ผ์ชฝ ์—”ํ„ฐํ‹ฐ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜ค๋ฅธ์ชฝ ์—”ํ„ฐํ‹ฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  3. ๋งคํ•‘์˜ ์ฐจ์ด์ ์€ ์ฃผ์„๊ณผ ํ•„๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

    Author ํด๋ž˜์Šค ์— ํ•„๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค .

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "author")
    private Set<Book> books;

    ์—ฌ๋Ÿฌ ๊ถŒ์˜ ์ฑ…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. @OneToMany ๋Š” ๊ด€๊ณ„ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. FetchType.Lazy๋Š” ์š”์ฒญ์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ „์ฒด ๋„์„œ ๋ชฉ๋ก์„ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ํ•„๋“œ๋Š” toString์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์˜ ์‚ฌ๋ž‘ํ•˜๋Š” Lombok์€ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

    @ToString(exclude = "books")

    Book ํด๋ž˜์Šค ์—์„œ๋Š” ๋‹ค๋Œ€์ผ ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "AUTHOR_ID", nullable = false)
    private Author author;

    ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ผ๋Œ€๋‹ค(One-to-Many)๊ฐ€ ๋‹ค๋Œ€์ผ(Many-to-One)์˜ ๊ฑฐ์šธ ์ด๋ฏธ์ง€์ด๊ณ  ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. Hibernate๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์—๊ฒŒ ์ด๊ฒƒ์€ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ํ•œ ๋ฐฉํ–ฅ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.

  4. hibernate.cfg.xml ์—๋Š” ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค .

  5. ๊ณ ์ง‘:

    JPA Entities and DB Relationships - 17

๋‹ค๋Œ€์ผ ๊ด€๊ณ„

๋‹ค๋Œ€์ผ์€ ์ผ๋Œ€๋‹ค์˜ ๋ฏธ๋Ÿฌ ์ด๋ฏธ์ง€์ด๋ฏ€๋กœ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์— ์ง€์  ๋งํฌ๋ฅผ ๊ฑธ์–ด์ฃผ์„ธ์š” .
  1. ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 18
  2. ๋„ํ‘œ:

    JPA Entities and DB Relationships - 19
  3. ๋งคํ•‘์˜ ์ฐจ์ด์ ์€ ์ฃผ์„๊ณผ ํ•„๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

    Author ํด๋ž˜์Šค ์—๋Š” Book ํด๋ž˜์Šค ๋กœ ์ด๋™๋˜์—ˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ์„ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค .

  4. hibernate.cfg.xml

  5. ๊ณ ์ง‘:

    JPA Entities and DB Relationships - 20

๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„

๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๊ด€๊ณ„๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ํ’ˆ์œ„์™€ ์™ธ์„ค์˜ ๋ชจ๋“  ๊ทœ์น™์— ๋”ฐ๋ผ ์ด ๊ด€๊ณ„๋Š” ์ถ”๊ฐ€ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํ…Œ์ด๋ธ”์€ ์—”ํ„ฐํ‹ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ์ง€ ์•Š๋‚˜์š”? ์ด ๋˜ฅ์„ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์— ์ง€์  ๋งํฌ๋ฅผ ๊ฑธ์–ด์ฃผ์„ธ์š” .
  1. ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด๋ฉด ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ HAS ํ…Œ์ด๋ธ”์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ €์ž๊ฐ€ ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์–ป์Šต๋‹ˆ๋‹ค.

    ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ๋‹ค์Œ ํ…Œ์ด๋ธ”์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    JPA Entities and DB Relationships - 21
  2. ๋„ํ‘œ:

    JPA Entities and DB Relationships - 22

    ์šฐ๋ฆฌ์˜ ์˜ˆ์—์„œ๋Š” ํ•œ ์ฑ…์— ์—ฌ๋Ÿฌ ๋ช…์˜ ์ €์ž๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ํ•œ ์ €์ž์— ์—ฌ๋Ÿฌ ๊ถŒ์˜ ์ฑ…์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๊ฒน์น  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋งคํ•‘ ํด๋ž˜์Šค์—๋Š” ํด๋ž˜์Šค ๋‚ด์— ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด HAS ํ…Œ์ด๋ธ”์€ ์—”ํ„ฐํ‹ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

    ์ €์ž ํด๋ž˜์Šค :

    @ManyToMany
    @JoinTable(name = "HAS",
            joinColumns = @JoinColumn(name = "AUTHOR_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "BOOK_ID", referencedColumnName = "ID")
    )
    private Set<Book> books;

    @ManyToMany ๋Š” ์ผ์ข…์˜ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

    @JoinTable - ์ด๋Š” ์ •ํ™•ํžˆ ์†์„ฑ์„ ์ถ”๊ฐ€ HAS ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘ ์—”ํ„ฐํ‹ฐ์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‘ ๊ฐ€์ง€ ์†์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋„์„œ ์ˆ˜์—… :

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "books")
    private Set<Author> authors;

    ์—ฌ๊ธฐ์„œ๋Š” FetchType๊ณผ ๋งคํ•‘์— ์‚ฌ์šฉํ•  ํ•„๋“œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  4. hibernate.cfg.xml ์€ ๋‹ค์‹œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๊ฐ ์ง€์ ์— ๋Œ€ํ•ด ์ƒˆ DB๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

  5. ๊ณ ์ง‘:

    JPA Entities and DB Relationships - 23

๋ณต๋ช…

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” DB ๊ด€๊ณ„์˜ ์œ ํ˜•์„ ํ‘œ๋ฉด์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ณ  ์ด๋ฅผ ORM ๋ชจ๋ธ์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์—ฐ๊ฒฐ์„ ๋ณด์—ฌ์ฃผ๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  hibernate/jpa๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค. ํœด.

์œ ์šฉํ•œ ๋งํฌ

๋‚ด ์ด์ „ ๊ธฐ์‚ฌ: PS ๋ณธ๋ฌธ์— ์˜ค๋ฅ˜๋‚˜ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PPS ์ €์ž๋Š” ์ด ๊ธ€์„ ์“ฐ๋ฉด์„œ ์ด์ƒํ•œ ๋‹ด๋ฐฐ๋ฅผ ํ”ผ์šฐ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION