Server๐Ÿงค/JPA

[JPA] Java Persistence API

yujindonut 2023. 6. 12. 19:31
728x90

JPA ๊ฐœ์š”

Persistence 

Java ๊ฐ์ฒด(์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ)๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ๊ฐ์ฒด์˜ ์˜์†์„ฑ์„ ๋ณด์žฅํ•จ

 

Java Persistence API

  • Object-Relational Mapping(ORM) ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ Java ํ‘œ์ค€ API
  • Entity๋กœ ์ •์˜๋œ Java ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์‚ฌ์ด์˜ mapping ๋ฐฉ๋ฒ•์„ ์„ค์ •(annotation ์ด์šฉ)
  • ์„ค์ •๋œ Mapping์— ๋”ฐ๋ผ Java๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅ, ์ˆ˜์ •, ์‚ญ์ œ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ๋Š” Interface ์ œ๊ณต -> EntityManager
  • JDBC API๋‚˜ Data Mapper (ex: MyBatis)์˜ ๋Œ€์•ˆ
    • Java ์ค‘์‹ฌ์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

Persistence Provider (JPA Provider)

  • JPA์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ex) Hibernate, DataNucleus, EclipseLink ๋“ฑ
  • SQL๋ฌธ ์ž๋™ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

 


๊ตฌ์„ฑ์š”์†Œ

Entity

ORM์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์†์ ์œผ๋กœ ์ €์žฅ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด

 

  • ์˜์†์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” POJO๊ฐ์ฒด(Plain Old Java Object)
    • POJO๋ž€?
      • ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์›๋ฆฌ์— ์ถฉ์‹คํ•˜๋ฉด์„œ ํ™˜๊ฒฝ๊ณผ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์žฌํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•œ POJO์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ๋กœ์ง๊ณผ ๊ธฐ๋Šฅ์„ ๋‹ด์•„ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์กฐ๊ฑด
        • ํŠน์ • ๊ทœ์•ฝ์— ์ข…์†๋˜์ง€ ์•Š๋Š”๋‹ค. (์ž๋ฐ” ์–ธ์–ด๊ณผ ๊ผญ ํ•„์š”ํ•œ API ์™ธ์—๋Š” ์ข…์†๋˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค).
        • ํŠน์ • ํ™˜๊ฒฝ์— ์ข…์†๋˜์ง€ ์•Š๋Š”๋‹ค. (ํŠน์ • ๊ธฐ์—…์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ์„œ๋ฒ„์—์„œ๋งŒ ๋™์ž‘๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ผ๋ฉด POJO๋ผ ํ•  ์ˆ˜ ์—†๋‹ค. HttpServletRequest, HttpSession, ์บ์‹œ์— ๊ด€๋ จ๋œ API ๋“ฑ์ด ๋“ฑ์žฅํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.)
        • ๊ฐ์ฒด์ง€ํ–ฅ์  ์›๋ฆฌ์— ์ถฉ์‹คํ•ด์•ผํ•œ๋‹ค. 
      • ์Šคํ”„๋ง์„ ์ด์šฉํ•˜๋ฉด POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์žฅ์ ์„ ๊ทธ๋Œ€๋กœ ์‚ด๋ ค์„œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ๋กœ์ง์„ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ POJO๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ , ๋™์‹œ์— ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์˜ ๊ฐ์ข… ์„œ๋น„์Šค์™€ ๊ธฐ์ˆ ์ ์ธ ํ•„์š”๋ฅผ POJO๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ฝ”๋“œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Entity ํด๋ž˜์Šค ๋‚ด์—์„œ annotation์„ ์ด์šฉํ•˜์—ฌ ORM ์„ค์ • ๊ฐ€๋Šฅ
  • Entity Manager์— ์˜ํ•ด ์˜์†์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋‹จ์œ„ ๊ฐ์ฒด

 

ORM (Object-Relational Mapping) ์„ค์ •

Entity์™€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์‚ฌ์ด์˜ mapping ๋ฐฉ๋ฒ•์„ ์ •์˜

Annotation ๋˜๋Š” XML ์ด์šฉ

 

Entity Manager 

Entity์— ๋Œ€ํ•œ CRUD(Create, Read, Update, Delete) ๊ธฐ๋Šฅ์‹คํ–‰

 

  • Entity์˜ ์ƒ๋ช…์ฃผ๊ธฐ (life-cycle)๋ฅผ ๊ด€๋ฆฌ
    • Entity๋“ค์„ ์˜์† ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ์˜์†์ ์ธ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•จ
    • ์˜์† ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ, ๊ฐฑ์‹ , ์‚ญ์ œ ์‹คํ–‰
      • ํŠธ๋žœ์žญ์…˜ ์™„๋ฃŒ์‹œ ์˜์† ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ๊ฐ„์— ๋™๊ธฐํ™” ์‹คํ–‰
  • Entity ๊ฒ€์ƒ‰
    • SQL ์งˆ์˜ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰
    • ์งˆ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์˜์† ๊ฐ์ฒด ์ƒ์„ฑ
  • ์ƒํƒœ ์ „์ด
    • new
      • ์˜์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ ๊ฐ์ฒด ์ƒํƒœ
    • persisted
      • ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ
    • managed
      • ์˜์† ์ปจํ…์ŠคํŠธ์— ์†ํ•˜์—ฌ ์˜์†์„ฑ์„ ๊ฐ–๋„๋ก ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
      • DBํ…Œ์ด๋ธ”์˜ ํŠน์ • ํ–‰์— ๋Œ€์‘๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง
    • detached 
      • ์˜์†์ปจํ…์ŠคํŠธ๋ฅผ ๋ฒ—์–ด๋‚˜์„œ ์˜์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๋Š” ์ƒํƒœ
      • ํ…Œ์ด๋ธ”๊ณผ ๋Œ€์‘๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜, ๋” ์ด์ƒ DB์™€ ๋™๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Œ
    • removed
      • ์˜์† ์ปจํ…์ŠคํŠธ์—์„œ ์‚ญ์ œ๋œ ์ƒํƒœ
      • ๋ฐ์ดํ„ฐ๋“ค์ด ํ…Œ์ด๋ธ”์—์„œ ์‚ญ์ œ๋จ

 

 

Java Persistence Query Language(JPQL)

SQL๊ณผ ์œ ์‚ฌํ•œ ์งˆ์˜ ์–ธ์–ด

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ entity๋“ค์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰, ์ˆ˜์ •, ์‚ญ์ œ ์‹คํ–‰

 

Criteria API

Java code(method)๋ฅผ ์ด์šฉํ•œ ์งˆ์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ œ๊ณต

 

 

728x90