ORM & JPA

Jayongยท2025๋…„ 5์›” 11์ผ

JPA

๋ชฉ๋ก ๋ณด๊ธฐ
1/3
post-thumbnail

ORM(Object-Relational Mapping)์˜ ๊ฐœ๋…๊ณผ ์žฅ๋‹จ์  ๐ŸŽ

ORM(Object-Relation-Mapping)์ด๋ž€?

๐Ÿ“„ ์˜์†์„ฑ(Persistence)
๋ฐ์ดํ„ฐ๋“ค์ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์–ด๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ , ์–ด๋–ค ๊ณณ์— ์ €์žฅ๋˜๋Š” ๊ฐœ๋…


๐Ÿ“„JDBC (Java Database Connectivity)
Java์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ ๋ฐ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Java์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ž๋ฐ” API

โ†’ ORM์€ JDBC ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ณต์žกํ•จ์ด๋‚˜ ๋ฒˆ๊ฑฐ๋Ÿฌ์›€ ์—†์ด ๊ฐ„๋‹จํ•œ ์ž‘์—…๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™๋˜๋Š” ์‹œ์Šคํ…œ์„ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” Persistance Framework


๐Ÿ“„ ORM

  • ๊ฐ์ฒด์™€ DB์˜ ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ(Mapping) ์‹œ์ผœ RDB ํ…Œ์ด๋ธ”์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ 
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ์ฒด๋ฅผ RDB ํ…Œ์ด๋ธ”์— ์ž๋™์œผ๋กœ ์˜์†ํ™” ํ•ด์ฃผ๋Š” ๊ฐœ๋…
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉ
  • ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ฐ„์—๋Š” ๋ถˆ์ผ์น˜๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐ

Java์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ORM

  • JPA(Java Persistent API)
  • JPA ํ‘œ์ค€ ๋ช…์„ธ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด Hibernate

ORM์˜ ์žฅ๋‹จ์ 

์žฅ์ ๋‹จ์ 
์ง๊ด€์ ์ด๊ณ  ๊ฐ€๋…์„ฑ ์ข‹์€ ์ฝ”๋“œ์ž˜๋ชป ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋กœ ์ธํ•œ ์†๋„ ์ €ํ•˜
๊ฐ์ฒด ์ง€ํ–ฅ์  ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ์ƒ์‚ฐ์„ฑ ์ฆ๊ฐ€๋ณต์žกํ•œ Query๋ฌธ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€ โ†’ QueryDSL ์‚ฌ์šฉ
์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ์šฉ์ด์„ฑ ์ฆ๊ฐ€
DBMS์— ๋Œ€ํ•œ ์ข…์†์„ฑ ๊ฐ์†Œ

JPA์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ๊ณผ ํŠน์ง• ๐Ÿ

๐Ÿ“„JPA์˜ ๋“ฑ์žฅ๋ฐฐ๊ฒฝ

  • ๊ธฐ์กด JDBC API๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ์ง€๋ฃจํ•จ์ด ์กด์žฌ
    โ†’ SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ๋กœ ์ธํ•ด ๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฌธ์„ ์ฐพ์•„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋Ÿฌ์›€์ด ์กด์žฌ

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• DB์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜
    SQL ์ง€ํ–ฅ์ ์ธ ๊ฐœ๋ฐœ๋กœ ์ธํ•œ ๋ฌธ์ œ์ ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅ
    โ†’ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• DB์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ฐจ์ด๋กœ ์ธํ•ด ๊ฐ์ฒด์ง€ํ–ฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์ง€๋ชปํ•˜๊ณ , DB์— ์ข…์†์ ์ธ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ JPA

JPA (Java Persistence API)

  • Java์—์„œ ORM ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ
  • ORM ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ์ด๋ฉฐ, ๊ตฌํ˜„๋œ ํด๋ž˜์Šค์™€ ๋งคํ•‘์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

์™œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

  • ๋ฐ˜๋ณต์ ์ธ CRUD SQL์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ! โ†’ JPA๋Š” ๋งคํ•‘๋œ ๊ด€๊ณ„๋ฅผ ์ด์šฉํ•ด SQL์„ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋–ค SQL์ด ์‹คํ–‰๋ ์ง€ ์ƒ๊ฐ๋งŒํ•˜๊ณ  ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค.
    • ๋„ค์ดํ‹ฐ๋ธŒ SQL ์ œ๊ณต์œผ๋กœ ๊ด€๊ณ„๋งคํ•‘์ด ์–ด๋ ต๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ด์Šˆ๊ฐ€ ์šฐ๋ ค๋˜๋Š” ๊ฒฝ์šฐ SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • SQL ์ค‘์‹ฌ ๊ฐœ๋ฐœ โ†’ ๊ฐ์ฒด ์ค‘์‹ฌ ๊ฐœ๋ฐœ
    • ์ƒ์‚ฐ์„ฑ & ์œ ์ง€๋ณด์ˆ˜ ํ–ฅ์ƒ
  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• DB์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ
    - ์ƒ์†๊ด€๊ณ„๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›

JPA vs Hibernate vs Spring Data JPA

JPA

  • JPA๋Š” ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
  • ์ธํ„ฐํŽ˜์ด์Šค โ†’ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ํ•œ ๋ฐฉ๋ฒ•
  • ๋‹จ์ˆœํ•œ ๋ช…์„ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ์—†๋‹ค
package javax.persistence;

import ...

public interface EntityManager {

    public void persist(Object entity);

    public <T> T merge(T entity);

    public void remove(Object entity);

    public <T> T find(Class<T> entityClass, Object primaryKey);

    // More interface methods...
}

Hibernate

  • JPA์˜ ๊ตฌํ˜„์ฒด
  • javax.persistence.EntityManager ์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์œ„ ์‚ฌ์ง„์€ JPA์™€ Hibernate์˜ ์ƒ์† ๋ฐ ๊ตฌํ˜„๊ด€๊ณ„์ด๋‹ค.


Spring Data JPA

  • JPA๋ฅผ ์“ฐ๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋†“์€ ๋ชจ๋“ˆ
  • Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ JPA๋ฅผ ๋” ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.
  • JPA๋ฅผ ํ•œ ๋‹จ๊ณ„ ์ถ”์ƒํ™” ์‹œํ‚จ Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง
  • ์ •ํ•ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, Spring์ด ์•Œ์•„์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์— ์ ํ•ฉํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค.
  • Spring Data JPA์˜ Repository์˜ ๊ตฌํ˜„์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

JPA ์„ค์ • ๋ฐฉ๋ฒ•

ํ™˜๊ฒฝํŒŒ์ผ ๊ตฌ์„ฑ

์†์„ฑ-1์†์„ฑ-2์„ค๋ช…
databaseJPA๊ฐ€ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ
open-in-view'Open EntityManager in View' ํŒจํ„ด ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ
mapping-resourcesJPAย ๋งคํ•‘ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ
generate-ddlDDL ์ƒ์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜๋Š”ย ์†์„ฑ
defer-datasource-initialization๋ฐ์ดํ„ฐ์†Œ์Šค ์ดˆ๊ธฐํ™”๋ฅผย ์ง€์—ฐ์‹œํ‚ฌ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ
database-platform์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”Œ๋žซํผ์„ย ์ง€์ •ํ•˜๋Š” ์†์„ฑ
show-sqlSQL ์ฟผ๋ฆฌ๋ฅผ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ• ์ง€ย ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ
hibernateํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ด€๋ จย ์„ค์ •์„ ์œ„ํ•œ ์†์„ฑ
ddl-autoDDL ์ž๋™ ์ƒ์„ฑ์ „๋žต์„ย ์„ค์ •ํ•˜๋Š” ์†์„ฑ
use-new-id-generator-mappings์ƒˆ๋กœ์šด ID ์ƒ์„ฑ์ „๋žต์„ ์‚ฌ์šฉํ• ์ง€ย ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ
naming.physical-strategy๋ฌผ๋ฆฌ์  ๋„ค์ด๋ฐ ์ „๋žต์„ ์„ค์ •ํ•˜๋Š”ย ์†์„ฑ
naming.implicit-strategy์•”์‹œ์  ๋„ค์ด๋ฐ ์ „๋žต์„ ์„ค์ •ํ•˜๋Š” ์†์„ฑ
propertieshibernate.default_schema๊ธฐ๋ณธ ์Šคํ‚ค๋งˆ๋ฅผ ์„ค์ •ํ•˜๋Š”ย ์†์„ฑ
hibernate.show_sqlSQL ์ฟผ๋ฆฌ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ• ์ง€ย ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ
hibernate.use_sql_commentsSQL ์ฃผ์„์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š”ย ์†์„ฑ
hibernate.format_sqlSQL ๋ฌธ์„ ํฌ๋งทํŒ…ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š”ย ์†์„ฑ
hibernate.dialect์‚ฌ์šฉํ•  SQL ๋ฐฉ์–ธ์„ ์„ค์ •ํ•˜๋Š”ย ์†์„ฑ

์˜ˆ์‹œ

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/multiflexjpa
    username: localmaster
    password: 1234

  jpa:
    database: postgresql
    open-in-view: false
    hibernate:
      ddl-auto: create # or update, create-drop, validate
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true

ddl-auto

create์„ธ์…˜ ํŒฉํ† ๋ฆฌ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋กญ์„ ์‹คํ–‰ํ•œ ํ›„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
update์„ธ์…˜ ํŒฉํ† ๋ฆฌ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
create-drop์„ธ์…˜ ํŒฉํ† ๋ฆฌ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋“œ๋กญํ•œ ํ›„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์„ธ์…˜ ํŒฉํ† ๋ฆฌ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋“œ๋กญํ•ฉ๋‹ˆ๋‹ค.
validate์„ธ์…˜ ํŒฉํ† ๋ฆฌ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์ด ๋งคํ•‘๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
none์•„๋ฌด ์ž‘์—…๋„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜

https://hoehen-flug.tistory.com/47
https://dbjh.tistory.com/77
https://adjh54.tistory.com/422

profile
๋‹ค์–‘ํ•œ ๊ฒฝํ—˜์„ ์ถ”๊ตฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€