๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ๋ฐฑ์—”๋“œ/SpringBoot

[์Šคํ”„๋ง๋ถ€ํŠธ ํ€ต์Šคํƒ€ํŠธ] ch.4 JPA API

by OR15A 2023. 11. 23.
persistence.xml
EntityManagerFactory
EntityManager

 

โ–ถJPA ๊ฐœ๋…

โ–ทJPA ๊ฐœ๋…

  • ORM : ๊ฐ์ฒด-๊ด€๊ณ„-๋งคํ•‘์˜ ์•ฝ์ž. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์ž๋™ํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ (Object-Relational-Mapping)
  • JPA : ORM๋“ค์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‘œ์ค€ํ™”์‹œํ‚จ ๊ฒƒ(Java Persistence API)
  • ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA : ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ ์ด๋Ÿฐ JPA๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ. SpringData์˜ ํ•˜์œ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, XML ์„ค์ •์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋จ.

โ€‹

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๊ธฐ์ˆ 
SQL์„ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ 
SQL์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๊ธฐ์ˆ 
SQL์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ XMLํŒŒ์ผ์— ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•จ
ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ SQL์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์‹ ๊ฒฝ์“ธ ํ•„์š” ์—†์Œ
RDB → OOP
ํด๋ž˜์Šค → DB
ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•  ์ž๋ฐ”ํด๋ž˜์Šค(DTO)๊ฐ€ ํ•„์š”,
๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ SQL ๊ตฌ๋ฌธ๋“ค์ด ํ•„์š”ํ•จ.
DTO๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๋ฅผ DB๊ฐ€ ์•„๋‹Œ, java.util.Map๊ฐ™์€ ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋….
์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๊ด€๋ฆฌ ์ž์ฒด๊ฐ€ ์‰ฌ์›Œ์ง
์š”๊ตฌ์‚ฌํ•ญ ์ถ”๊ฐ€ ์‹œ ํ…Œ์ด๋ธ” ์ˆ˜์ •, ํด๋ž˜์Šค ์ˆ˜์ •, SQL๋ณ€๊ฒฝ์œผ๋กœ XMLํŒŒ์ผ ์ˆ˜์ •.
์š”๊ตฌ์‚ฌํ•ญ ์ถ”๊ฐ€ ์‹œ ํด๋ž˜์Šค์— ๋ณ€์ˆ˜๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ
  • JDBC : Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ ๊ฐ„์˜ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค ๋ฐฉ๋ฒ•์„ ์ œ๊ณต. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, SQL ์ฟผ๋ฆฌ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•จ.(์ €์ˆ˜์ค€์˜ SQL์ž‘์—… ์ฒ˜๋ฆฌ)
  • JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์‹ค์ œ๋กœ JPA๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ๋™์ž‘ํ•จ. ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ๋Š” ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋ฅผ JPA ๊ตฌํ˜„์ฒด๋กœ ์ด์šฉํ•จ.
  • JPA : Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC์˜ ๋ณต์žกํ•œ ์ ˆ์ฐจ๋ฅผ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์คŒ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๋™์— ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ + SQL ์ œ๊ณต) ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ„์˜ ๋งคํ•‘์„ ์ค‘์‹ฌ์œผ๋กœํ•œ ๊ณ ์ˆ˜์ค€์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต

โ€‹โ€‹

โ–ทJPA ํ€ต์Šคํƒ€ํŠธ

  • Hibernate : Hibernate๋Š” Java์—์„œ ์‚ฌ์šฉํ•˜๋Š” ORM (Object-Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜
  • H2 : ๊ฒฝ๋Ÿ‰์˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(RDBMS)
  • H2์™€ Hibernate๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ด๋ฉฐ, H2๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์ด๊ณ  Hibernate๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • H2 ์„ค์น˜ ํด๋” > bin ํด๋” > h2w.bat : H2๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์ฝ˜์†” (์ž‘์„ฑ๋‚ด์šฉ p.179)

โ€‹

  • ์—”ํ‹ฐํ‹ฐ : ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค
  • ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘์— ์‚ฌ์šฉ๋˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜
@Entity
@Entity๊ฐ€ ์„ค์ •๋œ ํด๋ž˜์Šค = ์—”ํ‹ฐํ‹ฐ
๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•จ
@Table
์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„๊ณผ ๋งคํ•‘๋  ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ, name ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘.
@Id
ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋งคํ•‘
์—”ํ‹ฐํ‹ฐ ํ•„์ˆ˜ ์• ๋„ˆํ…Œ์ด์…˜. @Id์—†๋Š” ์—”ํ‹ฐํ‹ฐ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
@GeneratedValue
@Id๊ฐ€ ์„ ์–ธ๋œ ํ•„๋“œ์— ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์„ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•จ
  • JPA ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ : META_INF ํด๋” > persistence.xml
  • persistence.xml : ์ด ํŒŒ์ผ์— ์˜์†์„ฑ ์œ ๋‹›(JPA๊ฐ€ ์—ฐ๋™ํ•  DB์ •๋ณด ๋“ค์–ด์žˆ์Œ)์ด ์„ค์ •๋˜์–ด ์žˆ์Œ
  • ์˜์†์„ฑ ์œ ๋‹›์—์„œ ์ค‘์š”ํ•œ ์„ค์ • : hibernate.dialect ์†์„ฑ. JPA ๊ตฌํ˜„์ฒด๊ฐ€ ์‚ฌ์šฉํ•  Dialectํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•จ. (์ด ์†์„ฑ์„ H2Dialect ํด๋ž˜์Šค๋กœ ์„ค์ •ํ•˜๋ฉด H2์šฉ SQL์ด ๋งŒ๋“ค์–ด์ง€๊ณ , OracleDialect๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ค๋ผํด์šฉ SQL์ด ๋งŒ๋“ค์–ด์ง)
  • ํด๋ž˜์Šค ๋ณ€์ˆ˜ ์ˆœ์„œ /= ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ์ˆœ์„œ

โ€‹

โ€‹

โ€‹

โ€‹

โ–ถJPA ์„ค์ •

โ–ท์˜์†์„ฑ ์œ ๋‹› ์„ค์ •

  • persistence.xml ํŒŒ์ผ๋กœ ๋ณต์žกํ•œ ํ™˜๊ฒฝ์„ค์ •์„ ๊ด€๋ฆฌํ•จ
  • persistence.xml ํŒŒ์ผ : <persistence>๊ฐ€ ๋ฃจํŠธ, <persistence-unit>์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ฐ€์ง.

โ€‹

โ‘ ์˜์†์„ฑ ์œ ๋‹› ์ด๋ฆ„ ์„ค์ •

  • ์˜์†์„ฑ ์œ ๋‹›์€ ์—ฐ๋™ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹น ํ•˜๋‚˜ ์”ฉ ์„ค์ •ํ•จ. <persistence-unit> ์—ฌ๋Ÿฌ ๊ฐœ ๋“ฑ๋ก ์‹œ name ์ง€์ •ํ•ด์•ผํ•จ
  • ์˜์†์„ฑ ์œ ๋‹›์„ ์„ค์ •ํ•˜๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์˜์†์„ฑ ์œ ๋‹› ์„ค์ •์„ ๋กœ๋”ฉํ•ด์„œ EntityManagerFactory ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ → ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ JPA๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ EntityManager ๊ฐ์ฒด๋ฅผ ์–ป์–ด๋ƒ„

โ€‹โ‘ก์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๋“ฑ๋ก

  • ์˜์†์„ฑ ์œ ๋‹› ์„ค์ •์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋“ฑ๋ก๋˜๋Š” ์ •๋ณด๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๋ชฉ๋ก
  • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ˆœ๊ฐ„ ์ž๋™์œผ๋กœ persistence.xml์— ์—”ํ‹ฐํ‹ฐํด๋ž˜์Šค๊ฐ€ ๋“ฑ๋ก๋จ

โ€‹โ‘ข๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •

javax.persistence.jdbc.driver
JDBC ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค
javax.persistence.jdbc.user
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„์ด๋””
javax.persistence.jdbc.password
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ
javax.persistence.jdbc.url
JDBC URL ์ •๋ณด

โ‘ฃDialect ํด๋ž˜์Šค ์„ค์ •

  • JPA๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ตœ์ ํ™”๋œ SQL์„ ์ƒ์„ฑํ•จ
  • ์–ด๋–ค Dialect๊ฐ€ ์„ค์ •๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ƒ์„ฑ๋˜๋Š” SQL์ด ๋‹ฌ๋ผ์ง

โ€‹โ‘คJPA๊ตฌํ˜„์ฒด ์„ค์ •

  • JPA๋Š” ORMํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ถˆ๊ณผํ•˜๋ฏ€๋กœ, ์‹ค์งˆ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  JPA๊ตฌํ˜„์ฒด์— ๋Œ€ํ•œ ์„ค์ •์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•จ
hibernate.show_sql
Hibernate๊ฐ€ ์‹คํ–‰ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •
hibernate.format_sql
์ถœ๋ ฅ๋œ SQL ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ํฌ๋งทํŒ…ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •
hibernate.id.new_generator_mappings
์ด ์„ค์ •์„ true๋กœ ์ง€์ •ํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ‚ค ์ƒ์„ฑ ์ „๋žต ๋งคํ•‘์„ ์‚ฌ์šฉ
hibernate.hbm2ddl.auto
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ ๊ด€๋ จ ํ”„๋กœํผํ‹ฐ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์˜ํ–ฅ์„ ๋ฏธ์นจ
create, update, validate, create-drop, none

โ€‹

โ–ท์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ ์„ค์ •

  • @Entity : ์ž๋ฐ”ํด๋ž˜์Šค๋ฅผ JPA๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•จ
  • @Id : ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” PK์ง€์ •
  • @Table : ์—”ํ‹ฐํ‹ฐ์ด๋ฆ„/=ํ…Œ์ด๋ธ” ์ผ ๋•Œ ์‚ฌ์šฉํ•จ. ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์ •ํ™•ํžˆ ์ง€์ •ํ•จ
  • @Column : ์—”ํ‹ฐํ‹ฐ์˜ ๋ณ€์ˆ˜์™€ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ์„ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉํ•จ. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ€์ˆ˜์ด๋ฆ„/=์นผ๋Ÿผ์ด๋ฆ„ ์ผ ๋•Œ ์‚ฌ์šฉํ•จ.
  • ์ง€์›ํ•˜๋Š” ์†์„ฑ : name, unique, nullable, insertable, updatable, columnDefinition. percision, scale
  • @Temporal : java.util.Dateํƒ€์ž…์˜ ๋‚ ์งœ๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉํ•จ. TempotalType์„ ์ด์šฉํ•˜์—ฌ์„œ ๋‚ ์งœ/์‹œ๊ฐ„/๋‚ ์งœ+์‹œ๊ฐ„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Œ
  • @Transient : ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๋‚ด์˜ ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ์˜์†์„ฑ ํ•„๋“œ์—์„œ ์ œ์™ธํ•  ๋•Œ ์‚ฌ์šฉํ•จ. ex) ํŒŒ์ƒ์†์„ฑ

โ€‹โ€‹

โ–ท์‹๋ณ„์ž ๊ฐ’ ์ž๋™์ฆ๊ฐ€

  • @GeneratedValue : ์‹๋ณ„์ž ํ•„๋“œ์— ์ž๋™์œผ๋กœ ์ฆ๊ฐ€๋œ ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ
@GeneratedValue ์†์„ฑ
โ€‹
strategy
์ž๋™์ƒ์„ฑ์ „๋žต
GenerationType.TABLE
โ€‹
โ€‹
GenerationType.SEQUENCE
โ€‹
โ€‹
GenerationType.IDENTITY
โ€‹
โ€‹
GenerationType.AUTO
generator
์ด๋ฏธ ์ƒ์„ฑ๋œ ํ‚ค ์ƒ์„ฑ๊ธฐ๋ฅผ ์ฐธ์กฐ
โ€‹
  • ์‹œํ€€์Šค ์ „๋žต ์‚ฌ์šฉํ•˜๊ธฐ : ํด๋ž˜์Šค ์„ ์–ธ๋ถ€์— @SequenceGenerator ์ถ”๊ฐ€

โ€‹โ€‹

โ€‹

โ€‹

โ€‹

โ–ถJPA API

โ–ทEMF์™€ EM

โ‘ persistence.xml ํŒŒ์ผ ์„ค์ • : Persistence Unit์„ ์ •์˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด, ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์œ„์น˜, JPA ์†์„ฑ ๋“ฑ์„ ์ง€์ •

โ‘กEntityManagerFactory ์ƒ์„ฑ : persistence.xml ํŒŒ์ผ์— ์ •์˜๋œ Persistence Unit ์„ค์ •์„ ๋ฐ”ํƒ•์œผ๋กœ EntityManagerFactory ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ. (์ด ๊ฐ์ฒด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ)โ€‹

โ‘ขEntityManager ์ƒ์„ฑ : EntityManagerFactory๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ EntityManager๋ฅผ ์ƒ์„ฑํ•จ. (EntityManager๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  JPA ์ž‘์—…์„ ์ˆ˜ํ–‰)

โ‘ฃEntityManager ์‚ฌ์šฉ : EntityManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ์˜ CRUD ์ž‘์—…์„ ์ˆ˜ํ–‰. (EntityManager๋Š” JPA์˜ ํ•ต์‹ฌ ๊ฐ์ฒด๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•˜๋ฉฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌ)

โ€‹

  • EntityManager๊ฐ€ ์ œ๊ณตํ•˜๋Š” CRUD๊ธฐ๋Šฅ์˜ ๋ฉ”์„œ๋“œ
persist(Object entity)
INSERT, ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†ํ™”
merge(Object entity)
UPDATE, ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†ํ™”
remove(Object entity)
DELETE, ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ œ๊ฑฐ
find(Class<T> entityClass, Object pk)
SELECT ONE, ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฒ€์ƒ‰
createQuery(String ipql, Class<T> resultClass)
SELECT LIST, JPQL์— ํ•ด๋‹นํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰ํ•จ

โ€‹

โ–ท์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์—”ํ‹ฐํ‹ฐ ์ƒํƒœ

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ : ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์ผ์ข…์˜ ์ปจํ…Œ์ด๋„ˆ. ๋…ผ๋ฆฌ์ ์ธ ๊ฐœ๋…. EntityManager๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง. EntityManager๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ. EntityManager์™€ ๋™์ผํ•œ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋ก๋œ ์—”ํ‹ฐํ‹ฐ๋Š” EntityManager๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋จ
  • ์ƒํƒœ : ๋น„์˜์†(New), ์˜์†(Marged), ์ค€์˜์†(Detached), ์‚ญ์ œ(Removed)

โ€‹

์—”ํ‹ฐํ‹ฐ์˜ ์ƒํƒœ

๋น„์˜์† ์ƒํƒœ
์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑํ–ˆ์„ ๋ฟ, ์•„์ง ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•˜์ง€ ์•Š์€ ์ƒํƒœ
 
์˜์† ์ƒํƒœ
EntityManager๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ
(find()๋ฅผ ํ†ตํ•ด์„œ๋„ ๊ฐ€๋Šฅํ•จ. ์กฐํšŒํ•˜๊ณ ์ž ํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—†๋‹ค๋ฉด DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ)
EntityManager์˜ persist() ์‚ฌ์šฉ
โ€‹
+ find()
โ€‹
์ค€์˜์† ์ƒํƒœ
ํ•œ ๋ฒˆ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋“ค์–ด๊ฐ„ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์–ด๋–ค ์ด์œ ์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฒ—์–ด๋‚œ ์ƒํƒœ
(๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์—) ๊ฐ’์„ ์ˆ˜์ •ํ•ด๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ๋ชปํ•จ
๋ฉ”๋ชจ๋ฆฌ์—์„œ ์™„์ „ ์‚ฌ๋ผ์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— merge()๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜๋  ์ˆ˜ ์žˆ์Œ
EntityManager์˜ detach(), clear(), close()๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ
์‚ญ์ œ ์ƒํƒœ
์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ๋„ ์ œ๊ฑฐ๋˜๊ณ  ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋„ ์‚ญ์ œ๋œ ์ƒํƒœ
remove()๋ฅผ ์ด์šฉํ•ด์„œ ์‚ญ์ œ
  • EntityManager์˜ persist()๋ฅผ ํ†ตํ•ด ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋กํ•˜๋ฉด ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ์— ํ•ด๋‹นํ•˜๋Š” INSERT๊ฐ€ ์‹คํ–‰๋จ.
  • ๊ทธ๋Ÿฐ๋ฐ persist()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค๊ณ  ํ•ด์„œ JPA๊ฐ€ ๊ณง๋ฐ”๋กœ ํ…Œ์ด๋ธ”์— INSERT๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Œ.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์— 1์ฐจ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ. 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ๋Š” EntityTransaction์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•  ๋•Œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋จ
  • ํ”Œ๋Ÿฌ์‹œ(Flush) : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •

โ€‹

โ€‹

โ–ท์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ SQL์ €์žฅ์†Œ

์—”ํ‹ฐํ‹ฐ ์ €์žฅํ•˜๊ธฐ

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” [1์ฐจ ์บ์‹œ], [SQL ์ €์žฅ์†Œ]๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋“ฑ๋ก๋˜๋ฉด 1์ฐจ ์บ์‹œ์—๋Š” ์—”ํ‹ฐํ‹ฐ, SQL์ €์žฅ์†Œ์—๋Š” SQL๊ตฌ๋ฌธ๋“ค์ด ์ €์žฅ๋จ
  • commit()๋ฉ”์„œ๋“œ๋กœ ํŠธ๋žœ์ ์…˜์„ ์ข…๋ฃŒํ•˜๋ฉด SQL ์ €์žฅ์†Œ์— ์ €์žฅ๋˜์—ˆ๋˜ ๋ชจ๋“  SQL์ด ํ•œ๊บผ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „์†ก๋จ

โ€‹

์—”ํ‹ฐํ‹ฐ ์ˆ˜์ •๊ณผ ์Šค๋ƒ…์ƒท

  • ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ •์„ ์œ„ํ•ด์„œ๋Š” ์ˆ˜์ •ํ•  ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์žˆ์–ด์•ผ ํ•จ(์—†์œผ๋ฉด ์˜ˆ์™ธ)
  • ์Šค๋ƒ…์ƒท : JPA๋Š” ๊ฒ€์ƒ‰๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•  ๋–„ ์—”ํ‹ฐํ‹ฐ์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ๋ณ„๋„์˜ ์ปฌ๋ Œ์…˜์— ์ €์žฅํ•จ
  • ํŠธ๋žœ์žญ์…˜์— ์ข…๋ฃŒ๋  ๋•Œ ์Šค๋ƒ…์ƒท์— ์ €์žฅ๋œ ์›๋ž˜ ์—”ํ‹ฐํ‹ฐ VS 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ด์š”ํ•ด์„œ UPDATE๋งŒ๋“ฆ
  • ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ •์—์„œ JPA์˜ ๊ธฐ๋ณธ ์ „๋žต์€ ๋ชจ๋“  ํ•„๋“œ ์ˆ˜์ •(์ˆ˜์ • ์ฟผ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์•„์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

โ€‹

์—”ํ‹ฐํ‹ฐ ์‚ญ์ œํ•˜๊ธฐ

  • ์ˆ˜์ •๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์‚ญ์ œํ•  ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒํ•จ. ์‚ญ์ œ์ „ ์กฐํšŒ ํ•„์ˆ˜

โ€‹

๋ชฉ๋ก ๊ฒ€์ƒ‰๊ณผ JPQL

  • ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JPQL(JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ณ„๋„์˜ ์ฟผ๋ฆฌ ๋ช…๋ น)๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ
  • ๊ฒ€์ƒ‰ ๋Œ€์ƒ์ด ํ…Œ์ด๋ธ”์ด ์•„๋‹ˆ๋ผ ์—”ํ‹ฐํ‹ฐ์ž„.
  • ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„๊ณผ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•จ
  • JPAL๋กœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— SQL ์ €์žฅ์†Œ์— ์ €์žฅ๋˜์–ด์žˆ๋˜ ๋ชจ๋“  SQL ๊ตฌ๋ฌธ๋“ค์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „์†กํ•ด์•ผํ•จ(์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์กฐํšŒํ•˜์—ฌ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ)