JPA ๊ตฌํ์ฒด๋ก ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
hibernate-core
- ํ์ด๋ฒ๋ค์ดํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
hibernate-entitymanager
- ํ์ด๋ฒ๋ค์ดํธ๊ฐ JPA ๊ตฌํ์ฒด๋ก ๋์ํ๋๋ก JPA ํ์ค์ ๊ตฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
hibernate-jpa-2.1-api
- JPA 2.1 ํ์ค API๋ฅผ ๋ชจ๋ ๋ชจ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ฉ์ด๋ธ (Maven)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ๊ณผ ๋น๋ ๊ธฐ๋ฅ์ ์ ๊ณต
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ
- ๋ฉ์ด๋ธ์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ด๋ฆ
๊ณผ๋ฒ์
์ ๋ช ์ํ๋ฉด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ์๋์ผ๋ก ๋ด๋ ค๋ฐ๊ณ ๊ด๋ฆฌ
ํด์ค๋ค
- ๋ฉ์ด๋ธ์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋น๋ ๊ธฐ๋ฅ
- ๋ฉ์ด๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค
@Entity
- ์ด ํด๋์ค๋ฅผ ํ ์ด๋ธ๊ณผ ๋งคํํ๋ค๊ณ JPA์ ์๋ ค์ค๋ค
- ์ด๋ ๊ฒ
@Entity
๊ฐ ์ฌ์ฉ๋ ํด๋์ค๋ฅผ ์ํฐํฐ ํด๋์ค๋ผ๊ณ ํ๋ค
@Table
- ์ํฐํฐ ํด๋์ค์ ๋งคํํ ํ ์ด๋ธ ์ ๋ณด๋ฅผ ์๋ ค์ค๋ค
- ์ด ์ด๋
ธํ
์ด์
์ ์๋ตํ๋ฉด ํด๋์ค ์ด๋ฆ์ผ๋ก ๋งคํํ๋ค
- ์ ํํ๋ ์ํฐํฐ ์ด๋ฆ์ ์ฌ์ฉํ๋ค
@Id
- ์ํฐํฐ ํด๋์ค์ ํ๋๋ฅผ ๊ธฐ๋ณธ ํค(Primary Key) ์ ๋งคํํ๋ค
@Id
๊ฐ ์ฌ์ฉ๋ ํ๋๋ฅผ ์๋ณ์ ํ๋๋ผ ํ๋ค
@Column
- ํ๋๋ฅผ ์ปฌ๋ผ์ ๋งคํํ๋ค
- ๋งคํ ์ ๋ณด๊ฐ ์๋ ํ๋
- ๋งคํ ์ด๋ ธํ ์ด์ ์ ์๋ตํ๋ฉด ํ๋๋ช ์ ์ฌ์ฉํด์ ์ปฌ๋ผ๋ช ์ผ๋ก ๋งคํํ๋ค
- JPA๋ persistence.xml์ ์ฌ์ฉํด์ ํ์ํ ์ค์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ค
- ํด๋น ํ์ผ์ด
META-INF/persistence.xml
class path ๊ฒฝ๋ก์ ์์ผ๋ฉด ๋ณ๋ ์ค์ ์์ด JPA๊ฐ ์ธ์ํ ์ ์๋ค
- ํด๋น ํ์ผ์ด
- JPA ์ค์ ์
์์์ฑ ์ ๋ (persistence-unit)
์ด๋ผ๋ ๊ฒ๋ถํฐ ์์ํ๋๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์ฐ๊ฒฐ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น ํ๋์ ์์์ฑ ์ ๋์ ๋ฑ๋กํ๋ค- ์์์ฑ ์ ๋์๋ ๊ณ ์ ํ ์ด๋ฆ์ ๋ถ์ฌํด์ผ ํ๋ค
- ์ด๋ฆ์ด
javax.persistence
๋ก ์์ํ๋ ์์ฑ์JPA ํ์ค ์์ฑ
์ผ๋ก ํน์ฑ ๊ตฌํ์ฒด์ ์ข ์๋์ง ์๋๋ค- ๋ฐ๋ฉด
hibernate
๋ก ์์ํ๋ ์์ฑ์ํ์ด๋ฒ๋ค์ดํธ ์ ์ฉ ์์ฑ
์ด๋ฏ๋ก ํ์ด๋ฒ๋ค์ดํธ์์๋ง ์ฌ์ฉํ ์ ์๋ค
- ๋ฐ๋ฉด
- JPA๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ์์ ์ด์ง ์์ ๊ธฐ์ ์ด๋ผ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ค
- but, ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ณตํ๋ SQL ๋ฌธ๋ฒ๊ณผ ํจ์๊ฐ ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ๊ฐ๊ณ ์๋ ์ฐจ์ด์ ์์
๋ฐ์ดํฐ ํ์
- ๊ฐ๋ณ ๋ฌธ์ ํ์
์ผ๋ก MySQL์
VARCHAR
, ์ค๋ผํด์VARCHAR2
๋ฅผ ์ฌ์ฉํ๋ค
- ๊ฐ๋ณ ๋ฌธ์ ํ์
์ผ๋ก MySQL์
๋ค๋ฅธ ํจ์๋ช
- ๋ฌธ์์ด์ ์๋ฅด๋ ํจ์๋ก SQL ํ์ค์
SUBSTRING()
์ ์ฌ์ฉํ์ง๋ง, ์ค๋ผํด์SUBSTR()
์ ์ฌ์ฉํ๋ค
- ๋ฌธ์์ด์ ์๋ฅด๋ ํจ์๋ก SQL ํ์ค์
ํ์ด์ง ์ฒ๋ฆฌ
- MySQL์
LIMIT
์ ์์ํ์ง๋ง, ์ค๋ผํด์ROWNUM
์ ์ฌ์ฉํ๋ค
- MySQL์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ๊ฐ๊ณ ์๋ ์ฐจ์ด์ ์์
- ์ด์ฒ๋ผ SQL ํ์ค์ ์งํค์ง ์๊ฑฐ๋, ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง์ ๊ณ ์ ํ ๊ธฐ๋ฅ์ JPA์์๋
๋ฐฉ์ธ (Dialect)
์ด๋ผ ํ๋ค- ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ JPA ๊ตฌํ์ฒด๋ค์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค
- ๊ฐ๋ฐ์๋ JPA๊ฐ ์ ๊ณตํ๋ ํ์ค ๋ฌธ๋ฒ์ ๋ง์ถ์ด JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ณ , ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์กด์ ์ธ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ์ด ์ฒ๋ฆฌํด์ค๋ค
hibernate.show_sql
- ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์คํํ SQL์ ์ถ๋ ฅํ๋ค
hibernate.format_sql
- ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์คํํ SQL์ ์ถ๋ ฅํ ๋ ๋ณด๊ธฐ ์ฝ๊ฒ ์ ๋ ฌํ๋ค
hiberante.use_sql_comments
- ์ฟผ๋ฆฌ๋ฅผ ์ถ๋ ฅํ ๋ ์ฃผ์๋ ํจ๊ป ์ถ๋ ฅํ๋ค
hibernate.id.new_generator_mappings
- JPA ํ์ค์ ๋ง์ถ ์๋ก์ด ํค ์์ฑ ์ ๋ต์ ์ฌ์ฉํ๋ค
์ํฐํฐ ๋งค๋์ ์์ฑ ๊ณผ์ ๋ถ์
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์์ฑ
- JPA๋ฅผ ์์ํ๋ ค๋ฉด ์ฐ์ persistence.xml์ ์ค์ ์ ๋ณด๋ฅผ ์ฌ์ฉํด์
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ
๋ฅผ ์์ฑํด์ผ ํ๋ค- ์ด๋
Persistence
class๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด ํด๋์ค๋ ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํด์ JPA๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ค๋นํ๋ค
- ์ด๋
- persistence.xml์ ์ค์ ์ ๋ณด๋ฅผ ์ฝ์ด์ JPA๋ฅผ ๋์์ํค๊ธฐ ์ํ ๊ธฐ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , JPA ๊ตฌํ์ฒด์ ๋ฐ๋ผ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ปค๋ฅ์ ํ
๋ ์์ฑํ๋ฏ๋ก ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋น์ฉ์ ์์ฃผ ํฌ๋ค- ๋ฐ๋ผ์ ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์
๋ฑ ํ ๋ฒ๋ง ์์ฑ
ํ๊ณ๊ณต์
ํด์ ์ฌ์ฉํด์ผ ํ๋ค
- ๋ฐ๋ผ์ ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์
- JPA๋ฅผ ์์ํ๋ ค๋ฉด ์ฐ์ persistence.xml์ ์ค์ ์ ๋ณด๋ฅผ ์ฌ์ฉํด์
์ํฐํฐ ๋งค๋์ ์์ฑ
- ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์์ฑํ๋ค
- JPA์ ๊ธฐ๋ฅ ๋๋ถ๋ถ์
์ํฐํฐ ๋งค๋์
๊ฐ ์ ๊ณตํ๋ค- ๋ํ์ ์ผ๋ก ์ํฐํฐ ๋ฉ๋์ ๋ฅผ ์ฌ์ฉํด์ ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋ก/์์ /์ญ์ /์กฐํํ ์ ์๋ค
- ์ํฐํฐ ๋งค๋์ ๋ ๋ด๋ถ์ ๋ฐ์ดํฐ์์ค (๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ) ๋ฅผ ์ ์งํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๋ค
- ์ํฐํฐ ๋งค๋์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
๊ณผ ๋ฐ์ ํ ๊ด๊ณ๊ฐ ์์ผ๋ฏ๋ก
์ค๋ ๋ ๊ฐ
์๊ณต์
ํ๊ฑฐ๋์ฌ์ฌ์ฉ
ํ๋ฉด ์ ๋๋ค
์ข ๋ฃ
- ์ฌ์ฉ์ด ๋๋
์ํฐํฐ ๋งค๋์
๋ ๋ฐ๋์์ข ๋ฃ
ํด์ผ ํ๋ค - ์ ํ๋ฆฌ์ผ์ด์
์ ์ข
๋ฃํ ๋
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ
๋์ข ๋ฃ
ํด์ผ ํ๋ค
- ์ฌ์ฉ์ด ๋๋
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด ํญ์
ํธ๋์ญ์ ์
์์๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ
ํด์ผ ํ๋ค - ํธ๋์ญ์ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค
- ํธ๋์ญ์
์ ์์ํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์์
ํธ๋์ญ์ API
๋ฅผ ๋ฐ์์์ผ ํ๋ค - ํธ๋์ญ์
API๋ฅผ ์ฌ์ฉํด์ ๋น์ฆ๋์ค ๋ก์ง์ด ์ ์ ๋์ํ๋ฉด ํธ๋์ญ์
์
์ปค๋ฐ
ํ๊ณ , ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์๋กค๋ฐฑ
ํ๋ค
๋ฑ๋ก, ์์ , ์ญ์ , ์กฐํ ์์ ์ ์ํฐํฐ ๋งค๋์ (em)๋ฅผ ํตํด์ ์ํ๋๋ค
๋ฑ๋ก
- ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์
persist()
method์ ์ ์ฅํ ์ํฐํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค - JPA๋ INSERT SQL์ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค
- ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์
์์
- ์ํฐํฐ๋ฅผ ์์ ํ ํ์ ์์ ๋ด์ฉ์ ๋ฐ์ํ๋ ค๋ฉด em.update() ๊ฐ์ method๋ฅผ ํธ์ถํด์ผ ํ ๊ฒ ๊ฐ์๋ฐ, ๋จ์ํ ์ํฐํฐ์ ๊ฐ๋ง ๋ณ๊ฒฝํ๋ค
- why?
- JPA๋ ์ด๋ค ์ํฐํฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ์ถ์ ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์๋ค
- ๋ฐ๋ผ์ ์ํฐํฐ์ ๊ฐ๋ง ๋ณ๊ฒฝํ๋ฉด UPDATE SQL์ ์์ฑํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค
์ญ์
- ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์
remove()
method์ ์ญ์ ํ๋ ค๋ ์ํฐํฐ๋ฅผ ๋๊ฒจ์ค๋ค - JPA๋ DELETE SQL์ ์์ฑํด์ ์คํํ๋ค
- ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์
ํ ๊ฑด ์กฐํ
find()
method๋ ์กฐํํ ์ํฐํฐ ํ์ ๊ณผ@Id
๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค์ ๋งคํํ ์๋ณ์ ๊ฐ์ผ๋ก ์ํฐํฐ ํ๋๋ฅผ ์กฐํํ๋ ๊ฐ์ฅ ๋จ์ํ ์กฐํ method๋ค- ์ด method๋ฅผ ํธ์ถํ๋ฉด SELECT SQL์ ์์ฑํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฐ๊ณผ๋ฅผ ์กฐํํ๋ค
- ๊ทธ๋ฆฌ๊ณ ์กฐํํ ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก ์ํฐํฐ๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค
- ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ฒฐ๊ตญ
๊ฒ์ ์กฐ๊ฑด
์ด ํฌํจ๋ SQL์ ์ฌ์ฉํด์ผ ํ๋ค- JPA๋
JPQL (Java Persistence Query Language)
๋ผ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ก ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค
- JPA๋
- JPA๋ SQL์ ์ถ์ํํ
JPQL
์ด๋ผ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ ๊ณตํ๋ค- JPQL์ SQL๊ณผ ๋ฌธ๋ฒ์ด ๊ฑฐ์ ์ ์ฌํด์ SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค
- JPQL๊ณผ SQL์ ์ฐจ์ด์
- JPQL์
์ํฐํฐ ๊ฐ์ฒด
๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค- ์ฆ, ํด๋์ค์ ํ๋๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค
- SQL์
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ
์ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค
- JPQL์
- JPQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ ํ ์์ง ๋ชปํ๋ค
- JPA๋ JPQL์ ๋ถ์ํด์ ์ ์ ํ SQL์ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค