0. ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ
www.inflearn.com/course/ORM-JPA-Basic/dashboard
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JPA์ ๊ธฐ๋ณธ ์ด๋ก ์ ํํํ๊ฒ ํ์ตํด์ ์ด๋ณด์๋ ์ค๋ฌด์์ ์์ ์๊ฒ JPA๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค., ๋ณธ ๊ฐ์๋ ์๋ฐ ๋ฐฑ์
www.inflearn.com
์ธํ๋ฐ์ ์๋ ๊ฐ์๋ฅผ ๋ณด๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค!
๋ชฉํ : ๊ฐ์ฒด์ ํ ์ด๋ธ ์ค๊ณ ๋งคํ
- ๊ฐ์ฒด์ ํ ์ด๋ธ์ ์ ๋๋ก ์ค๊ณํ๊ณ ๋งคํํ๋ ๋ฐฉ๋ฒ
- ๊ธฐ๋ณธ ํค์ ์ธ๋ ํค ๋งคํ
- 1:N, N:1, 1:1, N:M ๋งคํ
- ์ค๋ฌด ๋ ธํ์ฐ + ์ฑ๋ฅ ๊ณ ๋ ค
- JPA ๋ด๋ถ ๋์ ๋ฐฉ์ ์ดํดํ๊ธฐ
- JPA๊ฐ ์ธ์ , ์ด๋ค SQL์ ๋ง๋ค์ด ์คํํ๋์ง ์ดํด
JPA๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ ์ด๋ค ๋ฌธ์ ์ ์ด ์์๊ณ ์ด๋ค๊ฒ, ์ด๋ป๊ฒ ๊ฐ์ ๋์๋์ง ํ์ธ ํด ๋ณผ๊ฒ์ด๋ค.
SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ ๋ฌธ์ ์
ํ์ฌ
- ๋๋ถ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค.
- ๊ด๊ณํ DB ๋ฅผ ์ฌ์ฉํ๋ค. (NoSQL ๋ณด๋ค๋ ์์ง๊น์ง๋ ๊ด๊ณํ)
๊ฒฐ๋ก ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๊ด๊ณํ DB์ ๊ด๋ฆฌํด์ผํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก SQL ๋ฐ์ ๋ชจ๋ฅด๋ ๊ด๊ณํ DB๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด SQL๋ฅผ ๊ณ์ํด์ ์จ์ค์ผํ ํ๋ค -> ์ง๋ฃจํ๊ณ ๋ฌดํ ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ค
ํจ๋ฌ๋ค์์ ๋ถ์ผ์น
๊ฐ์ฒด vs ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
* ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๊ฐ์ฒด -> SQL ๋ณํ -> SQL -> RDB
SQL ๋ก ๋ณํํ๊ธฐ ์ํด ๊ฐ๋ฐ์๊ฐ ๊ฐ๊ฐ์ SQL๋ฌธ์ ์์ฑํ๋ ๋ ธ๊ฐ๋ค๋ฅผ ํ๋ค.
- ์ง์ ํ ์๋ฏธ์ ๊ณ์ธต ๋ถํ ์ด ์ด๋ ต๋ค.
- Entity๋ฅผ ์ ๋ขฐํ ์ ์๋ค.
ํด๋น ์ฟผ๋ฆฌ๊ฐ ์ด๋ค๊ฑธ ์กฐํํด์ ๊ฐ์ง๊ณ ์ค๋์ง ๋์ผ๋ก ํ์ธํ์ง ์๋ ์ด์ ์ ํํ๊ฒ ์๊ธฐ ์ด๋ ค์
- ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ฉํ ์ ์๋ค
๊ฐ์ฒด๋ฅผ ์กฐํํ ๋ ์กฐ๊ฑด์ ์ฃผ๊ณ ์ถ๋ค๋ฉด ํด๋น SQL๋ฅผ ๋ ์์ฑํด์ผ ํ๋ค.
* ๊ฐ์ฒด
์๋ฐ ์ปฌ๋ ์ ์์ ์กฐํ๋ฅผ ํ๋ค๋ฉด?
๊ฐ์ ์ฃผ์๊ฐ์ ๋ฐ๋ผ๋ณด๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฐํ ๊ฐ์ ๊ฐ๊ณ ์์ด Entity๋ฅผ ์ ๋ขฐํ ์ ์๋ค.
ํ์ง๋ง ๊ฐ์ฒด๋ต๊ฒ ๋ชจ๋ธ๋ง ํ ์๋ก ๋งคํ ์์ ๋ง ๋์ด๋๊ฒ ๋๋ค. -> ๊ทธ๋์ SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ํ ์ ๋ฐ์ ์์๋ค.
์ด๋ ๊ฒ ์๊ฒจ๋๊ฒ JAVA ์ง์์ ORM ๊ธฐ์ ํ์ค JPA ์ด๋ค.
ORM์ ๋ญ๊น?
ORM์ Object Relational Mapping ์ฆ, ๊ฐ์ฒด-๊ด๊ณ ๋งคํ์ ์ค์๋ง์ด๋ค. ๊ฐ์ฒด-๊ด๊ณ ๋งคํ์ ํ์ด์ ์ค๋ช
ํ์๋ฉด ์ฐ๋ฆฌ๊ฐ OOP(Object Oriented Programming)์์ ์ฐ์ด๋ ๊ฐ์ฒด๋ผ๋ ๊ฐ๋
์ ๊ตฌํํ ํด๋์ค์ RDB(Relational DataBase)์์ ์ฐ์ด๋ ๋ฐ์ดํฐ์ธ ํ
์ด๋ธ ์๋์ผ๋ก ๋งคํ(์ฐ๊ฒฐ)ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋ฌ๋ ํด๋์ค์ ํ
์ด๋ธ์ ์๋ก๊ฐ ๊ธฐ์กด๋ถํฐ ํธํ๊ฐ๋ฅ์ฑ์ ๋๊ณ ๋ง๋ค์ด์ง ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด๋ฅผ ORM์ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL๋ฌธ์ ์๋์ผ๋ก ์์ฑํ์ฌ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๋ค. ๋ฐ๋ผ์ ORM์ ์ด์ฉํ๋ฉด ๋ฐ๋ก SQL๋ฌธ์ ์งค ํ์์์ด ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ ์ ์๊ฒ ๋๋ค.
์ถ์ฒ: https://geonlee.tistory.com/207 [๋น ๋ฆฌ์ ํ์ ์ด์ ์ฌ]
ํ๋ก์ ํธ ์ธํ , ์ค์ต
0. h2 ์ค์น - ๊ฐ์DB
H2 Database Engine
H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2 MB jar file size Suppor
h2database.com
1. ์์กด์ฑ ์ค์
hibernate๋ฅผ ์์กด์ฑ์ ์ถ๊ฐํด์ค๊ฑด๋ฐ. ๋ณดํต JPA๋ Spring๊ณผ ์ฐ๋ํ์ฌ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
Dependency versions
docs.spring.io
์์ ์ฌ์ฉํ Spring ํ๋ก์ ํธ ๋ฒ์ ์ ๋ง์ถฐ hibernate๋ฅผ ๋ฒ์ ์ ์ฌ์ฉํ๋ค.
implementation 'org.hibernate:hibernate-entitymanager:5.4.30.Final'
implementation 'com.h2database:h2:1.4.200'
2. JPA ์ค์ - persistence.xml
- JPA ์ค์ ํ์ผ
- /META-INF/persistence.xml ( ํ์ค์์น )
- javax.persistence๋ก ์์ : JPA ํ์ค ์์ฑ
- hibernate๋ก ์์ : ํ์ด๋ฒ๋ค์ดํธ ์ ์ฉ ์์ฑ
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- ํ์ ์์ฑ -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!-- ์ต์
-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ -> dialect ์ ์ค์
- JPA๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ์ ํ์ง ์๋๋ค.
- ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ณตํ๋ SQL ๋ฌธ๋ฒ๊ณผ ํจ์๋ ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค.
- SQL ํ์ค์ ์งํค์ง ์๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง์ ๊ณ ์ ํ ๊ธฐ๋ฅ(๋ฐฉ์ธ)
JPA๋ฅผ ์ ์ฌ์ฉํด์ผ ํ๋๊ฑธ๊น?
1. ์์ฐ์ฑ
JPA์ ์ฟผ๋ฆฌ๊ฐ ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ฌ์์ ์ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์) ์ ์ฅ : jpa.persist(member)
์กฐํ : Member member = jpa.find(memberId) ๋ฑ๋ฑ ...
2. ์ ์ง๋ณด์
๊ธฐ์กด์๋ ํ๋ ๋ณ๊ฒฝ์ ๋ชจ๋ SQL์ ์์ ํด์ผ ํ๋ค. (์ผ์ ใ )
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋๋ง ์ถ๊ฐํ๋ฉด ๋๋ค SQL์ JPA๊ฐ ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค!
3. ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ
- ์์
JPA๊ฐ ์ ์ฅ์ ํ๊ฑฐ๋ ์กฐํ๋ฅผ ํ ๋ ์์์ ์กฐ์ธ์ ํ๊ฑฐ๋ ์ฟผ๋ฆด๋ฅด ๋ ๋ฆฐ๋ค.
- ์ฐ๊ด๊ด๊ณ, ๊ฐ์ฒด ๊ทธ๋ํ ํ์
์๋ฐ ์ปฌ๋ ์ ์ ๋ฃ๋๊ฒ ์ฒ๋ผ get์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ -> ๊ฐ์ฒด ๊ทธ๋ํ ํ์
์ฐ๊ด๊ด๊ณ(์ฐ๊ด๋์ด์๋ ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ)๋ฅผ ์ ์ฅํ๋๊ฒ ๋ํ set์ผ๋ก ์ ์ฅ -> ์ฐ๊ด๊ด๊ณ ์ ์ฅ
- ์ ๋ขฐํ ์ ์๋ ์ํฐํฐ, ๊ณ์ธต
์ง์ฐ๋ก๋ฉ์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ด์ ์์ ๋ก์ด ๊ฐ์ฒด ํ์์ด ๊ฐ๋ฅํ๋ค. ์ง์ ๊ฐ์ง๊ณ ์จ๊ฑฐ๊ธฐ ๋๋ฌธ์ ์ ๋ขฐํ ์ ์๋ค.
-> ๋์ผํ ํธ๋์ญ์ ์์ ์กฐํํ ์ํฐํฐ๋ ๊ฐ์์ ๋ณด์ฅ
4. JPA์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ
- 1์ฐจ ์บ์์ ๋์ผ์ฑ ๋ณด์ฅ
๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค. -> ๊ฐ์ ์กฐํ๋ฅผ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ณ ์จ๋ค. (๊ฒฐ๊ณผ์ ์ผ๋ก SQL 1๋ฒ ์คํ)
- ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
๋ฒํผ๋ง ๊ธฐ๋ฅ์ ๋งํ๋ค. ํธ๋์ญ์ ์ ์ปค๋ฐํ ๋๊น์ง INSERT SQL์ ๋ชจ์์ค๋ค -> JDBC BATCH SQL ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ๋ฒ์ SQL ์ ์ก
- ์ง์ฐ ๋ก๋ฉ / ์ฆ์ ๋ก๋ฉ
์ง์ฐ ๋ก๋ฉ : ๊ฐ์ฒด๊ฐ ์ค์ ์ฌ์ฉ๋ ๋ ๋ก๋ฉ
์ฆ์ ๋ก๋ฉ: JOIN SQL๋ก ํ๋ฒ์ ์ฐ๊ด๋ ๊ฐ์ฒด๊น์ง ๋ฏธ๋ฆฌ ์กฐํ
๊ทธ๋ผ JPA ์์์ JDBC๋ ์ด๋ป๊ฒ ์๋ ๋๋๊ฑธ๊น?
์ ํ๋ฆฌ์ผ์ด์ ์ด JPA์๊ฒ ๋ช ๋ น์ ๋ด๋ ค์ JDBC API๋ฅผ ์ฌ์ฉ ํ๋ค.
JPA๊ฐ ์ค๊ฐ์์ ๊ฐ์ฒด์ ๋ฐ๋ผ SQL๋ฌธ์ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ์ญํ ์ ํ๋ค.
JPA๋ ์ด๋ ๊ฒ ์๊ฒจ๋ฌ์ด์!
EJB(์๋ฐ ํ์ค) -> ํ์ด๋ฒ๋ค์ดํธ(์คํ ์์ค) -> JPA(์๋ฐ ํ์ค)
JPA๋ ์ด๋ ๊ฒ ๊ตฌ์ฑ๋์ด์์ด์!