JPA ์ํฐํฐ ๋ฐ DB ๊ด๊ณ
์ข์ ํ๋ฃจ ๋์ธ์, ๋๋ฃ ์ฌ๋ฌ๋ถ!์ํฐํฐ๋ ๋ฌด์์ ๋๊น?
์ํฐํฐ ๋ ์์ฑ(๋ฌธ, WHEELS , ์์ง) ์ ๊ฐ์ง ์ค์ํ์ ๊ฐ์ฒด(์: ์๋์ฐจ) ์ ๋๋ค . DB ์ํฐํฐ: ์ด ๊ฒฝ์ฐ ์ํฐํฐ๋ DB์ ์ ์ฅ๋๋ฏ๋ก ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค. ์๋์ฐจ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์ด์ ์ ๋ฐฉ๋ฒ์ ๋์ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.DB ๊ด๊ณ๋ ๋ฌด์์ ๋๊น?
๋จผ ์๋ , ๋จผ ์๊ตญ์์๋ ๊ด๊ณํ DB๊ฐ ๋ง๋ค์ด์ก์ต๋๋ค . ๋ณธ DB์์๋ ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ ํํ๋ก ํํํ์๋ค. ๊ทธ๋ฌ๋ Shrek์ ๋น๋๊ท์๊ฒ๋ ์ด๋ฌํ ํ ์ด๋ธ์ ์ํธ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ๋ง๋๋ ๊ฒ์ด ํ์ํ๋ค๋ ๊ฒ๋ ๋ถ๋ช ํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ 4๊ฐ์ DB ๊ด๊ณ๊ฐ ๋ํ๋ฌ์ต๋๋ค . ์ด ๋ชจ๋ ๊ฒ์ ์ฒ์์ผ๋ก ๋ณธ๋ค๋ฉด ๋ค์ ํ ๋ฒ ๊ฒฝ๊ณ ํฉ๋๋ค. ์ํฉ์ด ๋ ์ ํ๋ ๊ฒ์ ๋๋ค. ์ฐ์ฑ ํ๋ฌ ๊ฐ๋ ๊ฒ์ ์๊ฐํด ๋ณด์ธ์. ์ฐ๋ฆฌ๋ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ชจ๋ ๊ด๊ณ๋ฅผ ๋ถ์ํ๊ณ ์ด๋ค ๊ฐ์ ์ฐจ์ด์ ์ ์ดํดํฉ๋๋ค.๊ณตํฌ์ ์
์ฐ๋ฆฌ๋ ํ๋ก์ ํธ์ ๋ํ ์ค๋ช ์ด ์๋ ๋ง์คํฐ์ ๊ฐ DB ๊ด๊ณ์ ๋ํ 1๊ฐ์ ๋ธ๋์น, ์ฆ 5๊ฐ์ ๋ธ๋์น๋ฅผ ๊ฐ๋ ํ๋์ ํ๋ก์ ํธ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ฐ ๋ถ๊ธฐ์๋ DB๋ฅผ ์์ฑํ๊ณ ํ ์คํธ ๋ฐ์ดํฐ๋ก ์ฑ์ฐ๋ SQL ์คํฌ๋ฆฝํธ์ ์ฃผ์ ๋งคํ์ด ์๋ Entity ํด๋์ค๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ฐ ๋ธ๋์น์ ๋ํ Hibernate ๊ตฌ์ฑ ํ์ผ๋ ์์ ๊ฒ์ ๋๋ค. ํ๋ก์ ํธ์์๋ ํด๋ผ์ฐ๋ DB๋ ์ธ๋ถ DB์ ๊ฐ๋ณ์ ์ธ ๋ถ๋ถ์ ๋ฐฉํด๊ฐ ๋์ง ์๋๋ก H2 ์๋ฒ ๋๋ DB๋ฅผ ํ์ฉํ๊ฒ ์ต๋๋ค . ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ์๋ฉด ์ง๊ณต์ฒญ์๊ธฐ์ H2 DB๋ฅผ ์ค์นํ์ค ์ ์์ต๋๋ค. 1๊ฐ ๋ถ๊ธฐ์ ๊ฐ ๋จ๊ณ๋ฅผ ์ค๋ช ํ๊ณ ๋๋จธ์ง๋ ํต์ฌ ์ฌํญ์ผ ๋ฟ์ ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์์ฝํ๊ฒ ์ต๋๋ค. ๊ฐ๋ค. ์ด๊ฒ์ ๋ด ํ๋ก์ ํธ์ ๋ง์คํฐ ๋ธ๋์น์ ๋ํ ๋งํฌ์ ๋๋ค.์ผ๋์ผ ๊ด๊ณ
์ฌ๊ธฐ ์ ์ง์ ๋งํฌ๋ฅผ ๊ฑธ์ด์ฃผ์ธ์ .-
์ฐ๋ฆฌ ํ๋ก์ ํธ์ H2 DB๋ฅผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ DB ๋ฑ์ ํธํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด์๋ Ultimate IDEA๊ฐ ํ์ํ๋ค๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ค๋ฉด DB ์ฐ๊ฒฐ๋ก ๋ฐ๋ก ์ด๋ํ์ธ์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํญ์ผ๋ก ์ด๋ํ์ฌ ์คํฌ๋ฆฐ์ท๊ณผ ๊ฐ์ด ์ํํฉ๋๋ค.
๋ค์์ผ๋ก DB ์ค์ ์ผ๋ก ๋์ด๊ฐ๋๋ค. ๋ฐ์ดํฐ๋ ๋ฌผ๋ก DBMS๊น์ง ์ ๋ ฅํ ์ ์์ต๋๋ค. ๋ฐ๋ณตํ์ง๋ง ๋จ์ํ๋ฅผ ์ํด H2 DB๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ค์์ผ๋ก ํ๋ก๋ฅผ ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋จ๊ณ๋ ์ ํ ์ฌํญ์ด์ง๋ง DB์ ์ฌ๋ฌ ์คํค๋ง๊ฐ ์๋ ๊ฒฝ์ฐ ๊ถ์ฅ๋ฉ๋๋ค.
์ค์ ์ ์ ์ฉํ๋ฉด ๊ฒฐ๊ตญ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
-
์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๊ณ 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) );
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์คํํด ๋ด ์๋ค:
์ฝ์์ ์คํ ๊ฒฐ๊ณผ:
DB ๊ฒฐ๊ณผ:
-
ํ ์ด๋ธ ๋ค์ด์ด๊ทธ๋จ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด DB์์ RMB๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฒฐ๊ณผ:
UML ๋ค์ด์ด๊ทธ๋จ ์์๋ ๋ชจ๋ ๊ธฐ๋ณธ ํค์ ์ธ๋ ํค๋ฅผ ๋ณผ ์ ์์ผ๋ฉฐ ํ ์ด๋ธ ๊ฐ์ ์ฐ๊ฒฐ๋ ๋ณผ ์ ์์ต๋๋ค.
-
ํ ์คํธ ๋ฐ์ดํฐ๋ก 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์ด ์ ๊ฑฐ๋ ๊ฒฝ์ฐ ์ ํ ๊ด๋ จ๋์ง ์์ ๊ฒฝ์ฐ) ์ผ๋์ผ ๊ด๊ณ๊ฐ ํ์ํฉ๋๋ค. ์ด ์์์๋ ํ ๊ถ์ ์ฑ ์ ์ ์๊ฐ ํ ๋ช ์์ด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
-
์ด์ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ ์ 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; }
- ํด๋์ค์ ๋ชจ๋ ํ๋๋ DB ์ํฐํฐ์ ์์ฑ์ ๋ฐ๋ณตํฉ๋๋ค.
- @Data (from Lombok )๋ ๊ฐ ํ๋์ ๋ํด getter ๋ฐ setter๊ฐ ์์ฑ๋๊ณ , ํด์์ฝ๋๊ฐ ์ฌ์ ์๋๊ณ , toString ๋ฉ์๋๊ฐ ์์ฑ๋ ๊ฒ์ด๋ผ๊ณ ๋งํฉ๋๋ค.
- @Entity๋ ์ฃผ์ด์ง ํด๋์ค๊ฐ ์ํฐํฐ์ด๊ณ DB ์ํฐํฐ์ ์ฐ๊ฒฐ๋์ด ์์์ ๋ํ๋ ๋๋ค.
- @DynamicInsert ๋ฐ @DynamicUpdate๋ ๋์ ์ฝ์ ๋ฐ ์ ๋ฐ์ดํธ๊ฐ DB์์ ์ํ๋๋ค๊ณ ๋งํฉ๋๋ค. ์ด๊ฒ์ ์ฌ๋ฐ๋ฅธ ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ ๋ ๊น์ Hibernate ์ค์ ์ ๋๋ค.
- @Table (name = "AUTHOR")์ Book ํด๋์ค๋ฅผ DB AUTHOR ํ ์ด๋ธ์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
- @Id๋ ์ด ํ๋๊ฐ ๊ธฐ๋ณธ ํค๋ผ๊ณ ๋งํฉ๋๋ค.
- @GeneratedValue (strategy = GenerationType.IDENTITY) โ ๊ธฐ๋ณธ ํค ์์ฑ ์ ๋ต์ ๋๋ค.
- @Column (name = "ID", nullable = false)์ ํ๋๋ฅผ DB ์์ฑ๊ณผ ์ฐ๊ฒฐํ๊ณ ์ง์ ๋ DB ํ๋๊ฐ null์ผ ์ ์์์ ๋ํ๋ ๋๋ค. ์ด๋ ์ํฐํฐ์์ ํ ์ด๋ธ์ ์์ฑํ ๋๋ ์ ์ฉํฉ๋๋ค. ์ง๊ธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ ํ๋ก์ธ์ค๋ ๋จ์ ํ ์คํธ๋ฅผ ์ํ ํ ์คํธ DB์ ํ์ํฉ๋๋ค.
- @OneToOne์ ์ฃผ์ด์ง ํ๋๊ฐ ์ผ๋์ผ ๊ด๊ณ ํ๋์์ ๋ํ๋ ๋๋ค.
- @JoinColumn (name = "BOOK_ID", Unique = true, nullable = false) - null์ด ์๋ ๊ณ ์ ํ BOOK_ID ์ด์ด ์์ฑ๋ฉ๋๋ค.
-
์ด์ ์ต๋ ์ ์ ๋ชจ๋๋ฅผ ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํํ๋ ค๋ฉด 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>
- hibernate.dialect๋ ์ฐ๋ฆฌ๊ฐ ์ ํํ DBMS์ ๋ฐฉ์ธ์ ๋๋ค.
- hibernate.connection.driver_class - DB์ ๋๋ผ์ด๋ฒ ํด๋์ค์ ๋๋ค.
- hibernate.connection.url - ์ฐ๋ฆฌ DB์ utl. DB๋ฅผ ์ฒ์ ๊ตฌ์ฑํ ์์ ๋ถํฐ ๊ฐ์ ธ์ค์ค ์ ์์ต๋๋ค.
- hibernate.connection.username - DB ์ฌ์ฉ์ ์ด๋ฆ.
- hibernate.connection.password โ DB ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ.
- hibernate.hbm2ddl.auto - ํ ์ด๋ธ ์์ฑ ์ค์ . ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ ์ด๋ฏธ ์์ฑ๋ ๊ฒฝ์ฐ ์์ฑ๋์ง ์๊ณ ์ ๋ฐ์ดํธ๋ง ๋ฉ๋๋ค.
- hibernate.show_sql - DB ์ฟผ๋ฆฌ ํ์ ์ฌ๋ถ.
- hibernate.format_sql - DB ์ฟผ๋ฆฌ ํฌ๋งท ์ฌ๋ถ. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ํ ์ค์ ์๊ฒ ๋ฉ๋๋ค. ์ผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- hibernate.use_sql_comments - DB ์ฟผ๋ฆฌ์ ์ฃผ์์ ๋ฌ์์ต๋๋ค. ์ฝ์ ์ธ ๊ฒฝ์ฐ ํด๋น ์์ฒญ์ด ์ฝ์ ์ ํ์ด๋ผ๋ ์ค๋ช ์ด ์์ฒญ ์์ ๊ธฐ๋ก๋ฉ๋๋ค.
- hibernate.generate_statistics - ๋ก๊ทธ๋ฅผ ์์ฑํฉ๋๋ค. ๋ก๊น ์ ์ต๋๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ก๊ทธ๋ฅผ ์ฝ์ผ๋ฉด ORM์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
- hibernate.jdbc.batch_size โ ์ต๋ ๋ฐฐ์น ํฌ๊ธฐ.
- hibernate.jdbc.fetch_size โ ์ต๋ ๊ฐ์ ธ์ค๊ธฐ ํฌ๊ธฐ.
- hibernate.order_inserts - ๋์ ์ฝ์ ์ ํ์ฉํฉ๋๋ค.
- hibernate.order_updates - ๋์ ์ ๋ฐ์ดํธ๋ฅผ ํ์ฉํฉ๋๋ค.
- hibernate.jdbc.batch_versioned_data - ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค. DBMS๋ฅผ ์ดํด๋ณด์ธ์. ๋ชจ๋ ์ฌ๋์ด ์ด๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค.
- ๋งคํ ํด๋์ค - ์ํฐํฐ์ธ ํด๋์ค์ ๋๋ค. ๋ชจ๋ ๊ฒ์ ๋์ดํด์ผํฉ๋๋ค.
-
์ด์ ์ฐ๋ฆฌ์ ๋ณธ์ง์ด ๊ฒฐ์ ๋์ด์ผ ํฉ๋๋ค. ์ง์์ฑ ํญ์์ ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ:
-
๋ํ ํ ๋น ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
๊ฒฐ๊ณผ: ์ผ๋์ผ ๋งคํ์ ์ํํ์ต๋๋ค. ๋ณธ ์๋ฃ๋ ์ฐธ๊ณ ์ฉ์ผ๋ก๋ง ์ ๊ณต๋๋ฉฐ ์์ธํ ๋ด์ฉ์ ์ฐธ๊ณ ์๋ฃ์ ๋์ ์์ต๋๋ค.
์ผ๋๋ค ๊ด๊ณ
์ฌ๊ธฐ ์ ์ง์ ๋งํฌ๋ฅผ ๊ฑธ์ด์ฃผ์ธ์ . ์ด๋ฏธ ๋๋ฌด ๊ธธ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๊ธฐ์ฌ์ ์ฝ๋๋ฅผ ๊ฒ์ํ์ง ์๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ GitHub์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ดํด๋ด ๋๋ค.-
์ด๊ธฐํ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๊ฒฐ๊ณผ ๋ค์์ ์ป์ต๋๋ค.
์์ ํ์ ์ฐจ์ด์ ์ด ๋๊ปด์ง์๋์?
-
๋ํ:
์ผ๋๋ค ๊ด๊ณ - ํ ๋ช ์ ์ ์๊ฐ ์ฌ๋ฌ ๊ถ์ ์ฑ ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ผ์ชฝ ์ํฐํฐ๋ ํ๋ ์ด์์ ์ค๋ฅธ์ชฝ ์ํฐํฐ์ ํด๋นํฉ๋๋ค.
-
๋งคํ์ ์ฐจ์ด์ ์ ์ฃผ์๊ณผ ํ๋์ ์์ต๋๋ค.
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๋ ์๋ฐฉํฅ ํต์ ์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅธ๋ค๋ ์ ์ ๊ฐ์กฐํด์ผ ํฉ๋๋ค. ๊ทธ์๊ฒ ์ด๊ฒ์ ๋ ๊ฐ์ง ๋ค๋ฅธ ์ฐ๊ฒฐ์ ๋๋ค. ํ๋๋ ํ ๋ฐฉํฅ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๋ฐ๋ ๋ฐฉํฅ์ ๋๋ค.
-
hibernate.cfg.xml ์๋ ํฌ๊ฒ ๋ณ๊ฒฝ๋ ์ฌํญ์ด ์์ต๋๋ค .
-
๊ณ ์ง:
๋ค๋์ผ ๊ด๊ณ
๋ค๋์ผ์ ์ผ๋๋ค์ ๋ฏธ๋ฌ ์ด๋ฏธ์ง์ด๋ฏ๋ก ์ฐจ์ด๊ฐ ๊ฑฐ์ ์์ต๋๋ค. ์ฌ๊ธฐ ์ ์ง์ ๋งํฌ๋ฅผ ๊ฑธ์ด์ฃผ์ธ์ .-
์ด๊ธฐํ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
-
๋ํ:
-
๋งคํ์ ์ฐจ์ด์ ์ ์ฃผ์๊ณผ ํ๋์ ์์ต๋๋ค.
Author ํด๋์ค ์๋ Book ํด๋์ค ๋ก ์ด๋๋์์ผ๋ฏ๋ก ๋ ์ด์ ์ธํธ๊ฐ ์์ต๋๋ค .
-
๊ณ ์ง:
๋ค๋๋ค ๊ด๊ณ
๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๊ด๊ณ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค. ํ์์ ์ธ์ค์ ๋ชจ๋ ๊ท์น์ ๋ฐ๋ผ ์ด ๊ด๊ณ๋ ์ถ๊ฐ ํ ์ด๋ธ์ ํตํด ์์ฑ๋ฉ๋๋ค. ํ์ง๋ง ์ด ํ ์ด๋ธ์ ์ํฐํฐ๊ฐ ์๋๋๋ค. ํฅ๋ฏธ๋กญ์ง ์๋์? ์ด ๋ฅ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ ์ ์ง์ ๋งํฌ๋ฅผ ๊ฑธ์ด์ฃผ์ธ์ .-
์ด๊ธฐํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด๋ฉด ์ฌ๊ธฐ์ ์ถ๊ฐ HAS ํ ์ด๋ธ์ด ๋ํ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์๊ฐ ์ฑ ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ์ป์ต๋๋ค.
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๊ฒฐ๊ณผ ๋ค์ ํ ์ด๋ธ์ด ํ์๋ฉ๋๋ค.
-
๋ํ:
์ฐ๋ฆฌ์ ์์์๋ ํ ์ฑ ์ ์ฌ๋ฌ ๋ช ์ ์ ์๊ฐ ์์ ์ ์๊ณ , ํ ์ ์์ ์ฌ๋ฌ ๊ถ์ ์ฑ ์ด ์์ ์ ์๋ค๋ ์ฌ์ค์ด ๋ฐํ์ก์ต๋๋ค. ๊ฒน์น ์๋ ์์ต๋๋ค.
-
๋งคํ ํด๋์ค์๋ ํด๋์ค ๋ด์ ์ธํธ๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์์ ๋งํ๋ฏ์ด 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๊ณผ ๋งคํ์ ์ฌ์ฉํ ํ๋๋ฅผ ๋ํ๋ ๋๋ค.
-
hibernate.cfg.xml ์ ๋ค์ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋์์ต๋๋ค(๊ฐ ์ง์ ์ ๋ํด ์ DB๋ฅผ ์์ฑํ๋ค๋ ์ฌ์ค์ ๊ณ ๋ คํ์ง ์์์ต๋๋ค).
-
๊ณ ์ง:
๋ณต๋ช
๊ทธ๋์ ์ฐ๋ฆฌ๋ DB ๊ด๊ณ์ ์ ํ์ ํ๋ฉด์ ์ผ๋ก ์ดํด๋ณด๊ณ ์ด๋ฅผ ORM ๋ชจ๋ธ์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์๋์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฐ๊ฒฐ์ ๋ณด์ฌ์ฃผ๋ ํ ์คํธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ hibernate/jpa๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋์ต๋๋ค. ํด.์ ์ฉํ ๋งํฌ
- ์ฌ์ค ํ๋ก์ ํธ ์์ฒด๋
- ์ผ๋์ผ ์ง์
- ์ผ๋ ๋ค ๋ถ๊ธฐ
- ๋ค๋์ผ ๋ถ๊ธฐ
- ๋ค๋๋ค ๋ถ๊ธฐ
- ์ฝ์ด
- ๊ทธ๋ฆฌ๊ณ ์ฝ์ด๋ณด์ธ์
GO TO FULL VERSION