[JPA] JPA 동작 방식 :: 잡다한 프로그래밍
반응형

 

1. JPA란

**JPA(Java Persistence API)**는 자바에서 관계형 데이터베이스를 객체지향적으로 다룰 수 있도록 도와주는 ORM(Object-Relational Mapping) 표준 명세입니다.

즉, 복잡한 SQL 없이도 자바 객체와 데이터베이스 테이블 간의 매핑과 쿼리 작성을 가능하게 해줍니다.

Hibernate, EclipseLink, OpenJPA 등은 JPA의 구현체입니다.
Spring Data JPA는 이 위에 얹혀진 추상화 프레임워크입니다.

 

2. JPA 동작 방식 (PURE JAVA 환경)

1. Persistence가 persistence.xml을 읽고 EntityManagerFactory를 생성

  • EntityManagerFactory는 애플리케이션 전체에서 하나만 생성해야함

2. EntityManagerFactory로부터 EntityManager를 생성

  • EntityManager는 데이터베이스와의 실제 작업을 담당
  • 한 트랜잭션당 하나씩 생성해서 사용 후 반드시 close
  • 스레드간 공유 X

3. EntityTransaction을 통해 트랜잭션 시작 및 종료

[코드 예시]

persistence.xml

<?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="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.user" value="user"/>
            <property name="jakarta.persistence.jdbc.password" value="password"/>
            <property name="jakarta.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>

 

memeber 엔티티

package hellojpa;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Member {

    @Id
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

 

main.java

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {
            Member member = new Member();
            member.setId(1L);
            member.setName("HelloA");
            em.persist(member);

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }

 

[Spring boot 환경 예시]

- persitence.xml에 설정한 내용을 yaml파일로 쉽게 대체 가능하다.

- trasaction 작업을 어노테이션으로 대체 가능하다.

 

application.yaml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/test
    driver-class-name: org.h2.Driver
    username: sa
    password: 
  
  # 기존xml을 yaml 설정으로 대체가능
  jpa:
    hibernate:
      ddl-auto: update 
    show-sql: true
    properties:
      hibernate:
        format_sql: true

 

 

service

@Service
public class MemberService {
    @PersistenceContext
    private EntityManager em;

    @Transactional
    public void createMember() {
        Member member = new Member();
        member.setId(1L);
        member.setName("SpringBootMember");
        em.persist(member);
    }
}
반응형

'프로그래밍 > JPA' 카테고리의 다른 글

[JPA] 필드와 컬럼 매핑  (1) 2025.06.19
[JPA] 데이터베이스 스키마 자동 생성  (0) 2025.06.19
[JPA] 객체와 테이블 매핑  (0) 2025.06.19
[JPA] JPA의 영속성 관리2  (0) 2025.06.10
[JPA] JPA 의 영속성 관리  (0) 2025.06.10

+ Recent posts